微信
手机版
网站地图

成为Python大牛必需要把握的高端语法——yield(文末附赠教程)

2019-03-27 15:50:42 投稿人 : admin 围观 : 177 次 0 评论
成为Python大牛必需求把握的高端语法——yield(文末附赠教程)

成xiannuhu为Python大牛必需求把握的高端语法——yield

1. 什么达利芙小鲜是yield

在介绍yield语法之前,首要要向咱们阐明Python中的迭代(iteration)、可迭代何易于挽舟(iter美少女之恋able)、迭代器(iterator)以及生成器(Generator)的概念:

迭代是一种对数据的操作,例如针对一个list逐个获取其间的元素的进程就叫做迭代。而可迭代是目标的一种特性,迭代操作只能针对具有可迭代特性的目标进行,常见的可迭代目标包含数组、元组、字典等数据调集,下面代码给咱们演示了一个根本的迭代进程:

迭代器也是一种可迭代目标,与一般的可迭代目标的差异在于,迭代器内部完结了next函数用rct系列来生成每次迭代循环需求回来的元素。而最终的生成器则又是一种特洪荒之掌管天道体系殊的迭代器,详细表现上便是运用yield语法的函数,讲到这儿就说到成为Python大牛必需求把握的高端语法——yield(文末附赠教程)了yield语法,总的来说yield便是用来发生一个生成器的语法,例如将上述的迭代进程修正为生成器方法可成为Python大牛必需求把握的高端语法——yield(文末附赠教程)以这样写:

成为Python大牛必需求把握的高端语法——yield(文末附赠教程)

成为Python大牛必需求把握的高端语法——yield

迭代器也是一种成为Python大牛必需求把握的高端语法——yield(文末附赠教程)可迭代目标,与一般的可迭代目标的差异在于,迭代器内部完结了next函数用来生成每次迭代循环需求回来的元素。而最终的生成器则又是一种特别的迭代器,详细表现上便是运用yield语法的函数,讲到这儿就说到了yield语法,总的来说yield便是用来发生一个生成器的语法,抖阴tv例如将上述的迭代进程修正为生成器方法能够这样写:

成为Python大牛必需求把握的高端语法——yield(文末附赠教程)

成为Python大牛必需求把握的高端语法——yield

上述代码的my_generator()即回来了一个生成器目标,每次循环时履行到yield处即回来其时的index的值,到下一次循环时将从前次回来的yield处持续履行,直到index的值不满足小于5的条件时完毕整个函数,此刻也完毕了对这个生成器的迭代进程。

这四者之间的联系或许会略微有些紊乱,再给咱们简成为Python大牛必需求把握的高端语法——yield(文末附赠教程)单的总结一下:生成器是一种特别的迭代器,而迭代器又是一种特别的可迭代目标,可迭代目标便是能够履行迭代操作也便是能够经过for循环来遍历的目标。

2. 为什么要运用yield

看了上述两个迭代进程,咱们或许有些疑问,运用yield改形成生成器方法的代码看起来比简略的迭代一个列表的方法要杂乱许多,那么这样写有什么优势呢?

首要,运用yield语法的生成器最主要的一个优势便是极端省内存。例如上述两个迭代进程,同样是遍历输出0-4这几个元素,运用列表的方法需求构建出一个长度为5的数组并存储在内存中,而运用生成器的方法只需求一个index变量即可完结,这仍是迭代元素较少的情况下,假如迭代的是100万乃至1000万个元素时,列表的方法就需求构建一个长度为100万或成为Python大牛必需求把握的高端语法——yield(文末附赠教程)者1000万的数组,这时关于内存的运用便是十分大的担负了,而运用生成器的方法,无论是迭代100万仍是1000万个元素,仍然只需求一个index变量即可完结。

而且生成器的方法是即用即核算的,即迭代到对应的元素时,这个元素才相应的核算生成出来,而列表的方法需求在迭代开端前就构建出整个迭代数组,这在某些情况下能够极大地节约核算时刻。例如下面这段代码:

成为Python大牛必需求把握的高端语法——yield

这段代码中,实践的迭代进程只进行到第10个元素即退出了整个循环,但是在迭代开端前,仍然要核算1000万次来生成迭代列表,这就形成了很多的核算和内存资源。而假如经过生成器重写该迭代进程的话:

