
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
3.4.1 匿名函数lambda
匿名函数lambda属于函数式编程的范畴,但是Python不是天生的函数式编程语言。虽然Python不适合函数式编程,但是匿名函数lambda具备的迅速命名函数的功能可以使代码更加简洁。首先来看看如何定义一个一般函数和匿名函数lambda,代码如下:

输出结果:

可见,对于这种只有一行的函数非常适合用匿名函数lambda来编写,因为使用匿名函数lambda编写的代码只占一行,十分简明,而且调用方式和普通的用def和return语句定义的函数一样。
匿名函数不会在任何空间里创建名字,所以可以节省大量内存。匿名函数lambda的使用示例如下:

调用方式如下:

输出结果:

Python函数式编程还拥有3个内建函数,即filter()、map()、reduce(),分别用于过滤、映射、迭代。先来看filter()过滤器的源代码:

原理是当if bool_func(eachItem)被判为True时,将eachItem加入新的filtered_seq列表中,否则舍去。bool_func是过滤法则;seq是传入列表;filtered_seq是传出列表。下面的示例是先产生一个较大的随机数集合,然后过滤所有的偶数,留下奇数,代码如下:

输出结果:

上述代码打印的是所在的地址,其作用实际上和下面这段代码的作用一样:

输出结果:

map()是映射函数,大致的源代码如下:


其中,func是映射规则;seq是传入的原列表;mapped_seq是返回后的映射内容,可用于创建哈希表(字典)。
reduce()是迭代器,也被称为“折叠”,源代码如下:

具体的示例代码如下:

输出结果:
