1. 定义函数
>>> def fib(n): # write Fibonacci series up to n
... """Print a Fibonacci series up to n."""
... a, b = 0, 1
... while a < n:
... print(a, end=' ')
... a, b = b, a+b
... print()
在其他语言中,您可能会反对fib
不是一个函数,而是一个过程,因为它不返回值。事实上,即使没有return
语句的函数也会返回一个值,尽管这个值相当枯燥。这个值被称为None
(它是一个内置的名称)。编写值None
通常会被解释器禁止,如果它是唯一写入的值。如果您真的想使用print()
,可以看到它:
2.默认值参数
⚠️导入警告:默认值只计算一次。当默认值是可变对象(如列表、字典或大多数类的实例)时,这会产生不同的效果。例如,以下函数累增在后续调用时传递给它的参数:
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
默认值是指向一个列表对象,程序开始的时候这个列表对象是空。而不是每次调用函数的时候新建一个空列表。
这将会打印
[1]
[1, 2]
[1, 2, 3]
如果不希望在后续调用之间共享默认值,则可以编写如下函数:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
3.关键字参数
在函数调用中,关键字参数必须跟随位置参数。传递的所有关键字参数都必须与函数接受的一个参数相匹配,它们的顺序并不重要。这也包括非可选的参数。任何参数都不能收到超过一次的值。
通常,这些变量参数将是形式参数列表中的最后一个参数,因为它们获取传递给函数的所有其余输入参数。在*args参数之后出现的任何形式参数都是‘只关键字’参数,这意味着它们只能用作关键字而不是位置参数。
>>> def concat(*args, sep="/"):
... return sep.join(args)
...
>>> concat("earth", "mars", "venus")
'earth/mars/venus'
>>> concat("earth", "mars", "venus", sep=".")
'earth.mars.venus'
4 解包参数列表
当参数已经在列表或元组中,但需要为要求单独位置参数的函数调用解包时,就会发生相反的情况。例如,内置range()函数需要独立的开始参数和停止参数。如果它们不能单独使用,则使用*
-操作符编写函数调用,将参数从列表或元组中解包:
>>> list(range(3, 6)) # normal call with separate arguments
[3, 4, 5]
>>> 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 !
5 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
上面的示例使用lambda表达式返回函数。另一个用途是传递一个小函数作为参数:
>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]