1. lambda

lambda, 即匿名函数,可以理解为跟C语言的宏类似。例如:

>>> max = lambda x, y: x if x > y else y
>>> max(2, 3)
3

而用C语言实现对应的宏就是:

#define max(x, y) ((x) > (y) ? (x) : (y))

注意:

  • lambda的主体必须是单个表达式,而不是一些语句
>>> print2 = lambda x: sys.stderr.write(str(x) + '\n') # <--- YES
>>> print2('Oops')
Oops
5
>>> print2 = lambda x: print(str(x)) # <--- NO (because print() uses lambda actually)
>>> print2('Oops')
Oops
>>>
  • 为了可读性,不要使用嵌套的lambda。例如:
>>> ((lambda x: (lambda y: x + y ** 2))(99))(3) # <--- BAD style
108
>>>

2. map

程序对列表(list)和其他序列常常要做的一件事就是对每一个元素进行一个操作并把结果集合起来。例如:

>>> l1 = [1, 3, 5, 7, 9]
>>> l2 = []
>>> for i in l:
... j = i ** 2
... l2.append(j)
...
>>> l2
[1, 9, 25, 49]
>>>

这时,Python提供的内置函数map()就派上用场了。map()函数会对一个序列对象中的每一个元素应用被传入的函数,并且返回一个包含了所有函数调用结果的一个列表。例如:

>>> l1 = [1, 3, 5, 7, 9]
>>> l2 = list(map(lambda x: x ** 2, l1))
>>> l2
[1, 9, 25, 49, 81]
>>>

map()还支持操作多个序列,例如:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> def xadd(a, b):
... return (a + b) ** 2
...
>>> xadd(1, 4)
25
>>> xadd(2, 5)
49
>>> xadd(3, 6)
81
>>> l3 = list(map(xadd, l1, l2))
>>> l3
[25, 49, 81]
>>>
>>> l1 = [0x1, 0x3, 0x5, 0x7, 0x9]
>>> l2 = [0x2, 0x4, 0x6, 0x8, 0xa]
>>> l3 = [0x5, 0x4, 0x3, 0x2, 0x1]
>>> l4 = list(map(lambda x, y, z: x + z - y, l1, l2, l3))
>>> l4
[4, 3, 2, 1, 0]
>>>

3. filter

函数filter(func, list)对list的每一个元素都执行函数func(), 若结果为真,则保存那个元素。例如:

>>> def is_odd(n):
... if n % 2 == 1:
... return True
... else:
... return False
...
>>> l1 = [1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> l2 = list(filter(is_odd, l1))
>>> l2
[1, 3, 5, 7, 9]
>>>

4. reduce

list = [x1, x2, x3, ...], reduce(func, list)表示把函数func()作用在list上,函数func()必须接收两个参数,reduce把结果继续和list的下一个元素做累积计算,其效果就是:

reduce(func, [x1, x2, x3]) = func(func(x1, x2), x3)

例如:

>>> l = [47, 11, 42, 13]
>>> n = reduce(lambda x, y: x + y, l)
>>> n
113
>>>

上面的例子用图表示为:

注意: 在Python3中,reduce()不再是一个内置函数,而是被放到了模块functools中。

$ python3
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
...<snip>...
>>> import functools
>>> l = [47, 11, 42, 13]
>>> n = functools.reduce(lambda x, y: x + y, l)
>>> n
113

参考资料:

[Python学习笔记-002] lambda, map, filter and reduce的更多相关文章

  1. Python学习笔记:lambda表达式

    lambda表达式:通常是在需要一个函数,但又不想去命名一个函数的时候使用,即匿名函数. 示例如下: add = lambda x,y : x+ y add(1,2) # 结果为3 1.应用在函数式编 ...

  2. Python学习笔记002

    字符编码:把二进制字符翻译成字符 ASCII码表    256    一个字节,8个比特 支持中文: GB2312 GBK1.0 GB18030 BIG5(台湾) unicode UTF-8 开头定义 ...

  3. python的高阶函数(map,filter,sorted,reduce)

    高阶函数 关注公众号"轻松学编程"了解更多. 1.MapReduce MapReduce主要应用于分布式中. 大数据实际上是在15年下半年开始火起来的. 分布式思想:将一个连续的字 ...

  4. Python学习笔记—Python基础1 介绍、发展史、安装、基本语法

    第一周学习笔记: 一.Python介绍      1.Python的创始人为吉多·范罗苏姆.1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...

  5. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

  6. Python学习笔记之map、zip和filter函数

    这篇文章主要介绍 Python 中几个常用的内置函数,用好这几个函数可以让自己的代码更加 Pythonnic 哦 1.map map() 将函数 func 作用于序列 seq 的每一个元素,并返回处理 ...

  7. Python学习笔记010——匿名函数lambda

    1 语法 my_lambda = lambda arg1, arg2 : arg1 + arg2 + 1 arg1.arg2:参数 arg1 + arg2 + 1 :表达式 2 描述 匿名函数不需要r ...

  8. Python学习笔记(八)

    Python学习笔记(八): 复习回顾 递归函数 内置函数 1. 复习回顾 1. 深浅拷贝 2. 集合 应用: 去重 关系操作:交集,并集,差集,对称差集 操作: 定义 s1 = set('alvin ...

  9. Python学习笔记之函数

    这篇文章介绍有关 Python 函数中一些常被大家忽略的知识点,帮助大家更全面的掌握 Python 中函数的使用技巧 1.函数文档 给函数添加注释,可以在 def 语句后面添加独立字符串,这样的注释被 ...

随机推荐

  1. 广搜 迷宫(zznu 1962)

    http://acm.zznu.edu.cn/problem.php?id=1962 题目描述 在很多 RPG (Role-playing Games) 游戏中,迷宫往往是非常复杂的游戏环节.通常来说 ...

  2. java基本数据类型与封装类型详解(int和Integer区别)

    int是java提供的8种原始数据类型之一. Java为每个原始类型提供了封装类,Integer是java为int提供的封装类(即Integer是一个java对象,而int只是一个基本数据类型).in ...

  3. Java方法、构造方法的重载;创建对象;调用方法

    方法的重载 概念:多个同名但是不同参数的方法称为方法的重载 作用:编译器会根据调用时传递的实际参数自动判断具体调用的是哪个重载方法 特点:方法名相同:同一作用域:参数不同:数量不同 类型不同 顺序不同 ...

  4. POJ3111 K Best 2017-05-11 18:12 31人阅读 评论(0) 收藏

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 10261   Accepted: 2644 Case Time ...

  5. bootstrap2.2登录验证

    <!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...

  6. zoj3820

    题意:给定一个树,找出两个点,使得其他点到最近的点的距离最小 思路: 牡丹江站的B题..可惜当时坑的不大对,最后也没写完.. 1.题解方法: 基于一个结论,答案一定在直径上(证明我不会).. 那么,可 ...

  7. MCU_头文件编写

    头文件中一般放一些重复使用的代码,如:常量.变量.宏等的定义,函数的声明.当使用#include语句引用头头文件时,相当于将头文件中的内容复制到#include处. 头文件一般形式: #ifndef  ...

  8. FastReport自动换行及行高自适应

  9. Android-Lock-多线程通讯(生产者 消费者)&等待唤醒机制

    此篇博客以 生产面包

  10. 【转】老左常用国内/国外VPS推荐

    原文:http://www.laozuo.org 老左从使用虚拟主机到VPS,至今也用过不少的商家产品,比如在"TOP10美国虚拟主机/网站空间推荐"有分享目前和曾经使用的虚拟主机 ...