在做牛客网上的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 here5是在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 生成器笔记相关推荐

  1. Python生成器笔记

    Python中三大器有迭代器,生成器,装饰器,本文主要讲述生成器.主要从生成器的概念,本质,以及yield关键字的使用执行过程. 本质:生成器是一类特殊的迭代器,使用了yield关键字的函数不再是函数 ...

  2. Python学习笔记:生成器(Generator)

    Python学习笔记:生成器(Generator) 拥有迭代序列的一致方式,比如列表里的对象或文件里的行,是Python的一项重要特性.这是通过迭代器协议的方式来完成的,一种生成可迭代对象的通用方式. ...

  3. Python学习笔记(十一)

    Python学习笔记(十一): 生成器,迭代器回顾 模块 作业-计算器 1. 生成器,迭代器回顾 1. 列表生成式:[x for x in range(10)] 2. 生成器 (generator o ...

  4. python学习笔记目录

    人生苦短,我学python学习笔记目录: week1 python入门week2 python基础week3 python进阶week4 python模块week5 python高阶week6 数据结 ...

  5. Python机器学习笔记:sklearn库的学习

    自2007年发布以来,scikit-learn已经成为Python重要的机器学习库了,scikit-learn简称sklearn,支持包括分类,回归,降维和聚类四大机器学习算法.还包括了特征提取,数据 ...

  6. Python学习笔记:异步IO(1)

    前言 最近在学习深度学习,已经跑出了几个模型,但Pyhton的基础不够扎实,因此,开始补习Python了,大家都推荐廖雪峰的课程,因此,开始了学习,但光学有没有用,还要和大家讨论一下,因此,写下这些帖 ...

  7. python基础论文_北大博士Python学习笔记,Python基础语法总结,一篇文章带你入门...

    image.png 网上现在Python学习资料有很多,但是很杂.很多初学Python的朋友就不知道该怎么去抉择,那些是自己当下所需要的. 刚好朋友是北大的博士,在IT行业也工作八年了.就把他学习Py ...

  8. python 学习笔记 (核心)

    python    学习笔记 (核心) Python解释器从头到尾一行接一行执行脚本 # -*- coding: UTF-8 -*-    //字符编码 不区分单引号和双引号,x='hello',x[ ...

  9. Python学习笔记三之编程练习:循环、迭代器与函数

    Python学习笔记三之编程练习 1. 编程第一步 # 求解斐波纳契数列 #/user/bin/python3#Fibonacci series:斐波那契数列 #两个元素的总和确定了下一个数 a,b= ...

最新文章

  1. 神经网络训练集最少可以是多少个?
  2. ThinkPHP 基础
  3. gson读取json字符串_Java:JSON(Gson)从JSON字符串获取值
  4. 【flink】RocksDB介绍以及Flink对RocksDB的支持
  5. Linux内核构建与开发
  6. gitlab 汉化后502
  7. js生成批次号_【管理】MES系统中的批次管理
  8. 基于人机环境系统工程的智慧企业建设思考(2)
  9. php解析shapefile,Fiona简介及Shapefile数据读取
  10. 解决lay out无法使用闪退问题,SketchUp 2022 MAC中文 (草图大师) 支持M1intel芯片,支持monterey最新系统
  11. android 指令脱壳,安卓脱壳之战-腾讯脱壳
  12. sqlmap运行mysql命令_sqlmap命令总结
  13. i春秋web-Backdoor(.git泄露、vim备份泄露、代码审计)
  14. 上传图片校验图片类型、大小及尺寸
  15. 【正点原子MP157连载】第二十八章 A7和M4联合调试-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
  16. 数据标注工具下载中遇到的各种问题
  17. mybatis中更新mysql时间多了一秒
  18. 【C++】C++基础语法
  19. 苹果最早明年在Apple Watch中引入microLED显示屏
  20. 【工业大数据】大数据时代,计量服务将何去何从?

热门文章

  1. OpenCV使用功能匹配模板的实例(附完整代码)
  2. OpenCV A-KAZE匹配的实例(附完整代码)
  3. OpenCV gapi模块API的引用(附完整代码)
  4. OpenCV小部件的姿势Pose of a widget
  5. C++ delete与 delete []区别
  6. QT实现RSS新闻阅读器
  7. c++引用专题之普通引用
  8. 零售连锁管理软件_连锁超市用哪个收银软件好?
  9. MyCat-Web安装
  10. 1.网络工具:ifconfig,ping,netstate,Redhat命令和图形化设置ip,finger,nslookup