问题1:我们想编写一个可接受任意数量参数的函数
解决方案:
1、要编写一个可接受任意数量的位置参数的函数,可以使用以*开头的参数
def avg(first, *rest):
""" rest是一个元组 """
return (first + sum(rest)) / (1 + len(rest))
print(avg(2))
print(avg(1, 2, 3))
2.0
2.0
2、要接受任意数量的关键字参数,可以使用开头的参数;
3、如果要函数能同时接受任意数量的位置参数和关键字参数,需要联合使用和*
def anyargs(*args, **kwargs):
print(args) # 元组
print(kwargs) # 字典
注意:
以打头的参数只能作为最后一个位置参数出现;而以*打头的参数只能作为最后一个参数出现
问题2:我们希望函数只通过关键字的形式接受特定的参数
解决方案:将关键字参数位置放在以打头的参数或者是一个单独的之后
def recv(maxsize, *, block):
'Receives a message'
pass
# recv(1024, True) # TypeError: recv() takes 1 positional argument but 2 were given
recv(1024, block=True)
总结:
1、当指定可选参数的时,keyword-only参数方式可读性更高;
2、在有关**kwagrs的技巧中,使用keyword-only参数常常也是可取的。
问题3:将元数据信息附加到函数参数上
def add(x: int, y: int) -> int:
"""
1、注解仅仅是提示的作用;
2、通常只有类和字符串才显得最有意义;
"""
return x + y
问题4:定义带有默认参数的函数:想定义一个函数,其中一个或多个参数是可选的并且带有默认值
注意事项:
1、参数默认值已经在函数定义的时候就确定好了
x = 1
def spam(a, b=x):
print(a, b)
spam(1) # 1,1
x = 2 # 修改变量x的值并没有对函数产生任何效果
spam(1) # 1,1
2、给默认参数赋值的应该总是不可变对象,比如:None, True, False、数字或者字符串。
如果默认参数是个可变的对象,下面示例展示出产生的问题:
def spam(a, b=[]):
return b
x = spam(1)
print(x)
x.append(99) # 修改了返回值得内容
print(x)
print(spam(1)) # [99]
# 解决方案:
def spam(a, b=None):
if b is None: # 不要使用not b的语法(因为'', 0这些都会导致这个条件成立)
b = []
问题5:我们想从函数中返回多个值
解决方案:只要简单的返回一个元组即可
def myfun():
""" 返回了一个元组 """
return 1, 2, 3
网友评论