python 生成器笔记
在做牛客网上的python第一道题的时候就蒙了,看来还是生成器没学好。
题目如下:
def bar(n):m=nwhile True:m+=1yield m b = bar(3)print b.next()
这里回顾下生成器的知识,基础的就不说了,就一点:就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
下面举几个例子:
def bar_1(n):m=nfor i in range(3):m+=1yield m print 'i am here'a=bar_1(3)
# 在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行
print 'a:',a.next()
输出结果:
a: 4
因为生成器只有在调用next()的时候执行,这里调用后遇到yield就返回了结果4,而下面没有继续调用next(),所以执行就此结束。
def bar_2(n):m=nfor i in range(5):m+=1yield m print 'i am here'a=bar_2(3)
for i in range(3):print i,'->',a.next()
运行结果:
0 -> 4
1 -> i am here
5
2 -> i am here
6
这里在for中循环调用3次next(),也就是在遇到yield返回后,因为再次调用next()而继续执行下面的语句。这里要注意的是1 -> i am here
和5是在
for i in range(3)`中一次循环中执行的。
def bar_4(n):m=nfor i in range(5):m+=1yield m print 'i am here'a=bar_4(3)
for i in a:print 'i->',i
运行结果:
i-> 4
i am here
i-> 5
i am here
i-> 6
i am here
i-> 7
i am here
i-> 8
i am here
从结果可以看出,直接用for循环来遍历生成器对象更方便,打印出的结果也很清晰,也即是for i in range(5)
执行完所有的循环,不再受到外部循环的边界限制。
def bar_5(n):m=nfor i in range(6):m+=1yield m print 'i->',i b = bar_5(5)print 'b=',b.next()a=bar_5(3)
for i in a:pass
运行结果:
i-> 0
b= 6
i-> 1
b= 6
i-> 2
b= 6
i-> 3
b= 6
i-> 4
b= 6
i-> 5
b= 6
我的理解是,这里每次执行b = bar_5(5)
后遇到yield就中断,遇到b.next()后就打印首元素后而结束。这里的总体循环次数是根据for i in range(6)
而定。
下面就是运行题目的程序了:
def bar_5(n):m=nwhile True:m+=1yield m b = bar_5(3)print b.next()a=bar_5(1)
for i in a:pass
运行结果:
4
4
4
4
4
4
4
4
4
4
4
4
4
...
这里由于控制循环次数的是while True
,所以是死循环,而每次打印的是生成器b的首元素,也既是4。
以上是查资料加自己的理解,如有错误,还望指正。
python 生成器笔记相关推荐
- Python生成器笔记
Python中三大器有迭代器,生成器,装饰器,本文主要讲述生成器.主要从生成器的概念,本质,以及yield关键字的使用执行过程. 本质:生成器是一类特殊的迭代器,使用了yield关键字的函数不再是函数 ...
- Python学习笔记:生成器(Generator)
Python学习笔记:生成器(Generator) 拥有迭代序列的一致方式,比如列表里的对象或文件里的行,是Python的一项重要特性.这是通过迭代器协议的方式来完成的,一种生成可迭代对象的通用方式. ...
- Python学习笔记(十一)
Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...
- python学习笔记目录
人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...
- Python机器学习笔记:sklearn库的学习
自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法.还包括了特征提取,数据 ...
- Python学习笔记:异步IO(1)
前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...
- python基础论文_北大博士Python学习笔记,Python基础语法总结,一篇文章带你入门...
image.png 网上现在Python学习资料有很多,但是很杂.很多初学Python的朋友就不知道该怎么去抉择,那些是自己当下所需要的. 刚好朋友是北大的博士,在IT行业也工作八年了.就把他学习Py ...
- python 学习笔记 (核心)
python 学习笔记 (核心) Python解释器从头到尾一行接一行执行脚本 # -*- coding: UTF-8 -*- //字符编码 不区分单引号和双引号,x='hello',x[ ...
- Python学习笔记三之编程练习:循环、迭代器与函数
Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...
最新文章
- 神经网络训练集最少可以是多少个?
- ThinkPHP 基础
- gson读取json字符串_Java:JSON(Gson)从JSON字符串获取值
- 【flink】RocksDB介绍以及Flink对RocksDB的支持
- Linux内核构建与开发
- gitlab 汉化后502
- js生成批次号_【管理】MES系统中的批次管理
- 基于人机环境系统工程的智慧企业建设思考(2)
- php解析shapefile,Fiona简介及Shapefile数据读取
- 解决lay out无法使用闪退问题,SketchUp 2022 MAC中文 (草图大师) 支持M1intel芯片,支持monterey最新系统
- android 指令脱壳,安卓脱壳之战-腾讯脱壳
- sqlmap运行mysql命令_sqlmap命令总结
- i春秋web-Backdoor(.git泄露、vim备份泄露、代码审计)
- 上传图片校验图片类型、大小及尺寸
- 【正点原子MP157连载】第二十八章 A7和M4联合调试-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
- 数据标注工具下载中遇到的各种问题
- mybatis中更新mysql时间多了一秒
- 【C++】C++基础语法
- 苹果最早明年在Apple Watch中引入microLED显示屏
- 【工业大数据】大数据时代,计量服务将何去何从?
热门文章
- OpenCV使用功能匹配模板的实例(附完整代码)
- OpenCV A-KAZE匹配的实例(附完整代码)
- OpenCV gapi模块API的引用(附完整代码)
- OpenCV小部件的姿势Pose of a widget
- C++ delete与 delete []区别
- QT实现RSS新闻阅读器
- c++引用专题之普通引用
- 零售连锁管理软件_连锁超市用哪个收银软件好?
- MyCat-Web安装
- 1.网络工具:ifconfig,ping,netstate,Redhat命令和图形化设置ip,finger,nslookup