Python——通过斐波那契数列来理解生成器

一、生成器(generator)

先来看看一个简单的菲波那切数列,出第一个和第二个外,任意一个数都是由前两个数相加得到的。如:0,1,1,2,3,5,8,13......

输入斐波那契数列前N个数:

 def fab(max): n, a, b = 0, 0, 1 while n < max: print b a, b = b, a + b n = n + 1

 结果:

>>> fib(100)
1
1
2
3
5
8
13

但是,要提高 fib 函数的可复用性,最好不要直接打印出数列,而是返回一个 List。每次循环将b的值append到一个list中。

然而,问题又来了。。。

该函数在运行中占用的内存会随着参数 max 的增大而增大,如果要控制内存占用,最好不要用 List来保存中间结果,而是通过 iterable 对象来迭代。

在python2 中:

for i in range(1000): pass  

range会生成一个含有1000个元素的list,极大地浪费了内存空间。

for i in xrange(1000): pass

而改进后的xrange则生成一个可迭代(iterable)对象,每次迭代时返回下一个数值,占用空间极少。

如此,我们可以利用iterable来写一个fib类:

class Fab(object): def __init__(self, max): self.max = max self.n, self.a, self.b = 0, 0, 1 def __iter__(self): return self def next(self): if self.n < self.max: r = self.b self.a, self.b = self.b, self.a + self.b self.n = self.n + 1 return r raise StopIteration()

然后,for循环会在每次循环中自动调用next()方法,不断返回数列的下一个数。占用内存始终为常数。

 >>> for n in Fab(5): ...     print(n)  

虽然实现了需求,但用class实现的fib并不简洁,由此我们可以引入yield。

 def fab(max): n, a, b = 0, 0, 1 while n < max: yield b # print(b) a, b = b, a + b n = n + 1 

然后:

 >>> for n in fab(5): ...     print(n) 

yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fib(5) 不会执行 fab 函数,而是返回一个 iterable 对象在 for 循环执行时,每次循环都会执行 fib 函数内部的代码,执行到 yield b 时,fib 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。

手动执行过程:

 >>> f = fab(5) >>> f.next() 1 >>> f.next() 1 >>> f.next() 2 >>> f.next() 3 >>> f.next() 5 >>> f.next() Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration

当函数执行结束时,generator 自动抛出 StopIteration 异常,表示迭代完成。在 for 循环里,无需处理 StopIteration 异常,循环会正常结束。

一个带有 yield 的函数就是一个 generator,它和普通函数不同,生成一个 generator 看起来像函数调用,但不会执行任何函数代码,直到对其调用 next()(在 for 循环中会自动调用 next())才开始执行。虽然执行流程仍按函数的流程执行,但每执行到一个 yield 语句就会中断,并返回一个迭代值,下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

 

转载于:https://www.cnblogs.com/pyramid1001/p/5854712.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/287154.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《看聊天记录都学不会Python到游戏实战?太菜了吧》(9)集万家之长不死 python

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

公司c语言面试题目,c语言面试最必考的十道试题,求职必看!!!

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼6、free()函数问&#xff1a;下面的程序会在用户输入’freeze’的时候出问题&#xff0c;而’zebra’则不会&#xff0c;为什么?#include int main(int argc, char *argv[]) {char *ptr (char*)malloc(10);if(NULL ptr){printf(…

Android之解决TabLayout里面每个Tab项的间距和修改指示线的长度(非反射)和修改选中字体大小

1 问题 1)由于TabLayout设置了可滑动Tab参数 app:tabMode="scrollable" 导致每个Tab之间的间距很大,但是UI设计图里面的字体之间的间距很小,我们改怎么解决? 2)修改TabLayout指示线的长度(非反射) 3)修改选中的字体大小并且加粗 2 解决办法 问题1解决办法…

【重磅】ArcGIS 10.8手把手经典图文安装教程(附安装包全套装下载,亲测可用)

ArcMap时代的最后一版软件,未来官方对ArcMap的支持将仅限于提供补丁,更新和新环境支持,换句话说ArcMap10.8.X将会是最终版本,以后不会再有ArcMap10.9了,官方建议所有人在完成工作流程后立即迁移到ArcGIS Pro。 时间真快,ArcGIS 10.7刚装完没几天,作为GISer的我,有的开始…

聊聊 C# 中的 Visitor 模式

前言 Visitor模式在日常工作中出场比较少&#xff0c;如果统计大家不熟悉的模式&#xff0c;那么它榜上有名的可能性非常大。使用频率少&#xff0c;再加上很多文章提到Visitor模式都着重于它克服语言单分派的特点上面&#xff0c;而对何时应该使用这个模式及这个模式是怎么一…

AcWing 889. 满足条件的01序列(卡特兰数应用)

满足条件的01序列 假设长度为n个序列要求满足题意1的前缀0的个数不能超过1的个数 将问题抽象为从(0, 0)到(n, n) 向上走一个代表这一步对应序列中的值是1&#xff0c;向右走代表序列中的值是0 要想满足1的前缀0的数量大于1的数量就需要满足所有路过的途径在y x这个函数个下面…

