你以为你以为的就是你以为的吗?

1、序
看教程的时候小红一路膨胀,很简单嘛~直到实战的时候看到了
param.kind != inspect.Parameter.VAR_POSITIONAL and \
param.kind != inspect.Parameter.KEYWORD_ONLY and \
param.kind != inspect.Parameter.VAR_KEYWORD
小红:对不起,妈妈!我以后会好好看教程的。
以前遇到的函数参数都是瞥一眼,分为两类:必填和选填。必填项是用来唯一标识函数的,选填项就是拥有默认参数的富二代还有神出鬼没(mei)的可变参数。其实看到python里动不动就从**kw取键值对的时候,我的内心是有一丝动摇的,现在的富二代都这么夸张,都不需要明文声明一下(像默认参数那样搞个等号,或者可变参数那样搞几个点点。喂!这不是C++!)?真的不需要,有钱(python对于函数参数的约定,约定那可就是基因增强了)真的就可以为所欲为啊。
2、位置参数
必填参数,至于为啥要叫positional variate,可能是因为这部分参数是用来告诉调用者需要在哪个位置传入什么参数的。
python中没有重载,也不需要重载,所以跟之前认识的必填项的作用还是不太一样的。
示例:x就是位置参数。
def power(x):
return x * x
3、默认参数
可以通过给函数的一些参数给定默认值,有两个用处:
- 偷懒,大部分情况下都一样的参数写成默认参数,可以少写一个丫
- 接口新加参数的时候用这种方式可以保证原有的调用不需要修改
示例:
def power(x, n=2):
s = 1
while n > 0:
n = n - 1
s = s * x
return s
# 输出
>>> power(5)
25
>>> power(5, 2)
25
4、可变参数
这个可变参数和其他语言的可变参数的用处没有什么不一样,就是表示方式变化了一下。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
# 调用和输出
>>> calc(1, 2)
5
>>> calc()
0
在参数前面加上*号就可以将参数看作可变的,函数内部把参数当成一个tuple来使用即可。
此外,在list或tuple前面加上*可以将其变成可变参数,从而方便传给函数。
>>> nums = [1, 2, 3]
>>> calc(*nums)
14
5、关键字参数
快看,这个就是那个带土豪基因的家伙!
这个大概就是python不需要函数重载的重要武器吧,超厉害哦~
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
# 调用和输出
>>> person('Michael', 30)
name: Michael age: 30 other: {}
>>> person('Bob', 35, city='Beijing')
name: Bob age: 35 other: {'city': 'Beijing'}
>>> person('Adam', 45, gender='M', job='Engineer')
name: Adam age: 45 other: {'gender': 'M', 'job': 'Engineer'}
土豪就是上面那个样子的。可以超级嗨皮地传键值对进去,python只负责把参数组装成dict,调用者可以用这个参数来说悄悄话啦。
6、命名关键字参数
上面的关键字参数的key可以是任意值,调用者随便传啥都可以。如果要对传入的key进行限制,可以使用如下写法:
def person(name, age, *, city, job):
print(name, age, city, job)
# 调用和输出
>>> person('Jack', 24, city='Beijing', job='Engineer')
Jack 24 Beijing Engineer
这个用法的专业名称叫做“命名关键字参数”,使用*分隔分隔,*后面的参数被视为“命名关键字参数”。定义成命名关键字参数的参数
- 调用的时候必须传入参数名。
- 可以有默认值。
>>> person('Jack', 24, 'Beijing', 'Engineer')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: person() takes 2 positional arguments but 4 were given
def person(name, age, *, city='Beijing', job):
print(name, age, city, job)
# 调用和输出
>>> person('Jack', 24, job='Engineer')
Jack 24 Beijing Engineer
7、函数参数使用的注意事项
参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字、关键字参数
示例:
def f2(a, b, c=0, *, d, **kw):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
# 调用和输出
>>> f2(1, 2, d=99, ext=None)
a = 1 b = 2 c = 0 d = 99 kw = {'ext': None}
虽然是自家人,命名关键字和关键字参数的顺序也不是随便来的,好多爸妈会比较宠小的那个。
def f3(a, b, c=0, **kw, *, d):
print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)
# 调用和输出
>>> f3(1, 2, ext=None, d=99)
def f3(a, b, c=0, **kw, *, d):
^
SyntaxError: invalid syntax
本文详细介绍了Python函数参数的种类,包括位置参数、默认参数、可变参数、关键字参数和命名关键字参数。位置参数是必填项,用于唯一标识函数;默认参数可以提供便利,避免重复输入;可变参数允许接收不定数量的参数;关键字参数允许以键值对形式传递参数,提供了更大的灵活性;命名关键字参数则限制了关键字的范围,确保调用时的参数顺序。文章强调了参数定义的顺序规则,并提醒注意命名关键字和关键字参数的使用细节。
707

被折叠的 条评论
为什么被折叠?



