Python之路----------生成器

一、列表生成式

想想如何创建一个列表[0,1,2,3,4,5]

1 l = [0,1,2,3,4,5]

如果上面的列表元素足够多的话,是不是会写很多代码?看看列表生成式怎么写

1 #列表生成式
2 l = [x for x in range(6)]
3
4 #上面的代码相当于
5 l = []
6 for x in range(6):
7     l.append(x)
8
9 #用列表生成式可以节省代码,快速生成列表

二、生成器(generator)

什么是生成器?

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)。

生成器只有在调用时才会生成相应的数据,生成器只记录当前位置并且生成器只有一个__next__()方法,但是一般不用next方法都用循环去调用生成器。

 1 import time
 2 a = time.time()
 3 l = [x for x in range(30000000)]
 4 b = time.time()
 5 print(b-a)
 6
 7 a = time.time()
 8 g = (x for x in range(30000000))
 9 b = time.time()
10 print(b-a)
11
12
13 #l列表生成时间会很久,也很占内存,而g是用生成器没有耗时(原因是生成器调用才有数据)

斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波纳契数列以如下被以递归的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>2,n∈N*)在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用,为此,美国数学会从1963起出版了以《斐波纳契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。

1 def fib(max):
2     n, a, b = 0, 0, 1
3     while n < max:
4         print(b)
5         a, b = b, a + b
6         n = n + 1

生成器函数版本:

1 def fib(max):
2     n, a, b = 0, 0, 1
3     while n < max:
4         yield b
5         a, b = b, a + b
6         n = n + 1

三、生成器牛逼的用法

生成器并行计算(简单的生产者消费者模型)异步IO模型雏形

 1 #coding=utf-8
 2 import time
 3 from random import choice
 4
 5 def producer():
 6     mooncake = ["五仁馅", "咸蛋黄馅", "黑芝麻馅", "青红丝馅", "猪肉馅", "咸鱼馅"]
 7     c = consumer(‘Mr.A‘)
 8     c1 = consumer(‘Mis.B‘)
 9     c.__next__()
10     c1.__next__()
11     print("食品厂开始生产月饼了")
12     n = 0
13     while n < 3:
14         time.sleep(1)
15         mooncake1 = choice(mooncake)
16         print("食品厂生产了%s月饼" % mooncake1)
17         c.send(mooncake1)
18         mooncake2 = choice(mooncake)
19         print("食品厂生产了%s月饼" % mooncake2)
20         c1.send(mooncake2)
21         n += 1
22
23 def consumer(name):
24     print("%s 准备开始吃月饼了" % name)
25     while True:
26         mooncake = yield
27         print("%s吃掉了%s月饼" % (name, mooncake))
28
29 producer()
时间: 2024-10-12 14:28:13

Python之路----------生成器的相关文章

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

七日Python之路--第十二天(Django Web 开发指南)

<Django Web 开发指南>.貌似使用Django1.0版本,基本内容差不多,细读无妨.地址:http://www.jb51.net/books/76079.html (一)第一部分 入门 (1)内置数字工厂函数 int(12.34)会创建一个新的值为12的整数对象,而float(12)则会返回12.0. (2)其他序列操作符 连接(+),复制(*),以及检查是否是成员(in, not in) '**'.join('**')   或  '***%s***%d' % (str, int)

Python之路【第三篇】:Python基础(二)

Python之路[第三篇]:Python基础(二) 内置函数 一 详细见python文档,猛击这里 文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 一.打开文件 1 文件句柄 = file('文件路径', '模式') 注:python中打开文件有两种方式,即:open(...) 和  file(...) ,本质上前者在内部会调用后者来进行文件操作,推荐使用 open. 打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作.

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python之路_Day5

Python之路_Day5_课堂笔记 ---------------------------------------------------------------------------------------------------- 前期回顾: 一.python基础 二.基本数据类型 int str list tuple dict set 三.函数式编程 四.装饰器 1.将func当作参数传递给装饰器,并执行 2.将装饰器函数的返回值重新赋值给func ------------------

Python之路【第十七篇】:Django【进阶篇 】

Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去调用数据访问层执行数据库操作 import MySQLdb def GetList(sql): db = MySQLdb.connect(user='root', db='wupeiqidb', passwd='1234', host='localhost')

七日Python之路--第九天

众所周知,代码这东西不是看出来的.程序这东西只哟一个标准. 下面找点开源的东西看看,学习一下大婶们的犀利编码...... 推荐一下: 虽然有点老了:http://www.iteye.com/topic/405150,还有就是GitHub上面搜索一下Django就能出来很多,当然还有OSChina.只是有个问题,就是Django版本不同,具体的内容可能会有些不同,但大概还是相同的.领略即可,然后书写自己的代码. 首要的还是官方文档. 看着还是有些难度的.偶然发现一个不错的Blog:http://w

Python之路【第十九篇】:爬虫

Python之路[第十九篇]:爬虫 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本.另外一些不常使用的名字还有蚂蚁.自动索引.模拟程序或者蠕虫. Requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务. import

Python之路【第七篇】:线程、进程和协程

Python之路[第七篇]:线程.进程和协程 Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 #!/usr/bin/env python # -*- coding:utf-8 -*- import threading import time   def show(arg):     time.sleep(1)     print 'thread'+str(arg)   for i in