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

来源:互联网 发布:lindsey stirling 知乎 编辑:程序博客网 时间:2024/05/04 20:40

http://blog.useasp.net/archive/2014/06/23/the-python-function-or-method-parameter-types.aspx

 

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 位置或者关键字参数
## 这个是Python的默认参数类型
## 示例:arg2提供了默认value
deffunc(arg1, arg2="World!"):
    printarg1, arg2
 
## func可以通过位置参数形式调用
func("Hello","MitchellChu")
 
## 也可以通过关键字参数的形式来调用func
func(arg1="Hello", arg2="World!")
 
## 当然,混合的方式也是完全没有问题的
func("Hello", arg2="World!")
 
## 不过如果你不能将关键字参数优先于位置参数传递给函数(方法)
## 这个调用方法是不能接受的,因为优先级不一样.后面会说
func(arg1="Hello","World!") ## ERROR

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

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

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
## 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

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

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

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
## var-positional parameter
## 定义的时候,我们需要添加单个星号作为前缀
deffunc(arg1, arg2, *args):
    printarg1, 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)

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

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

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
## var-keywords parameter
## 定义的时候,需要两个星号作为前缀
deffunc(arg1, arg2, **kwargs):
    printarg1, 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. 任意数量关键字参数应该放在任意数量位置参数的后面

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

code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
## 各种参数的混合使用例子
## Author: MitchellChu
 
deffunc(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
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 孩子该上四年级了数学差的很怎么办 孩子上三年级了数学成绩好差怎么办 三年级数学老考70-80分怎么办 叛逆期的孩子用死来威胁家长怎么办 叛逆期的孩子抽烟喝酒家长该怎么办 大学遇到不好的老师加课怎么办 两岁的宝宝脾气古怪不听话怎么办 16个月宝宝不听话脾气大怎么办 如果你很害怕去面对一件事怎么办 孩子上幼儿园哭老师不理孩子怎么办 发现幼儿园给孩子吃药片该怎么办 做老师的打学生被家长投诉怎么办 学生认为老师向家长打报告怎么办 老师发打12分的试卷给家长怎么办 孩子在学校顶撞老师不让上学怎么办 被老师骂了不敢去学校怎么办 孩子不爱去幼儿园 总是哭怎么办呢 孩子在幼儿园被老师罚家长该怎么办 孩子不喜欢幼儿园里的体能课怎么办 初中叛逆期的孩子怎么办老师做法 二年级孩子不受老师待见怎么办 孩子该上初中了没学籍怎么办 四个多月的婴儿不喜欢看人怎么办 2个月婴儿不喜欢吃奶粉怎么办 想学习但是又学不进去怎么办 在省外读书 回来读高中学籍怎么办 一岁宝宝这几天不爱吃饭怎么办 2岁的宝宝吃多了怎么办 小孩吃了退烧药吐了怎么办 牙齿与牙齿之间有洞喜欢塞牙怎么办 胃有点烧心天天没食欲不饿怎么办 1岁半宝宝不吃饭光喝奶粉怎么办 一岁半宝宝光喝奶粉不吃饭怎么办 一岁半的宝宝光喝奶粉不吃饭怎么办 两岁半宝宝光喝奶粉不吃饭怎么办 宝宝9个月不好好吃饭奶粉怎么办 2岁半宝宝不愿意自己吃饭怎么办 一周岁多的宝宝不吃饭怎么办 一岁宝宝吃母乳不爱吃饭怎么办 三个月大的宝宝不肯喝奶粉怎么办 自己要上班婆婆带孩子看不惯怎么办