python3 生成器

要说生成器,就必须首先要知道列表的概念;

我们创建一个如下的列表:

ls = [1,2,3,4,5,6,7,8,9]

那么就开辟了一个门牌号为ls的内存区,然后真的把1,2,3,4,5,6,7,8,9这几个数字放到了内存中;

如果我们在for循环中要根据i的值来获取一个值的话,我们可以把数据放在上面的ls中,然后通过ls[i]来获取;这样的

方式存在巨大的缺点,就是要事先准备好ls中的所有数值;如果很多的话会造成响应慢,内存溢出等问题;

所以就有有了生成器的概念,生成器会指定一个公式,然后每次循环都根据公式计算出当前的值,不用事先生成

所有的值。


一、最简单的生成器

# -*- coding:utf-8 -*-
# Author: Evan Mi# 这是一个最基本的生成器,对应的公式是i*2,i从0到9
# 这样我们就可以通过迭代的方式来访问生成的每一个值了
# 它的缺点就是,只能逐一迭代,不能随意指定i,也不能往前迭代
my_gen_01 = (i*2 for i in range(10))
"""
可以看到my_gen是一个generator对象
"""
print(my_gen_01)  # <generator object <genexpr> at 0x00000000024FCBA0>
#   generator对象是一个迭代器对象,所以直接通过next()方法来迭代
while True:try:print(next(my_gen_01))     # 迭代(根据公式计算)except StopIteration as e:  # 迭代到没有元素后会抛出StopIterationprint(e.value)break
"""
运行结果:
0
2
4
6
8
10
12
14
16
18
None
"""
#   用for循环迭代,不会有异常抛出
#   需要新建一个,因为上一个已经被迭代完了(生成器是一次性用品)
my_gen_02 = (i*2 for i in range(10))for val in my_gen_02:print(val)
"""
运行结果:
0
2
4
6
8
10
12
14
16
18
"""


二、用函数来实现复杂的生成器

# -*- coding:utf-8 -*-
# Author: Evan Mi# 引用别人的斐波那契数列生成函数
"""函数运行到yield的时候,就会暂停,并将yield关键字之后的值传到函数外,函数暂停在这里,直到等到下一次迭代"""
def fib(max_num):n, a, b = 0, 0, 1while n < max_num:yield ba, b = b, a+bn += 1# 定义了一个生成器,这个生成器每次迭代得到的值就是yield带出来的值fb = fib(10)#  用for循环迭代
for val in fb:print(val)
"""
运行结果:
1
1
2
3
5
8
13
21
34
55
"""
# 用next迭代
fb1 = fib(10)
while True:try:print(next(fb1))except StopIteration as e:print(e.value)break
"""
运行结果:
1
1
2
3
5
8
13
21
34
55
None
"""

可以看到,在使用for循环迭代的时候,并不需要自己去处理迭代停止的异常;而用next自己处理就需要;而且

我们每次的e.value都是none;现在给函数加上返回值,如下:

def fib(max_num):n, a, b = 0, 0, 1while n < max_num:yield ba, b = b, a+bn += 1return 'done'

对这样的函数,我们用next调用;

# 用next迭代
fb1 = fib(10)
while True:try:print(next(fb1))except StopIteration as e:print(e.value)break
"""
运行结果:
1
1
2
3
5
8
13
21
34
55
done
"""

可以看到e.value变成了done;所以一个函数如果作为了生成器,那么return的值就是迭代停止时的异常信息;


yield能带出函数中的值,那么yield就是函数内部与外界的媒介,那么自然也能从外部代值回来:

修改函数如下:

def fib(max_num):n, a, b = 0, 0, 1while n < max_num:xxx = yield b  # 后面的b在运行到yield时被带出去,前面的xx在激活yield时被带进来print(xxx)a, b = b, a+bn += 1return 'done'

执行如下的测试:

