解读python3.7教程(三)——函数、参数、 Lambda表达式

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')]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值