本文重点在于:Python允许函数的嵌套定义,这在有些情况下会带来很多方便。
感谢中国石油大学(华东)计算机与通信工程学院李昕老师提供问题。
假设有个列表,内容如下:
>>> x = list(range(20))
>>> x
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
现在我们想得到一个新列表,其中每个值都是x中元素值加5,这很容易用Python内置函数map()实现,例如:
>>> list(map(lambda i: i+5, x))
[5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
如果我们想看看哪些元素值大于5,可以像下面这样来做:
>>> list(map(lambda i: i>5, x))
[False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
好了,现在我们有个新需求,就是让这个固定的5是可变的,不使用常数,而是改为一个变量,同时保持问题性质不变,这样用起来就更加灵活了。但问题在于map()函数只能接收一个函数和1个或多个序列作为参数,并不能直接满足我们的需求。
当当当当,其实我们这样来做:
>>> def myMap(lst, value):
return map(lambda i: i>value, lst)
>>> list(myMap(x, 5))
[False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
>>> list(myMap(x, 10))
[False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True]
针对上面简单的需求,我们想要的功能已经实现了,如果我们要做的处理过于复杂而无法使用一个lambda表达式来实现,就只好拿出我们的大杀器了:嵌套函数定义。
>>> def myMap(lst, value):
def func(x):
return x>value
return map(func, lst)
让我们试一下好用不好用:
>>> list(myMap(x, 5))
[False, False, False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True]
>>> list(myMap(x, 10))
[False, False, False, False, False, False, False, False, False, False, False, True, True, True, True, True, True, True, True, True]
和我们想要的功能完全一致。