成为Python大牛必需求把握的高端语法——yield

生成器在迭代开端前并不会核算出一切需求迭代的值,只要用届时才会核算相应的值并回来,因而上述代码的index将只会核算到10即完毕了整个迭代进程,避免了核算和内存资源的糟蹋。

3. yi骚狗eld语法示例1:折纸骷髅人DIY一个range函数

Python自带的range函数能够发生一个可迭代目标,常用于for循环中,在Python 2中range函数生成的是一个列表,而在Python 3中range函数生成的是一个生成器。现在让咱们来经过yield语法马未都老婆贾雄伟合影DIY一个自己的range生成器吧!

咱们首林亚金先结构一个回来给定规模数组的函数:

成为Python大牛必需求把握的高端语法——y火车危机圣诞节版ield

这个函数承受两个int类型的参数,分别为数组的郑善友开端和完毕,每个数之间距离为1,咱们还能够经过增加一个参数来指定两个数之间的距离,完结函数更高的灵活性:

成为Python大牛必需求把握的高端语法——yield

咱们先来运转测验一下这个range函数:

成为Python大牛必需求把握的高端语法——yield

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

2
4
6

输出成果契合咱们的预期,现在经过yield语法来将咱们自己DIY的range函数改形成一个生成器:

成为Python大牛必需求把握的高端语法——yield

改造起来也十分简略,首要将界说的用来存储迭代元素的列表删去,然后将本来增加元素到列表中的代码改形成yield 唐末枭雄start即可,这样咱们就自己DIY了一个简易的、根据生成器完结的range函数。

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

生成器除了能够用于核算生成数字元素外,在IO读取方面也能起到很大效果,例如在读取一个超大文件,或许查询某个回来成果超多的数据库时,运用经过yield语法结构的生成器来完结读取操作能够很大程度上下降程序关于内存的占用。

例如咱们有一个名为殖组词my_file.txt的文件,里边存储了周董的《表白气球》的歌词,现在咱们能够经过yield语法来结构一个生成器用強がる于一行一行的读取每一句歌词:

成为Python大牛必需求把握的高端语法——yield

这儿运用with语法来读取文件,这是Python 3引荐的方法。file.readline()函数每次回来一行内容,因为回来的内容带有每行结束的换行符,因而经过line.strip(‘ ’)将换行符过滤掉。每次经过yield回来一行内容之后,再次经过file.readline()函数获取下一行内容,直到整个文件被彻底迭代。

让咱们来运转测验一下这个按行读取文件内容的生成器:

成为Python大牛必需求把握的高端语法——yield

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

塞纳成为Python大牛必需求把握的高端语法——yield(文末附赠教程)河畔 左岸的咖啡
我手一杯 品味你的美
留下唇印 的嘴
……

《表白气球》的歌词就一行一行的输出到屏幕上了,因为歌词行数过多,因而这边只复制出前三行给咱们演示成果。

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

斐波那契数列是一道经典的算法题,也是程序员面试时经江雨瞳成为Python大牛必需求把握的高端语法——yield(文末附赠教程)常会被问到的一道题。斐波那契数列的便是一个形如1, 1, 2, 3, 5, 8, ……的数列,从第三项开端,每一项都等于前两项之和。运用Python来完结一个核算斐波那契数列的典型函数如下:

成为Python大牛必需求把握的高端语法——yield

这个函数经过一个名为fib_list的数组存储生成的前n个斐唐亨琼波那昨日的气候契数,最终一次性回来整个数组。其间a, b = b, a + b是Python的一个特征用法,用于快速交流两个数,相当于:

成为Python大牛必需求把握的高端语法——yield

参阅之前DIY的range函数的写法,将这个核算斐波那契数列的函数经过yield语法修正为生成器:

成为Python大牛必需求把握的高端语法——yield

让咱们来测验运转一下这个经过yield语法完结的斐波那契数列生成器:

成为Python大牛必需求把握的高端语法——yield

对应的输出成果为:

1
1
2
3
5

能够看到,从第三项开端的每一项都是前两项的和,这样的输出成果便是咱们要的斐波那契数列。

最终,想学习Python的小伙伴们!

请重视+私信回复:“学习”就能够拿到一份我为咱们预备的Python学习材料!

pytyhon学习材料

python学习材料

相关文章

标签列表