python函数

196 阅读2分钟

任意实参列表

*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