yield在Python中被称之为生成器(只能在函数中使用),他的作用是将函数中每次执行的结果以类似元组的形式保存起来一遍后续使用。

什么是生成器?

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。

示例代码:

def sums():
for j in range(5):
for k in range(1):
yield j, k # 循环一次yield得到两个数据
return j, k num = sums()
for a in num: # 遍历返回的数据
print(a)

执行结果:

(0, 0)
(1, 0)
(2, 0)
(3, 0)
(4, 0)

实例生成彩票号码:

"""
输入注数生成大乐透号码
红球取值范围1-36,篮球1-12
"""
import random class GreatLotto:
"""
需要一个生成次数count
"""
global result # 声明全局变量
result = [] def __init__(self, count):
self.count = count def randoms(self):
"""
:return: 返回传入次数的随机彩票号码(返回的是一个整体列表)
"""
for i in range(self.count):
for j in range(7):
if j <= 4:
index1 = random.randrange(1, 36)
result.append(index1)
if j > 4:
index1 = random.randrange(1, 13)
result.append(index1)
return result # 返回生成结果 def start_end(self):
"""
:return: 根据传入的次数判断列表取值的开始数和结束数
"""
for k in range(self.count):
if k < 1: # 首次开始取值
start1 = k
else:
start1 = k * 7
end1 = start1 + 7 # 结束值
yield end1, start1 # yield是生成器,将每次循环生成的结果储存(如果直接使用了return会结束循环,导致只能执行一次) if __name__ == '__main__':
try:
num = int(input("请输入需要生成的注数:"))
except ValueError:
print('输入的格式错误!!!')
num = int(input("请重新输入需要生成的注数:"))
Great = GreatLotto(num) # 实例化GreatLotto 并将输入的次数传入
lists = Great.randoms() # 得到返回的生成结果
for end, start in Great.start_end(): # 遍历函数的生成器
print(lists[start:end]) # 输出最终生成的结果 执行结果:
请输入需要生成的注数:4
[10, 5, 8, 26, 12, 10, 8]
[6, 11, 14, 16, 16, 2, 6]
[2, 1, 3, 17, 22, 8, 5]
[19, 27, 28, 29, 9, 7, 7]

小知识

生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

Python之yield简明详解的更多相关文章

  1. Python之argv简明详解

    今日看到argv 度娘查找一番,基本都是转载的同一篇文章,总体字数不少但看了之后感觉还是稀里糊涂,自己尝试了一番简单总结如下 当我们需要在命令行执行脚本并需要在执行脚本的同时传入参数给脚本使用,那我们 ...

  2. Python初学者常见错误详解

    Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:”   if spam == 42 print('Hello ...

  3. python操作redis用法详解

    python操作redis用法详解 转载地址 1.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用 ...

  4. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  5. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  6. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  7. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  8. python引用和对象详解

    python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...

  9. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

随机推荐

  1. B - Tree Rotations HYSBZ - 2212 (线段树合并)

    题目链接:https://cn.vjudge.net/contest/287725#problem/B 题目大意:现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有n个叶子节 ...

  2. EL知识点总结

    EL知识点总结 - canger - 博客园http://www.cnblogs.com/canger/p/6675799.html 1 只可以获取内置对象的属性值,不可以获取JSP页面中局部java ...

  3. Javascript - ExtJs - TreePanel组件

    TreePanel组件(Ext.tree.TreePanel)logogram:Ext.tree.Panel | xtype:treepanel 树与节点 树面板组件的根是源头,从根上拓展出其它的子节 ...

  4. pythonのscrapy抓取网站数据

    (1)安装Scrapy环境 步骤请参考:https://blog.csdn.net/c406495762/article/details/60156205 需要注意的是,安装的时候需要根据自己的pyt ...

  5. java知识点2

    进阶篇 Java底层知识 字节码.class文件格式 CPU缓存,L1,L2,L3和伪共享 尾递归 位运算 用位运算实现加.减.乘.除.取余 设计模式 了解23种设计模式 会使用常用设计模式 单例.策 ...

  6. cartographer 安装

    Debian 8 Jessie 一顿操作梦如虎,最后不知道咋装上的. 参考:https://www.jianshu.com/p/9922a51ce38f https://blog.csdn.net/p ...

  7. python numpy 三行代码打乱训练数据

    今天发现一个用 numpy 随机化数组的技巧. 需求 我有两个数组( ndarray ):train_datasets 和 train_labels.其中,train_datasets 的每一行和 t ...

  8. 【ARTS】01_16_左耳听风-20190225~20190303

    ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...

  9. python3编码(encode,decode)

    python3默认编码为unicode,由str类型进行表示.二进制数据使用byte类型表示. 字符串通过编码转换成字节码,字节码通过解码成为字符串 encode:str --> bytes d ...

  10. faster-rcnn自己的理解总结(包括它的前世今身R-CNN和fast R-CNN)

    1.grandfather:  R-CNN网络 结构如下: 工作流程: Input(an image)   Proposals(~2K个,在使用CNN提取特征之前还要先resize)  feature ...