Python学习---生成器的学习1210
在Python中,这种一边循环一边计算的机制,称为生成器:
结论: 生成器本质是一个函数,不同于函数的是它生成的是一个对象,不执行函数内的代码
1.1. 列表生成器
列表生成器: 列表是直接生成数字在内存,可以随时调用
元组显示的类型是生成器,只存储在内存中,但是只有在调用的时候生成
b = [x for x in range(10)]
c = (x for x in range(10))
print(b, c)
print(type(b), type(c))
生成器的创建方法
1. c = (x for x in range(10)), 利用 ()来生成
2. 利用yield()方法
利用()生成
c = (x for x in range(10))
# print(c.next) 在Py2中的方法
print(c.__next__()) # 输出0,__next__()是一个私有方法,不建议用
print(next(c)) # 输出1, 利用next内置函数迭代输出,当输出到最有一个元素的时候,就不会输出数据
for i in c: # for调用C里面的next去迭代输出,节约内存空间
print(i, end='\t') # 2 3 4 5 6 7 8 9 ,因为前面输出了0,1,所以指针指向了下一位,所以从2开始
利用yield创建:如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator
最难理解的就是generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
def fun():
print('ok')
yield 1 # 有yield关键字,代表fun()非函数,是一个生成器
# 此时作为return 直接结束了函数 g = fun() # 此时的fun()是一个生成器对象,而非函数
print(g) # <generator object fun at 0x0000000000AFDEB8>
a = next(g)
print('a', a) # 接收了传递回来的值1
# next(g) # ok, 当遇到yield1的时候,可以认为是return 1,结束了函数的执行,g释放,所以后面的print在执行会报错
print(next(g)) # print()里面是一个可迭代对象,yield 1返回一个1被print捕捉到,所以 迭代输出 ok 和 1
生成器的send()方法:使用之前必须先进入到生成器里面,然后利用send()赋值给上次返回处
def fun():
print('ok1')
count = yield 1
print(count)
yield 2 b = fun()
b.send(None) # 等价于 next(b),开始进入到函数, 直到遇到了yield 1后返回到此处,执行后面的b.send('hello world')
tt = b.send('hello world') # 进入到退出的yield 1的位置,将'hello world'赋值给count进行打印,遇到yield 2后返回结果到此处
print(tt) # 将yield 2的结果赋给tt, 然后进行打印
生成器的应用
还可通过yield实现在单线程的情况下实现并发运算的效果
import time
def consumer(name):
print("%s 准备吃包子啦!" %name)
while True:
baozi = yield
print("包子[%s]来了,被[%s]吃了!" %(baozi,name))
def producer(name):
c = consumer('A')
c2 = consumer('B')
c.__next__()
c2.__next__()
print("老子开始准备做包子啦!")
for i in range(10):
time.sleep(1)
print("做了2个包子!")
c.send(i)
c2.send(i)
producer("ftl1012")
利用生成器实现斐波那契
def fib(max):
n, b, a = 0, 0, 1
while n <= max:
# print(b, end='\t')
yield b # 等价于 print(b),将我们需要的结果先存放起来
b, a = a, b+a # 赋值是同时执行的
n += 1 gen = fib(6)
print(next(gen))
print(next(gen))
print(next(gen))
print(next(gen))
【学习参考】http://www.cnblogs.com/alex3714/articles/5765046.html
【学习参考】http://www.cnblogs.com/yuanchenqi/articles/5830025.html
Python学习---生成器的学习1210的更多相关文章
- Python学习---装饰器/迭代器/生成器的学习【all】
Python学习---装饰器的学习1210 Python学习---生成器的学习1210 Python学习---迭代器学习1210
- python全栈开发学习_内容目录及链接
python全栈开发学习_day1_计算机五大组成部分及操作系统 python全栈开发学习_day2_语言种类及变量 python全栈开发_day3_数据类型,输入输出及运算符 python全栈开发_ ...
- Github标星过万,Python新手100天学习计划。
大数据文摘编辑部出品 作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条. 当然,学Python这件事情,你可能也和文摘菌一 ...
- Github标星过万,Python新手100天学习计划,这次再学不会算我输!
作为目前最火也是最实用的编程语言,Python不仅是新手入门程序界的首选,也逐渐成为了从大厂到小厂,招牌需求list的必要一条. 当然,学Python这件事情,你可能也和文摘菌一样,已经下了一百次 ...
- Python框架之Django学习
当前标签: Django Python框架之Django学习笔记(十四) 尛鱼 2014-10-12 13:55 阅读:173 评论:0 Python框架之Django学习笔记(十三) 尛 ...
- Python第十课学习
Python第十课学习 www.cnblogs.com/yuanchenqi/articles/5828233.html 函数: 1 减少代码的重复 2 更易扩展,弹性更强:便于日后文件功能的修改 3 ...
- Python第八课学习
Python第八课学习 www.cnblogs.com/resn/p/5800922.html 1 Ubuntu学习 根 / /: 所有目录都在 /boot : boot配置文件,内核和其他 linu ...
- 第四百一十五节,python常用排序算法学习
第四百一十五节,python常用排序算法学习 常用排序 名称 复杂度 说明 备注 冒泡排序Bubble Sort O(N*N) 将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮 ...
- Python入门到精通学习书籍推荐!
1.Python基础教程(第2版 修订版)<Python基础教程(第2版修订版)>包括Python程序设计的方方面面,内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合 ...
随机推荐
- 【LESS系列】高级特性
前面我已经有一篇文章是写 LESS 的基础语法的. 那么这一次我们来看一下 LESS 的高级特性. 说起高级特性,首先也必须要一提的是模式匹配. 虽然个人觉得模式匹配的实用度其实也是一般般,但在关键时 ...
- [转载]VS2010怎样打开VS2013或者VS2015建立的工程
VS2010怎样打开VS2013或者VS2015建立的工程 作用:解决vs低版本无法直接打开高版本的工程文件问题. 一.转载出处 http://blog.csdn.net/qq2399431200/a ...
- Group by、having、order by、Distinct 使用注意事项
直奔主题,如下SQL语句 SELECT COUNT(*) AS COUNT,REQUEST,METHOD FROM REQUESTMETH GROUP BY REQUEST,METHOD HAVING ...
- 你不知道的https工作原理
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块.服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据 1. ...
- [PY3]——字符串的分割、匹配、搜索方法总结
?分割.匹配.搜索时可以用到什么样的解决方法? 分割方法总结 1. str.split( ) * 分割字符串 * 返回列表 s1='I love python' # 默认以空格为界定符,且多个空格都当 ...
- CUBA-Platform将全面助力中国开发者
关注CUBA的伙伴们,你们好! 今天我们有新的进展告诉大家. 九月十五日到十六日CUBA平台事业部负责人(同时也是Haulmont公司合伙人)专程来到中国与CUBA中国团队进行了两天时间的交流.讨论. ...
- XML的基本概念和Android下的使用
1. XML的基本概念 1. 什么是XML: 1). XML是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML.它被设计的宗旨是表示数据,而非 ...
- ios碎片小记
一.UIImageView 1.图片形状设为圆形时可能会由于图片的宽高比例导致显示出来的效果不是圆形 解决:设置UIImageView的contentMode为UIViewContentModeSca ...
- Lambda表达式&匿名方法
“Lambda表达式“(lambda Expression)就是一个匿名函数(匿名方法),lambda表达式基于数学中的入演算得名. lambda运算符:所有的lambda表达式都是用新的lambda ...
- 如鹏网学习笔记(十五)ASP.NET MVC核心基础笔记
一.ASP.Net MVC简介 1,什么是ASP.NET MVC? HttpHandler是ASP.net的底层机制,如果直接使用HttpHandler进行开发难度比较大.工作量大.因此提供了ASP. ...