任意实参列表
*name 形参接收一个元组,最后一个形参为 **name 形式时,接收一个字典,(*name 必须在 **name 前面)
def cheeseshop(a, *b, **c):
print(a)
for b_item in b:
print(b)
for kw in keywords:
print(kw, ":", keywords[kw])
解包实参列表
函数调用要求独立的位置参数,但实参在列表或元组里时,要执行相反的操作。例如,内置的 range() 函数要求独立的 start 和 stop 实参。如果这些参数不是独立的,则要在调用函数时,用 * 操作符把实参从列表或元组解包出来:
list(range(3, 6)) # normal call with separate arguments
args = [3, 6]
list(range(*args)) # call with arguments unpacked from a list
[3, 4, 5]
同样,字典可以用 ** 操作符传递关键字参数:
def parrot(voltage, state='a stiff', action='voom'):
print("-- This parrot wouldn't", action, end=' ')
print("if you put", voltage, "volts through it.", end=' ')
print("E's", state, "!")
d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised ```
Lambda 表达式(匿名函数)
lambda 关键字用于创建小巧的匿名函数。lambda a, b: a+b 函数返回两个参数的和。Lambda 函数可用于任何需要函数对象的地方。在语法上,匿名函数只能是单个表达式。在语义上,它只是常规函数定义的语法糖。与嵌套函数定义一样,lambda 函数可以引用包含作用域中的变量:
def make_incrementor(n):
return lambda x: x + n # 可理解为冒号前的是函数参数,后面是函数体
f = make_incrementor(42)
f(0) ==> 42
f(1) ==> 43
文档字符串
第一行应为对象用途的简短摘要。
文档字符串为多行时,第二行应为空白行,在视觉上将摘要与其余描述分开。后面的行可包含若干段落,描述对象的调用约定、副作用等。使用
my_function.__doc__ 调用
函数注解
以字典的形式存放在函数的 annotations 属性中,并且不会影响函数的任何其他部分。 形参标注的定义方式是在形参名后加冒号,后面跟一个表达式,该表达式会被求值为标注的值。 返回值标注的定义方式是加组合符号 ->,后面跟一个表达式,该标注位于形参列表和表示 def 语句结束的冒号之间
def f(ham: str, eggs: str = 'eggs') -> str:
print("Annotations:", f.__annotations__)
print("Arguments:", ham, eggs)
return ham + ' and ' + eggs
f('spam')
Annotations: {'ham': <class 'str'>, 'return': <class 'str'>, 'eggs': <class 'str'>}
Arguments: spam eggs
'spam and eggs'
- 函数的默认值参数只计算一次。默认值为列表、字典或类实例等可变对象时,会产生与该规则不同的结果
def f(a, L=[]):
L.append(a)
return L
print(f(1)) # [1]
print(f(2)) # [1,2]
print(f(3)) # [1,2,3]
正确写法为:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L