gx = fib(10)
# 一开是只能调用next,因为这时只是创建了一个生成器,还没有yield变量
print('out;', next(gx))
# 把233给yield,同时往下运行到下一次循环到yield处,并带回yield的值
print('out;', gx.send(233))
print('out;', gx.send(333))
print('out;', gx.send(433))
# 循环到下一次的yield,并带回yield的值(其实就是把None给了yield)
print('out;', next(gx))

运行结果如下:

out; 1  第一次只能从yield带出值
233    通过yield传入了233,在函数内部打印
out; 1    带出1
333    传入333
out; 2 带出2
433 传入433
out; 3 带出3
None 传入None
out; 5 带出5


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

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

相关文章

递归 与 动态规划 区别

递归 &#xff1a; 后面的子问题由前面的子问题解来表示 f(n) _f(n-1) f(n-2)等来表示 动态规划&#xff1a;前面的解由后面的子问题解来选择&#xff0c;自底向上&#xff0c;后面的解层层向前 得到最前的解。 key&#xff1a;找到dp[n] 与 dp[n-1]的联系&#xff0c;也就…

python3 文件相关操作

# -*- coding:utf-8 -*- # Author: Evan Mi""" data open("E:/pythondata/day02/yesterday.txt").read() print(data) """ # r是读模式&#xff0c;找不到文件会报错 r 在读的基础上有了写的能力&#xff0c;这里的写就是追加 # w是…

libvirt虚拟机管理常用指令

创建虚拟机 virt-install virt-install --connect qemu:///system -n $NAME -r $MEM -f $DISK -s $DISK_SIZE --vnc --vnclisten0.0.0.0 --os-typelinux --os-variantcentos7 --vcpus2 --network bridgebr0 -c $ISO --force 其中DISK_SIZE以G为单位&#xff0c;MEM以MB为单位&a…

Copy: 了解SQL Server锁争用:NOLOCK 和 ROWLOCK 的秘密

From http://blog.csdn.net/Atwind/archive/2007/10/19/1832844.aspx 关系型数据库&#xff0c;如SQL Server&#xff0c;使用锁来避免多用户修改数据时的并发冲突。当一组数据被某个用户锁定时&#xff0c;除非第一个用户结束修改并释放锁&#xff0c;否则其他用户就无法修改…

python3 中方法各种参数和返回值

# -*- coding:utf-8 -*- # Author: Evan Mi# 函数def func1():print(in the func1)return 0# 过程def func2():print(in the func2)""" 多个值用逗号分割后返回&#xff0c;会分装到一个tuple中返回&#xff0c; 接收的时候&#xff0c;如果使用一个变量接收&am…

react-json渲染

在js文件内 //定义react组件 import React from react; import ReactDom from react-dom import ./components/assets/taobao.cssclass TaoBao extends React.Component{state{list:[{title:女装,href:javescript:;,hot:false,child:[{title:衬衫,href:javescript:;,hot:false}…

python3 正则表达式模块re相关

# -*- coding:utf-8 -*- # Author: Evan Mi import re """ . 默认匹配除\n之外的任意一个字符&#xff0c;若指定flag DOTALL,则匹配任意字符&#xff0c;包括换行 ^ 匹配字符开头&#xff0c;若指定flags MULTILINE,这种也可以匹配上(r"^a",…

pageContext对象

这个对象代表页面上下文&#xff0c;该对象主要用于访问JSP之间的共享数据。使用pageContext可以访问page、request、session、application范围的变量。 pageContext是PageContext类的实例&#xff0c;它提供了如下两个方法来访问page、request、session、application范围的变量…

python3 Xml操作

读取xml内容&#xff1a;-*- coding:utf-8 -*- # Author: Evan Mi import xml.etree.ElementTree as ET tree ET.parse(test.xml) root tree.getroot() print(root.tag) # 一个节点有tag、attrib、text三个值 # tag是标签的名字 # text是标签的内容 # attrib是标签属性的字典…

【OpenCV学习笔记】2.1OpenCV基本数据类型

