Python函数的各种参数(含星号参数)

Python中函数的有4种形式,分别是:

  1. 位置或关键字参数(Positional-or-keyword parameter)
  2. 仅位置的参数(Positional-only parameter)
  3. 任意数量的位置参数(var-positional parameter)
  4. 任意数量的关键字参数(var-keyword )

第一种:位置或关键字参数

这种参数是中默认的参数类型,定义这种参数后,可以通过位置参数,或者关键字参数的形式传递参数:

## 位置或者关键字参数
## 这个是Python的默认参数类型
## 示例:arg2提供了默认value
def func(arg1, arg2="World!"):
    print arg1, arg2

## func可以通过位置参数形式调用
func("Hello", "MitchellChu")

## 也可以通过关键字参数的形式来调用func
func(arg1="Hello", arg2="World!")

## 当然,混合的方式也是完全没有问题的
func("Hello", arg2="World!")

## 不过如果你不能将关键字参数优先于位置参数传递给函数(方法)
## 这个调用方法是不能接受的,因为优先级不一样.后面会说
func(arg1="Hello", "World!") ## ERROR

 第二种方式:仅适用位置参数的形式

这种形式在需要将参数传递给函数(方法)时,仅能通过位置参数的传递方式。这种形式对于Python的开发者来说,暂时并没有办法使用。这种形式现在仅存在Python的很多内建的函数上:

## Positional-only parameter has no syntax to define
## 虽然无定义方法,但内建的很多函数都是仅接受位置参数的
abs(-3) ## correct
abs(a=3) ## wrong

## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: abs() takes no keyword arguments


pow(x=2,y=3)
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: pow() takes no keyword arguments

