python函数式生成器的简单介绍

Python 函数 - 返回生成器如果函数要返回一系列结果,我们常见的方法就是将结果放到一份列表中,然后返回给调用者 。比如下面的函数 , 返回字符串中每个单词的首字母在真个字符串中的索引:
运行结果:
上述的结果完全符合我们的预期,但get_word_index函数不够简洁 。下面我们尝试使用生成器来实现:
运行结果:
改写之后,不仅运行结果符合要求,由于不需要和result列表交互,函数也变得非常简洁 。下面我们就来详细学习下生成器吧~
生成器是指使用yield表达式的函数,调用生成器函数时 , 它并不会真的运行,而是会返回迭代器 。每次在这个迭代器上面调用内置的next函数时,迭代器就会把生成器推进到下一个yield表达式那里 。生成器传给yield的值均会由迭代器返回给调用者 。
此外,如果输入量非常大,使用列表作为返回值,那么程序就有可能耗尽内存并崩溃 。相反,使用生成器之后 , 则可以应对任意长度的输入数据 。
例如,下面这个生成器函数可以获取文件中单词的索引,而不管文件内容多大,该函数执行时消耗的内存,只由单行的文本长度决定:
其中 test_generator.txt 中的内容如下:
运行结果:
下面这句话特别重要: 生成器函数返回的迭代器,是由状态的,及调用者不应该反复使用它。我们那word_index_iter来说明:
如果想重复调用,请将其封装成容器:
运行结果:
关于上述自定义容器的实现原理,我的另外一篇文章做了详细介绍,链接奉上:
Python生成器简介 Python 中的 yield 关键字鲜为人知,但是作用却很大,正是因为有了yield,才有了Python生成器 。
yield 是 Python 的关键字,它用于 从函数返回而不破坏其局部变量的状态,并且在调用该函数时 , 从最后一个 yield 语句开始执行 。任何包含 yield 关键字的函数都称为生成器 。
Python 中的 yield 关键字的作用类似于 Python 中的 return 语句 , 不同之处在于:
yield的优点
yield的缺点
Python 可以使用 括号() 创建生成器
更多时候,我们使用 yield 关键字创建生成器
下面这个生成器 , 前4次调用它时,返回的是0-3这几个特殊值,第5次调用它时返回一个10-20之间的随机整数 。
更多时候,生成器可以返回无限的值 。
注意 generator() 函数返回的是一个生成器对象,要想获取它的值,可以像上面那样在迭代器中取出它的值,我们也可以显式的调用next函数获取值 。
Python | yield Keyword - GeeksforGeeks:
如何更好地理解Python迭代器和生成器Python这门语言中,生成器毫无疑问是最有用的特性之一 。与此同时,也是使用的最不广泛的Python特
性之一 。究其原因 , 主要是因为,在其他主流语言里面没有生成器的概念 。正是由于生成器是一
个“新”的东西,所以,它一方面没有引起广大工程师的重视 , 另一方面 , 也增加了工程师的学习成本,
最终导致大家错过了Python中如此有用的一个特性 。
我的这篇文章 , 希望通过简单易懂的方式,深入浅出地介绍Python的生成器 , 以改变“如此有用的特性却
使用极不广泛”的现象 。本文的组织如下:在第1章,我们简单地介绍了Python中的迭代器协议;在本文
第2章,将会详细介绍生成器的概念和语法;在第3章 , 将会给出一个有用的例子,说明使用生成器的好
处;在本文最后,简单的讨论了使用生成器的注意事项 。

推荐阅读