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

  • 时间:
  • 浏览:0
  • 来源:uu快3下载网站_uu快3开户二维码

2

可不须要看后,从第三项开始了了的每一项都会前两项的和,原本的输出结果就说 朋友 要的斐波那契数列。

3

3. yield语法示例1:DIY另八个 range函数

我手一杯 品尝你的美

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

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

5

6

类似于朋友 有另八个 名为my_file.txt的文件,上面存储了周董的《告白气球》的歌词,现在朋友 可不须要通过yield语法来构造另八个 生成器用于一行一行的读取每一句歌词:

1

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

这四者之间的关系完后 会稍微太大混乱,再给朋友 简单的总结一下:生成器是太大特殊的迭代器,而迭代器又是太大特殊的可迭代对象,可迭代对象就说 可不须要执行迭代操作也就说 可不须要通过for循环来遍历的对象。

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

迭代器也是太大可迭代对象,与普通的可迭代对象的区别在于,迭代器外部实现了next函数用来生成每次迭代循环须要返回的元素。而最后的生成器则又是太大特殊的迭代器,具体体现上就说 使用yield语法的函数,讲到这里就提到了yield语法,总的来说yield就说 用来产生另八个 生成器的语法,类似于将上述的迭代过程修改为生成器土办法 可不须要原本写:

4

迭代器也是太大可迭代对象,与普通的可迭代对象的区别在于,迭代器外部实现了next函数用来生成每次迭代循环须要返回的元素。而最后的生成器则又是太大特殊的迭代器,具体体现上就说 使用yield语法的函数,讲到这里就提到了yield语法,总的来说yield就说 用来产生另八个 生成器的语法,类似于将上述的迭代过程修改为生成器土办法 可不须要原本写:

生成器在迭代开始了了前不须会计算出所有须要迭代的值,没人 用到时才会计算相应的值并返回,就说 上述代码的index将只会计算到10即开始了了整个迭代过程,补救了计算和内存资源的浪费。

Python自带的range函数可不须要产生另八个 可迭代对象,常用于for循环中,在Python 2中range函数生成的是另八个 列表,而在Python 3中range函数生成的是另八个 生成器。现在让朋友 来通过yield语法DIY另八个 自己的range生成器吧!

看后上述另八个 迭代过程,朋友 完后 太大问题图片,使用yield改造成生成器土办法 的代码看起来比简单的迭代另八个 列表的土办法 要僵化 太大,没人 原本写哪些地方地方优势呢?

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

朋友 先来运行测试一下太大 range函数:

塞纳河畔 左岸的咖啡

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

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

迭代是太大对数据的操作,类似于针对另八个 list逐一获取其中的元素的过程就叫做迭代。而可迭代是对象的太大形态,迭代操作没人 针对拥有可迭代形态的对象进行,常见的可迭代对象包括数组、元组、字典等数据集合,下面代码给朋友 演示了另八个 基本的迭代过程:

让朋友 来运行测试一下太大 按行读取文件内容的生成器:

输出结果符合朋友 的预期,现在通过yield语法来将朋友 自己DIY的range函数改造成另八个 生成器:

1. 哪些地方是yield

.在学习含有迷茫不知要怎样学习的朋友 小编推荐另八个 学Python的学习q u n   227  -435-  430可不须要来了解一齐进步一齐学习!免费分享视频资料

斐波那契数列是一道经典的算法题,也是程序员面试时另八个 劲会被问到的一道题。斐波那契数列的就说 另八个 形如1, 1, 2, 3, 5, 8, ……的数列,从第三项开始了了,每一项都等于前两项之和。使用Python来实现另八个 计算斐波那契数列的典型函数如下:

太大 函数接受另八个 int类型的参数,分别为数组的开始了了和开始了,每个数之间间隔为1,朋友 还可不须要通过增加另八个 参数来指定另八个 数之间的间隔,实现函数更高的灵活性:

2. 为哪些地方要使用yield

参考完后 DIY的range函数的写法,将太大 计算斐波那契数列的函数通过yield语法修改为生成器:

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

在介绍yield语法完后 ,首太难向朋友 说明Python中的迭代(iteration)、可迭代(iterable)、迭代器(iterator)以及生成器(Generator)的概念:

朋友 首先构造另八个 返回给定范围数组的函数:

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

《告白气球》的歌词就一行一行的输出到屏幕上了,完后 歌词行数太大,就说 这边只好友克隆出前三行给朋友 演示结果。

1

2

就说 生成器的土办法 是即用即计算的,即迭代到对应的元素时,太大 元素才相应的计算生成出来,而列表的土办法 须要在迭代开始了了前就构建出整个迭代数组,这在太大情況下可不须要极大地节省计算时间。类似于下面这段代码:

改造起来也非常简单,首先将定义的用来存储迭代元素的列表删除,就说 将原本再加元素到列表中的代码改造成yield start即可,原本朋友 就自己DIY了另八个 简易的、基于生成器实现的range函数。

对应的输出结果为:

留下唇印 的嘴

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

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

……

生成器除了可不须要用于计算生成数字元素外,在IO读取方面并能起到很大作用,类似于在读取另八个 超大文件,完后 查询某个返回结果超多的数据库时,使用通过yield语法构造的生成器来完成读取操作可不须要很大程度上降低程序对于内存的占用。