Python中的生成器
目录
$ 前言
yield
是Python极其重要的一个关键字,它与Python中的生成器
密切相关,然而yield
的用法和生成器
本身时不时让人困惑…
$ 生成器和yield
有什么用
-
大多数情况下,使用
yield
都是为了将函数作为生成器使用(yield
只能在函数中使用) -
当有大量数据需要返回时生成器能够节省内存空间
$ 一些概念
$ 可迭代对象
Python中的任意对象,只要它定义了可以返回一个迭代器的
__iter__
方法,或者定义了可以支持下标索引的__getitem__
方法,那么它就是一个可迭代对象。简单说,可迭代对象就是能提供迭代器的任意对象
$ 迭代器
任意对象,只要它定义了
next
(Python2)或__next__
方法,那么它就是一个迭代器
$ 迭代
用简单的话讲,它就是从某个地方(比如一个列表)取出一个元素的过程。当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代
$ 生成器
$ 概念
生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值
你通过遍历来使用它们,要么用一个"for"循环,要么将它们传递给任意可以进行迭代的函数(比如
next()
)或结构大多数时候生成器是以函数来实现的(当然,类也可以,但函数较为简便)。然而,它们并不返回一个值,而是
yield
(产生)一个值
$ 一些例子
正常思路的斐波那契:
|
|
这么做会使该函数的内存占用随参数max
增大而增加。
生成器类构建的斐波那契:
|
|
生成器函数构建的斐波那契:
|
|
$ 一些关于迭代器的内置函数
next()
获取迭代器的下一个值iter()
以可迭代对象(比如字符串)为参数,返回一个迭代器对象