Python3.x:生成器简介
Python3.x:生成器简介
概念
任何使用yield的函数都称之为生成器;使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用__next__()方法返回序列值;
实例
生成器函数只有在调用__next()__方法的时候才开始执行函数里面的语句,例如:
def count(n):
while n > 0:
yield n #生成值:n
n -= 1
使用yield,可以让函数生成一个序列,该函数返回的对象类型是"generator",通过该对象连续调用__next__()方法返回序列值;
c = count(5)
c.__next__() #python 3.4.3要使用c.__next__()不能使用c.next()
结果:5
c.__next__()
结果4
在调用count函数时:c=count(5),并不会打印"counting"只有等到调用c.__next__()时才真正执行里面的语句。每次调用__next__()方法时,count函数会运行到语句yield n处为止,__next__()的返回值就是生成值n,再次调用__next__()方法时,函数继续执行yield之后的语句(熟悉Java的朋友肯定知道Thread.yield()方法,作用是暂停当前线程的运行,让其他线程执行),例如:
def count(n):
print ("cunting" )
while n > 0:
print ('before yield')
yield n #生成值:n
n -= 1
print ('after yield' )
上述代码在第一次调用__next__方法时,并不会打印"after yield"。如果一直调用__next__方法,当执行到没有可迭代的值后,程序就会报错:
Traceback (most recent call last): File "", line 1, in StopIteratio
所以一般不会手动的调用__next__方法,而使用for循环:
for i in count(5):
print (i)
实例:用yield实现斐波那契数列
def fibonacci():
a=b=1
yield a
yield b
while True:
a,b = b,a+b
yield b
调用:
for num in fibonacci():
if num > 100:
break
print (num),
yield中return的作用:
作为生成器,因为每次迭代就会返回一个值,所以不能显示的在生成器函数中return 某个值,包括None值也不行,否则会抛出“SyntaxError”的异常,但是在函数中可以出现单独的return,表示结束该语句。
通过固定长度的缓冲区不断读文件,防止一次性读取出现内存溢出的例子:
def read_file(path):
size = 1024
with open(path,'r') as f:
while True:
block = f.read(SIZE)
if block:
yield block
else:
return
如果是在函数中return 具体某个值,就直接抛异常:
def test_return():
yield 4
return 0 结果:File "<stdin>", line 3
SyntaxError: 'return' with argument inside generator
Python3.x:生成器简介的更多相关文章
- Python3元组的简介和遍历
一.Python3元组简介 1.1.如何创建一个元组 ''' Python的元组与列表类似,不同之处在于元组的元素不能修改. 元组使用小括号(),列表使用方括号[]. 元组创建很简单,只需要在括号中添 ...
- chip8模拟器的python3实现-1-CHIP8简介
打算编写一个NES模拟器,先从简单的chip8模拟器入手 1.CHIP-8简介 CHIP-8是一个解释型语言,由Joseph Weisbecker开发.最初CHIP-8在上个世纪70年代被使用在COS ...
- 【翻译】ES6生成器简介
原文地址:http://davidwalsh.name/es6-generators ES6生成器全部文章: The Basics Of ES6 Generators Diving Deeper Wi ...
- Python3 迭代器,生成器,装饰器
1.迭代器 迭代器有两个基本方法,iter()和next(),next()完成后会引发StopIteration异常 a='abcdef' b=iter(a) #创建迭代器对象 print(type( ...
- python3 迭代器&生成器
前戏:列表生成式 等于 用列表生成式生成列表.需要将所有数据生成到内存中,占用空间,如果数据太多.生成数据就会耗时较久. 例如需要运行卡顿一下..... 定义一个生成器:定义时不生成任何数据,只有通过 ...
- python3 密码生成器
用random模块实现按照要求生成一定个数和一定位数的密码: #Author by Andy #_*_ coding:utf-8 _*_ import random checkcode='' code ...
- python3 第一章 - 简介
1.什么是python 引用官方的话:Python是一种易于学习,强大的编程语言.它具有高效的高级数据结构,并通过简单而有效的方法来进行面向对象编程.Python的优雅语法和动态类型,以及其解释性质, ...
- Python3基础 生成器推导式 简单示例
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- Python2 生成器 简介
1. A generator: provide a kind of function that can return an intermediate result ("the next va ...
随机推荐
- 使用vim-pathogen 进行插件管理
使用vim的插件管理器 pathogen进行vim的插件管理. 1. pathogen 管理插件 pathogen让每个插件占有一个单独的目录,解决了文件分散的问题.安装完 pathogen之后,只需 ...
- 【Thinkphp5】结合layer弹窗 定制操作结果页面
1 打开应用公共文件页面 appliction/common.php,编写以下代码 注意: 成功消息的绿色背景部分是iframe 框架写法,如果是普通页面.就吧parent去除,改为: self ...
- 在fedora 18中将普通用户设置为sudo权限
将一般的用户加入sudo组is not in the sudoers file. This incident will be reported 解决方法 在一般用户下执行sudo命令提示xxx is ...
- redis基础----->redis的基本使用(一)
这里我们就在虚拟机中安装redis,并且使用java和python实现简单的操作.深情是我承担不起的重担,情话只是偶尔兑现的谎言. redis的使用 下载地址:https://redis.io/.安装 ...
- 借助腾讯云CDN开启全站https及问题解决分享
版权声明:本文由张戈原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/78 来源:腾云阁 https://www.qcloud ...
- jQuery的无new构建
正常面向对象的写法: var cJquery = function(){ //构造函数体 }; cJquery.prototype = { name : function(alert("ch ...
- 如何在office2010中的EXCEL表格使用求和公式
EXCEL做表格非常方便,有时我们需要对表格中的很多数字进行求和计算,如果用计算器算会非常麻烦,别担心,用求和公式计算,非常简单的 工具/原料 电脑一台 offic2010软件一套 方法/步骤 ...
- Android 跨进程调用忽略权限
Framework层: @Override public StackInfo getStackInfo(int stackId) { final int callingUid = ...
- linux下php安装
nginx中配置php: http://www.111cn.net/sys/nginx/64044.htm
- Unity3D笔记五 快捷键
一.近距离查看游戏对象 在Hierarchy视图中选择游戏对象,然后在Scene视图中按快捷键“F”来近距离查看该游戏对象. 二.游戏对象不在主摄像头中? Hierarchy中双击选择需要显示的游戏对 ...