Python之yield简明详解
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简明详解的更多相关文章
- Python之argv简明详解
今日看到argv 度娘查找一番,基本都是转载的同一篇文章,总体字数不少但看了之后感觉还是稀里糊涂,自己尝试了一番简单总结如下 当我们需要在命令行执行脚本并需要在执行脚本的同时传入参数给脚本使用,那我们 ...
- Python初学者常见错误详解
Python初学者常见错误详解 0.忘记写冒号 在 if.elif.else.for.while.class.def 语句后面忘记添加 “:” if spam == 42 print('Hello ...
- python操作redis用法详解
python操作redis用法详解 转载地址 1.redis连接 redis提供两个类Redis和StrictRedis用于实现Redis的命令,StrictRedis用于实现大部分官方的命令,并使用 ...
- python之OS模块详解
python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...
- python之sys模块详解
python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...
- python中threading模块详解(一)
python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...
- Python数据类型及其方法详解
Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...
- python引用和对象详解
python引用和对象详解 @[马克飞象] python中变量名和对象是分离的 例子 1: a = 1 这是一个简单的赋值语句,整数 1 为一个对象,a 是一个引用,利用赋值语句,引用a指向了对象1. ...
- Python中time模块详解
Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...
随机推荐
- call,apply和bind的区别
call,apply继承并调用该函数,bind继承后未调用函数. var React = require('react'); //核心 var ReactDom = require('react-do ...
- C - Kite URAL - 1963 (几何+四边形判断对称轴)
题目链接:https://cn.vjudge.net/problem/URAL-1963 题目大意:给你一个四边形的n个点,让你判断对称点的个数(对称轴的个数*2). 具体思路:感谢qyn的讲解,具体 ...
- Django学习手册 - 自定义分页函数
前端代码: <div class="xianshi"> {% for i in info %} <ul> <li>{{ i }}</li& ...
- 全国人口 信息(NCIIC)接口开发纪要
阶段一:根据wsdl2java命令解析https://ws.nciic.org.cn/nciic_ws/services/NciicServices?wsdl以生成接口调用的对象类: wsdl2jav ...
- js中创建数组,并往数组里添加元素
数组的创建 var arrayObj = new Array(); //创建一个数组 var arrayObj = new Array([size]); //创建一个数组并指定长度,注意不是上限,是长 ...
- T5557 读写卡详解
T5557的基本信息就不在这里详细介绍,不了解的可以去看T5557的收据手册. 一上来直接开始讲操作 存在七种操作,我们重点介绍四种,Standard Write,Protected Write,Di ...
- dubbo初步认识
dubbo中文网站:http://dubbo.apache.org/zh-cn/ dubbo英文网站:http://dubbo.apache.org/en-us/ 1.Apache Dubbo是一款高 ...
- Python对HDFS的一些基础操作
链接: http://www.cnblogs.com/shoufengwei/p/5949791.html
- pytorch1.0 用torch script导出模型
python的易上手和pytorch的动态图特性,使得pytorch在学术研究中越来越受欢迎,但在生产环境,碍于python的GIL等特性,可能达不到高并发.低延迟的要求,存在需要用c++接口的情况. ...
- 在vue中scss通过scoped属性设置局部变量如何设置框架样式
应用场景:在使用vue的大型单页应用页面中,我们可以通过使用scoped属性将当前组件的样式设置局部样式 界面被scoped局部化之后,不能覆盖界面里面的子组件样式,因为样式只对当前界面生效.(可以加 ...