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

发布于 2021-02-19 16:12:09 字数 3562 浏览 1338 评论 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

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

0 文章
0 评论
84961 人气
更多

推荐作者

醉城メ夜风

文章 0 评论 0

远昼

文章 0 评论 0

平生欢

文章 0 评论 0

微凉

文章 0 评论 0

Honwey

文章 0 评论 0

qq_ikhFfg

文章 0 评论 0

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