本章是Python语言的其他特性,主要介绍一些不常用的特性以及一些常用的模块。
9.1 lambda和filter:简单匿名函数
大憨查了lambda的英文意思居然是希腊字母的第11个字母,就是在数学中经常出现的,形如”入”的那个。
python为何引入lambda呢?这本书给出的理由是:有时需要简单的函数调用,这肯能是因为函数不是很通用,或者函数非常特殊,如果在代码中的另外一个位置调用,用法应该完全不同。
为了解决这个问题,python设计了一个特殊的操作lambda。lambda本身不是一个函数,而是一个关键字,它告诉python创建一个函数并在适当的位置使用它,而不是通过一个名称引用它。大憨觉得这非常的奇妙!
为了演示lambda的用法,示例使用filter()函数,它接受一个列表并基于函数中定义的标准移除元素。
例子:虽然可以使用普通的函数实现该某些操作,但是在简单的情况下,比如只想要奇数(或者奇数的元素,或者某些符号开头的字符串)等,一个定义完整的函数就大材小用了。
#! /usr/bin/env python
filter_me = [1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,29]
result = filter(lambda x: x%2 == 0, filter_me)
print(*result)
大憨注:这样说来lamba貌似和C中的内联函数相似了。
注意上面例子的最后一个语句,打印变量resualt时,用的是*result。为什么呢?本书没有给出原因。有疑问的地方就是会有进步的地方,不能放弃。先help(filter)看看吧。
Return those items(元素) of sequence(一个序列) for which function(item) is true. If
function is None, return the items that are true. If sequence is a tuple(元组)
or string, return the same type, else return a list(列表).
翻译:filter()函数返回序列中符合条件函数要求的元素。如果条件函数是空函数,返回是真的元素。如果序列的类型是元组或
者字符串,返回类型也是元组或者字符串,否则默认返回类型的是列表。
疑问:而对列表的使用,貌似直接打印就可以啊?
如果不加*使用print(result)就会出现以下错误:
<filter object at 0xb6d7ff6c>
这些是什么原因呢?大憨在试验中发现,自己的IDE使用的是python3.2的版本,在终端中直接输入的是python默认调用的是2.7.3版的。用2.7的版本如果使用print(reult)不会报错,能得出正确的结果。如图:
大憨疑问:这难道是python3.0的新特性?????
由于缺少名称,lambda创建的函数被称为匿名函数。然而,可以使用lambda语句的结果给函数绑定一个名称。该名称只在创建名称的作用域内可用。例子:
#! /usr/bin/env python
filter_me = [1,2,3,4,5,6,7,8,9,10,11,12,13,15,16,29]
func = lambda x: x%2 == 0
result = filter(func, filter_me)
print(*result)
注意:lambda只能是一个简单函数,并且不能包含其他语句,像if…: elsif …: else:,甚至不能给变量创建新的名称。在lambda内部,只能执行有限的操作比如测试相等性、将两个数相乘或者以特定的方式使用其他已经存在的函数,还可以通过使用and和or操作,执行比简单声明语句复杂的一些操作。