pow(2,3)
## 8

 第三种:任意数量的位置参数(带单个

任意数量的位置参数在定义的时候是需要一个星号前缀来表示,在传递参数的时候,可以在原有参数的后面添加任意多个参数,这些参数将会被放在元组内提供给函数(方法):

## var-positional parameter
## 定义的时候,我们需要添加单个星号作为前缀
def func(arg1, arg2, *args):
    print arg1, arg2, args

## 调用的时候,前面两个必须在前面
## 前两个参数是位置或关键字参数的形式
## 所以你可以使用这种参数的任一合法的传递方法
func("hello", "Tuple, values is:", 2, 3, 3, 4)

## Output:
## hello Tuple, values is: (2, 3, 3, 4)
## 多余的参数将自动被放入元组中提供给函数使用

## 如果你需要传递元组给函数
## 你需要在传递的过程中添加*号
## 请看下面例子中的输出差异:

func("hello", "Tuple, values is:", (2, 3, 3, 4))

## Output:
## hello Tuple, values is: ((2, 3, 3, 4),)

func("hello", "Tuple, values is:", *(2, 3, 3, 4))

## Output:
## hello Tuple, values is: (2, 3, 3, 4)

第四种:任意数量的关键字参数(带两个星号参数)

任意数量的关键字参数在定义的时候,参数名称前面需要有两个星号(**)作为前缀,这样定义出来的参数,在传递参数的时候,可以在原有的参数后面添加任意多个关键字参数,关键字参数是使用[参数名称=参数值]的形式进行传递:

## var-keywords parameter
## 定义的时候,需要两个星号作为前缀
def func(arg1, arg2, **kwargs):
    print arg1, arg2, kwargs

func("hello", "Dict, values is:", x=2, y=3, z=3)

## Output:
## 多余的参数将自动被放入字典中提供给函数使用

## 如果你需要直接传递字典给函数
## 你需要在传递的过程中添加**
## 此时如果还有关键字参数应在字典前提供完成
## 不能在字典后再提供
## 请看下面例子中的输出差异:

func("hello", "Dict., values is:", **{'x':2, 'y':3, 'z':3})
## hello Dict., values is: {'y': 3, 'x': 2, 'z': 3}

func("hello", "Dict., values is:", **{'x':2, 'y':3, 'z':3,})
## hello Dict., values is: {'y': 3, 'x': 2, 'z': 3}

func("hello", "Dict., values is:", {'x':2, 'y':3, 'z':3})
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: func() takes exactly 2 arguments (3 given)

func("hello", "Dict., values is:", s=3, **{'x':2, 'y':3, 'z':3,})
## hello Dict., values is: {'y': 3, 'x': 2, 's': 3, 'z': 3}

## 提供了重复的参数
func("hello", "Dict., values is:", y=3, **{'x':2, 'y':3, 'z':3,})
## Traceback (most recent call last):
##   File "<stdin>", line 1, in <module>
## TypeError: func() got multiple values for keyword argument 'y'

 总结:四种参数形式中仅有第二种Python没有提供定义的方法,其他三种在定义的时候也需要注意,定义的时候应该根据Python的解析规律进行定义,其中:

  1. 位置或关键字参数应该在最前面,其中,没有默认值的应该在有默认值的参数前面
  2. 任意数量位置参数应该放在所有位置或关键字参数的后面
  3. 任意数量关键字参数应该放在任意数量位置参数的后面

注意:任意数量位置参数和任意数量关键字参数只能在定义中定义一次。

## 各种参数的混合使用例子
## Author: MitchellChu

def func(arg1, arg2='default', *args, **kwargs):
    print "arg1=%s, arg2=%s, args=%s, kwargs=%s" % (arg1, arg2, args, kwargs)


func(1) ## correct
func(1,2) ## correct
func(1,2,3,4) ## correct
func(1,2,3,4,x=1,y=2) ## correct
func(1,2,x=1) ## correct

func(x=1) ## wrong
func(arg1=1) ## correct
func(1,x=1) ## correct

## 可以将例子保存到parameter.py文件
## 而后运行python /path/to/parameter.py

 

Monday, June 23, 2014 | 编程语言

文章评论

  • # re: Python函数的各种参数(含星号参数)
    终于搞明白了两个星号和一个星号啥东西了
  • # re: Python函数的各种参数(含星号参数)
    • 3
    • 10/16/2015 7:41 PM
    sb
  • # re: Python函数的各种参数(含星号参数)
    不知道何处得罪楼上,莫名跑来这里开骂,没必要吧?
    本人仅是菜鸟一枚,如果是技术内容不对,欢迎讨论。要撕,请绕道!
  • # re: Python函数的各种参数(含星号参数)
    • 6
    • 11/3/2015 2:45 PM
    6
  • # re: Python函数的各种参数(含星号参数)
    学习了
  • # re: Python函数的各种参数(含星号参数)
    受用了
  • # re: Python函数的各种参数(含星号参数)
    楼主不必在意那些喷子,学习了,python新手一枚
  • # re: Python函数的各种参数(含星号参数)
    • m0o
    • 3/11/2016 10:40 AM
    看了廖雪峰大大的那个参数 里面还有一种是命名关键字参数 形式如下
    def info(name,age,*,city)
    print(name,age,city)
    info('lili',45,city='shanghai')
    但是我测试2.7 3.4版本均报错

    SyntaxError: invalid syntax
    博主可否知道 ?
  • # re: Python函数的各种参数(含星号参数)
    @m0o:
    是3.x的语法.你可以用python --version查看你的版本,确认是否是3.x。关于此方法可以参见:https://www.python.org/dev/peps/pep-3102/
  • # re: Python函数的各种参数(含星号参数)
    • hcs
    • 6/14/2016 2:49 PM
    非常感谢受教了!
  • # re: Python函数的各种参数(含星号参数)
    为什么最后一个例子提示错误
    行 1: 未预期的符号 `(' 附近有语法错误
    行 1: `def func (arg1,arg2='default',*args,**kwargs):'
  • # re: Python函数的各种参数(含星号参数)
    @whh10010:
    这个报错很模糊,仅给出这么一句,也是不清楚你这是什么问题呢。可以尝试给出具体环境和上下文。

发表评论

Please add 5 and 2 and type the answer here:

关于博主

  一枚成分复杂的网络IT分子,属于互联网行业分类中的杂牌军。