OpenCV提供了多种基本数据类型。虽然这些数据类型在C语言中不是基本类型&#xff0c;但结构都很简单&#xff0c;可将它们作为原子类型。可以在“…/OpenCV/cxcore/include”目录下的cxtypes.h文件中查看其详细定义。 数据类型中最简单的就是CvPoint。CvPoint是一个包含intege…

noi.ac #543 商店

我们考虑可并堆维护&#xff0c;从深到浅贪心选取。 用priority_queue启发式合并的话&#xff0c;是60pts: #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<ct…

python3 os模块相关方法

# -*- coding:utf-8 -*- # Author: Evan Mi import os # 获取当前工作目录&#xff0c;即当前python脚本工作的目录路径 print(os.getcwd()) # 切换当前路径 os.chdir(c:/users) os.chdir(rc:\users) print(os.getcwd()) # 验证当前路径是否切换成功 # 返回当前目录的字符串名…

软件设计师--文件索引

问题&#xff08;题目&#xff09;如下图所示&#xff1a;这道题最中要的是理解什么是直接索引、一级间接索引、二级间接索引&#xff1a; 直接索引&#xff1a;地址项直接指向文件块 一级间接索引&#xff1a;地址项&#xff08;一层&#xff09;指向存放地址项&#xff08;二…

什么是格局、境界、眼界、眼光

格局&#xff1a;指人对认知范围内事物认知的程度到何种地步。 &#xff08;思想的深度、眼界的宽度、境界的高度、胸怀的广度决定格局。&#xff09; 境界&#xff1a;指人的思想觉悟和精神修养。 眼界&#xff1a;见识的广度。 眼光&#xff1a;观察鉴别能力。 转载于:https:…

python3 time datetime相关操作

time模块中的相关操作&#xff1a; # -*- coding:utf-8 -*- # Author: Evan Mi import time # 获得时间戳,当前时区的 print(time.time()) # 不传参数获得格林威治时间tuple&#xff0c;传入秒数的话就是把秒数转为tuple print(time.gmtime()) # 不传参数将获得当前时区的时间t…

python3 random模块操作

# -*- coding:utf-8 -*- # Author: Evan Mi import random # 产生一个 >0 并且 <1 的随机浮点数 print(random.random()) """ Get a random number in the range [a, b) or [a, b] depending on rounding. 获得一个[1,3)或者[1,3]范围内的随机浮点数&…

Floyd算法及其应用

Part I-Introduction Floyd算法是一种求图上多源最短路径的算法&#xff0c;适用于中小规模的图&#xff0c;思维简单易懂。 Floyd算法的实质是&#xff08;区间&#xff09;动态规划&#xff0c;在这里做一个简单的概述。 对于一个有\(n\)个结点的图&#xff0c; 令\(dis[i][j…

软件设计师--最早开始时间和最晚开始时间

题目如图所示&#xff0c;解法如下&#xff1a; 方法&#xff1a; 先求最早开始时间&#xff1a;A是开始节点&#xff0c;所以A的最早开始时间是0&#xff0c;并且最早开始时间等于最晚开始时间。等得到图中红色的部分。 其他节点的最早开始时间为以该节点作为弧头的所有有向…

声笔双拼单字效率分析

-----------------------声笔双拼单字效率分析-------------------------- 2 keys: 21 items, 99131909.00 times, covering 17.48 % 2 keys: 21 items, 99131909.00 times, covering 17.48 % 3 keys: 1774 items, 371822394.00 times, c…

软件设计师 --哈夫曼树的一个经典问题

题目如下&#xff1a;有很多人反应&#xff0c;他们怎么做都做不出正确的答案&#xff0c;结果发过他们画的哈夫曼树的图以后&#xff0c;发现图完全是错误的&#xff1b; 如下图所示&#xff1a;为什么错误的&#xff0c;因为在遇到有两个权重为17的树的时候&#xff0c;没有遵…