成为Python大牛必须要掌握的高端语法——yield

  • 时间:
  • 浏览:0

首先,使用yield语法的生成器最主要的1个多优势如果极其省内存。类似于 上述1个多迭代过程,同样是遍历输出0-4这哪几个元素,使用列表的土法律最好的办法才能 构建出1个多长度为5的数组并存储在内存中,而使用生成器的土法律最好的办法只才能 1个多index变量即可实现,这还是迭代元素较少的情况表下,或者迭代的是30万甚至30万个元素时,列表的土法律最好的办法就才能 构建1个多长度为30万或者30万的数组,这时对于内存的使用如果非常大的负担了,而使用生成器的土法律最好的办法,无论是迭代30万还是30万个元素,依然只才能 1个多index变量即可实现。

上述代码的输出结果如下:

在介绍yield语法前一天,首不能自己向大伙说明Python中的迭代(iteration)、可迭代(iterable)、迭代器(iterator)以及生成器(Generator)的概念:

斐波那契数列是一道经典的算法题,也是系统进程池池员面试时时不后该被问到的一道题。斐波那契数列的如果1个多形如1, 1, 2, 3, 5, 8, ……的数列,从第三项刚开使,每一项都等于前两项之和。使用Python来实现1个多计算斐波那契数列的典型函数如下:

这人 函数通过1个多名为fib_list的数组存储生成的前n个斐波那契数,最后一次性返回整个数组。其中a, b = b, a + b是Python的1个多特色用法,用于快速交换1个多数,大约:

让大伙来运行测试一下这人 按行读取文件内容的生成器:

这人 函数接受1个多int类型的参数,分别为数组的刚开使和刚开使,每个数之间间隔为1,大伙还还才能通过增加1个多参数来指定1个多数之间的间隔,实现函数更高的灵活性:

或者生成器的土法律最好的办法是即用即计算的,即迭代到对应的元素时,这人 元素才相应的计算生成出来,而列表的土法律最好的办法才能 在迭代刚开使前就构建出整个迭代数组,这在这人情况表下还才能极大地节省计算时间。类似于 下面这段代码:

这里使用with语法来读取文件,这是Python 3推荐的土法律最好的办法。file.readline()函数每次返回一行内容,或者返回的内容带有每行结尾的换行符,或者通过line.strip(‘ ’)将换行符过滤掉。每次通过yield返回一行内容前一天,再次通过file.readline()函数获取下一行内容,直到整个文件被删改迭代。

4

我手一杯 品尝你的美

塞纳河畔 左岸的咖啡

这四者之间的关系或者会稍微这人混乱,再给大伙简单的总结一下:生成器是五种特殊的迭代器,而迭代器又是五种特殊的可迭代对象,可迭代对象如果还才能执行迭代操作也如果还才能通过for循环来遍历的对象。

输出结果符合大伙的预期,现在通过yield语法来将大伙这人人DIY的range函数改造成1个多生成器:

2

6

大伙首先构造1个多返回给定范围数组的函数:

《告白气球》的歌词就一行一行的输出到屏幕上了,或者歌词行数不多,或者这边只复制出前三行给大伙演示结果。

迭代器也是五种可迭代对象,与普通的可迭代对象的区别在于,迭代器内部内部结构实现了next函数用来生成每次迭代循环才能 返回的元素。而最后的生成器则又是五种特殊的迭代器,具体体现上如果使用yield语法的函数,讲到这里就提到了yield语法,总的来说yield如果用来产生1个多生成器的语法,类似于 将上述的迭代过程修改为生成器土法律最好的办法还才能1个多多写:

看过上述1个多迭代过程,大伙或者这人问題,使用yield改造成生成器土法律最好的办法的代码看起来比简单的迭代1个多列表的土法律最好的办法要复杂这人,没有1个多多写有那此优势呢?

让大伙来测试运行一下这人 通过yield语法实现的斐波那契数列生成器:

上述代码的my_generator()即返回了1个多生成器对象,每次循环时执行到yield处即返回当时的index的值,到下一次循环时将从上次返回的yield处继续执行,直到index的值不满足小于5的条件时刚开使整个函数,此时也刚开使了对这人 生成器的迭代过程。

大伙先来运行测试一下这人 range函数:

上述代码的输出结果如下:

参考前一天DIY的range函数的写法,将这人 计算斐波那契数列的函数通过yield语法修改为生成器:

这段代码中,实际的迭代过程只进行到第10个元素即退出了整个循环,或者在迭代刚开使前,依然要计算30万次来生成迭代列表,这就造成了多量的计算和内存资源。而或者通过生成器重写该迭代过程一句话:

生成器在迭代刚开使前不须会计算出所有才能 迭代的值,不到用到时才会计算相应的值并返回,或者上述代码的index将只会计算到10即刚开使了整个迭代过程,防止了计算和内存资源的浪费。

迭代是五种对数据的操作,类似于 针对1个多list逐一获取其中的元素的过程就叫做迭代。而可迭代是对象的五种价值形式,迭代操作不到针对拥有可迭代价值形式的对象进行,常见的可迭代对象包括数组、元组、字典等数据集合,下面代码给大伙演示了1个多基本的迭代过程:

3. yield语法示例1:DIY1个多range函数

本文福利:私信小编【PDF】可获取小编精心埋点的电子书一套

留下唇印 的嘴

……

5. yield语法示例3:斐波那契数列

5

3

4. yield语法示例2:读取文件--《告白气球》

1

还才能看过,从第三项刚开使的每一项删改都在前两项的和,1个多多的输出结果如果大伙要的斐波那契数列。

改造起来也非常简单,首先将定义的用来存储迭代元素的列表删除,或者将1个多多换成元素到列表中的代码改造成yield start即可,1个多多大伙就这人人DIY了1个多简易的、基于生成器实现的range函数。

迭代器也是五种可迭代对象,与普通的可迭代对象的区别在于,迭代器内部内部结构实现了next函数用来生成每次迭代循环才能 返回的元素。而最后的生成器则又是五种特殊的迭代器,具体体现上如果使用yield语法的函数,讲到这里就提到了yield语法,总的来说yield如果用来产生1个多生成器的语法,类似于 将上述的迭代过程修改为生成器土法律最好的办法还才能1个多多写:

对应的输出结果为:

2. 为那此要使用yield

2

1. 那此是yield

1

Python自带的range函数还才能产生1个多可迭代对象,常用于for循环中,在Python 2中range函数生成的是1个多列表,而在Python 3中range函数生成的是1个多生成器。现在让大伙来通过yield语法DIY1个多这人人的range生成器吧!

.在学习带有迷茫不知要怎样学习的大伙小编推荐1个多学Python的学习q u n   227  -435-  430还才能来了解一块儿进步一块儿学习!免费分享视频资料

生成器除了还才能用于计算生成数字元素外,在IO读取方面才能起到很大作用,类似于 在读取1个多超大文件,或者查询某个返回结果超多的数据库时,使用通过yield语法构造的生成器来完成读取操作还才能很大程度上降低系统进程池池对于内存的占用。

类似于 大伙1个多多名为my_file.txt的文件,后边存储了周董的《告白气球》的歌词,现在大伙还才能通过yield语法来构造1个多生成器用于一行一行的读取每一句歌词: