《python编程入门经典》学习笔记第九章(一)

来源:互联网 发布:java中sublist的用法 编辑:程序博客网 时间:2024/05/21 02:51

本章是Python语言的其他特性,主要介绍一些不常用的特性以及一些常用的模块。

9.1 lambda和filter:简单匿名函数

大憨查了lambda的英文意思居然是希腊字母的第11个字母,就是在数学中经常出现的,形如”入”的那个。

python为何引入lambda呢?这本书给出的理由是:有时需要简单的函数调用,这肯能是因为函数不是很通用,或者函数非常特殊,如果在代码中的另外一个位置调用,用法应该完全不同。

为了解决这个问题,python设计了一个特殊的操作lambda。lambda本身不是一个函数,而是一个关键字,它告诉python创建一个函数并在适当的位置使用它,而不是通过一个名称引用它。大憨觉得这非常的奇妙!

为了演示lambda的用法,示例使用filter()函数,它接受一个列表并基于函数中定义的标准移除元素。

例子:虽然可以使用普通的函数实现该某些操作,但是在简单的情况下,比如只想要奇数(或者奇数的元素,或者某些符号开头的字符串)等,一个定义完整的函数就大材小用了。

#! /usr/bin/env pythonfilter_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.  Iffunction 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 pythonfilter_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操作,执行比简单声明语句复杂的一些操作。

本文固定链接:http://www.51bigfool.com/%E3%80%8Apython%E7%BC%96%E7%A8%8B%E5%85%A5%E9%97%A8%E7%BB%8F%E5%85%B8%E3%80%8B%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E7%AC%AC%E4%B9%9D%E7%AB%A0%EF%BC%88%E4%B8%80%EF%BC%89.html



原创粉丝点击