添加ASP.NET网站资源文件夹

ASP.NET应用程序包含7个默认文件夹&#xff0c;分别为Bin、APP_Code、App_GlobalResources、App_LocalResources、App_WebReferences、App_Browsers和“主题”文件夹。每个文件夹都存放ASP.NET应用程序的不同类型的资源。 方法 说明Bin  包含程序所需的所有已编译程序集&#…

《看聊天记录都学不会Python到游戏实战?太菜了吧》(8)我们开始做一个数字小游戏吧

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

Microsoft SQL Server 2019开发版安装配置教程

一、安装cn_sql_server_2019_developer_x64 双击setup.exe进行安转。 点击【安装】。 点击【全新SQL Server独立按住啊或向现有安装添加功能】。 点击【下一步】。

Git提示Please move or remove them before you switch branches.

1 问题 git checkout V1 提示错误如下 error: The following untracked working tree files would be overwritten by checkout:flutter_module/pubspec.lock Please move or remove them before you switch branches. Aborting2 解决办法 git clean -df ../flutter_module…

c语言创建新指针,如何用c语言创建一个指针

您总是可以将指针强制转换为整数&#xff0c;即整数大小比系统中使用的字节指针大3位。然后在向左移动3位后移动指针。然后将位信息存储在最低有效3位上。然后可以用正常算术递增该整数“位指针”。像这样的东西&#xff1a;#include #define bitptr long long#define create_b…

请查收最新的 EF Core 7.0 更新

关注我们作者&#xff1a;Jeremy Likness排版&#xff1a;Rani近期.NET 数据团队宣布了 EF Core 7.0 (EF7)的第四个预览版。除了bug修复和更大功能的基础工作外&#xff0c;此预览版还包括以确保转换器和比较器由类型映射处理&#xff0c;并支持将转换器与值生成器一起使用。请…

【CC精品教程】ContextCapture 4.4.12(CC,Smart 3D)简体中文版安装教程(附安装包下载)

ContextCapture 4.4.12简体中文版是一款功能强大的三维建模软件,用户只需使用自己拍摄的普通照片,就能快速创建细节丰富的三维实景模型,并在项目的整个生命周期内为设计、施工和运营决策提供精确的现实环境背景。 目 录 一、安装过程 1. 安装主程序cncpc040412333en_updt1…

《看聊天记录都学不会C#?太菜了吧》(4)C# 中的尚方宝剑 “先斩后奏”

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…

Android之解决多语言适配部分TextView内容左对齐和内容一行不排满就到第二行问题

1 问题 1、多语言适配部分TextView内容左对齐 2、内容一行不排满就到第二行问题 2 解决办法 问题1、在TextView里面加入下面参数 android:gravity="center" 问题2、 import android.content.Context; import android.graphics.Paint; import android.text.TextUti…

如何用 Swift 语言构建一个自定控件

本文译自&#xff1a;How To Make a Custom Control in Swift 用户界面控件是所有应用程序重要的组成部分之一。它们以图形组件的方式呈现给用户&#xff0c;用户可以通过它们与应用程序进行交互。苹果提供了一套控件&#xff0c;例如 UITextField&#xff0c;UIButton&#xf…

【ArcGIS遇上Python】ArcGIS Python获取Shapefile矢量数据字段名称

借助PyCharm环境&#xff0c;在不打开ArcGIS的情况下&#xff0c;编写Python代码&#xff0c;获取矢量数据的所有字段。 import arcpyshp C:\data\out\Export_Output.shp fields arcpy.ListFields(shp) for f in fields:print f.name‘,’f.type运行结果&#xff1a; C:\Pyt…

《聪明人和傻子和程序员》

本文借鉴自鲁迅杂文《聪明人和傻子和奴才》&#xff0c;如有雷同&#xff0c;纯属巧合。有个程序员特别喜欢寻人诉苦&#xff0c;只要一点事&#xff0c;就喜欢诉苦。有一日&#xff0c;他遇到一个聪明人。“大佬。”他悲哀的说&#xff0c;“我们公司待遇越来越差了&#xff0…

c语言 case语句用法,switch ... case语句的用法[组图]

switch ... case语句的用法[组图]08-13栏目&#xff1a;技术TAG&#xff1a;switch case语句switch case语句当情况大于或等于4种的时候就用switch ... case语句copyright jhua.orgswitch(表达式) copyright jhua.org{ https://www.jhua.orgcase 常量1&#xff1a; 语句体1&am…

《看聊天记录都学不会C#?太菜了吧》(5)C# 中可以用中文名变量?

本系列文章将会以通俗易懂的对话方式进行教学&#xff0c;对话中将涵盖了新手在学习中的一般问题。此系列将会持续更新&#xff0c;包括别的语言以及实战都将使用对话的方式进行教学&#xff0c;基础编程语言教学适用于零基础小白&#xff0c;之后实战课程也将会逐步更新。 若…