Python 特殊语法 filter、map、reduce、lambda、yield

发布于 2021-02-19 16:12:09 字数 3562 浏览 1340 评论 0

Python 内置了一些非常有趣但非常有用的函数,充分体现了 Python 的语言魅力!

filter

filter(function, sequence):对 sequence 中的 item 依次执行  function(item),将执行结果为 True 的 item 组成一个 List/String/Tuple(取决于 sequence 的类型)返回:

>>> def f(x): return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]
>>> def f(x): return x != 'a'
>>> filter(f, "abcdef")
'bcdef'

map

map(function, sequence) :对 sequence 中的 item 依次执行 function(item),见执行结果组成一个List返回:

>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]
>>> def cube(x) : return x + x ...
>>> map(cube , "abcde")
['aa', 'bb', 'cc', 'dd', 'ee']

另外 map 也支持多个 sequence,这就要求 function 也支持相应数量的参数输入:

>>> def add(x, y): return x+y
>>> map(add, range(8), range(8))
[0, 2, 4, 6, 8, 10, 12, 14]

reduce

reduce(function, sequence, starting_value):对 sequence 中的 item 顺序迭代调用 function,如果有 starting_value,还可以作为初始值调用,例如可以用来对List求和:

>>> def add(x,y): return x + y
>>> reduce(add, range(1, 11))
55
(注:1+2+3+4+5+6+7+8+9+10)
>>> reduce(add, range(1, 11), 20)
75
(注:1+2+3+4+5+6+7+8+9+10+20)

lambda

lambda:这是 Python  支持一种有趣的语法,它允许你快速定义单行的最小函数,类似与C语言中的宏,这些叫做lambda的函数,是从LISP借用来的,可以用在任何需要函数的地方:

>>> g = lambda x: x * 2
>>> g(3)
6
>>> (lambda x: x * 2)(3)
6

yield

generator 归根到底是一个函数的返回值,这个函数是包含 yield 关键字的 python 函数。

是不是可以这么说(不是很确定,似乎可以这么理解)

  1. 凡包含 yield 关键字的函数,都返回 generator
  2. generator 不是函数,而是函数执行后构造的对象,是一种 iterator。
  3. generator 可以像 iterator 一样的用。

generator 的根源是 PEP 255,其中列出了 generator 在 Python 存在的原因,简单的讲,Generator 在需要时返回中间值,能够保存当前的状态,等待下一次的返回要求。

xrange/range 的区别或许可以帮我们理解这一点,xrange 之所以存在,是因为 range 需要一次完成列表的初始化,存储等等,从 C 的角度来理解,就是,用 range 等于先 malloc 足够的内存,然后完成值的准备,等待调用(遍历等等)。而 xrange 则不这么干,什么时候要的时候,什么时候给值。所以在 Python 2.x 中,type(range(10)) 是一个 List,是内存中的静态数据;而 type(xrange(10)) 则是一个 range type。

到 Python 3.x,xrange 彻底替代了 range 函数。

这样设计的目的无非就是节省内存 ,千八百数字的无所谓,但 ython 2.x 的 long int 和 Python 3.x 的 Int 是无限制(用官方语言来说就是可以占满内存)。

generator 为了满足这种需求设计的,状态得到了保存,随取随算。

PEP 255 有一句: a Python generator is a kind of Python iterator[1], but of an especially powerful kind.

Python 的产生器就是一种迭代器...

因为它是一种迭代器,所以,他可以用到 for 等控制流中。

def gen():
    print "one"
    yield 1
    print "two"
    yield 2
    print "three"
    yield 3
type(gen)
type(gen())

可以看到 gen 是函数,而 gen() 是 generator,应该说,函数 gen 执行的返回值是生成一个 generator。

generator 的方法之一就是 next()。

a=gen()
a.next()
a.next()
a.next()
a.next()

三次 next,分别返回了 1,2,3,最后一次,已到达末尾,发生 StopIteration 错误。

而 yield 的作用就是,每次发生 next() 调用,函数执行完 yield 语句之后在挂起,这时返回 yield 的值,整个函数状态被保存,等待下一次 next() 调用; 下次 next() 调用发生时,从yield后的语句开始执行(有的 yiled 也在循环体内,未必一定是顺序的),直到再次遇到 yield 为止,然后重复删除动作。

yield 可以解读为返回然后等待。知道所有yield语句完成,这时如果再次调用 next(),则发生 StopIteration 异常,当然,在 for 循环之类的语句中会被自动处理。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

JSmiles

生命进入颠沛而奔忙的本质状态,并将以不断告别和相遇的陈旧方式继续下去。

文章
评论
84963 人气
更多

推荐作者

微信用户

文章 0 评论 0

小情绪

文章 0 评论 0

ゞ记忆︶ㄣ

文章 0 评论 0

笨死的猪

文章 0 评论 0

彭明超

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文