您的位置:首页 > 编程语言 > Python开发

python生成式生成器详细解答

2015-07-21 00:00 696 查看
摘要: python生成式生成器详细解答

Python得yield关键字,yield是python中的生成器
了解生成器需要先了解什么是生成式,切片的目的是从已有的列表中切出一部分返回,而生成式的目的则是从无到有的构建一个列表
一个生成式的案例
假如构建一个含有10个元素的列表,可以怎么做?
这里可以使用python的一个内置函数range来生产一些数字,然后利用循环填充到一个列表中

list = []
for i in range(1,11):
list.append(i)
print(list)

那么使用生成式应该怎么实现呢?

list = [x for x in range(1,11)]
print(list)

生成式还可以像for一样支持嵌套,支持多级嵌套
由于生成式只能采用[]这种方式,所以只能生产list类型的数据结构,所以生成式,通常情况下我们称之为:列表生成式
同时也可以用来生成集合,只要把[]替换成{}

一个实例

l = {x for x in range(1,11)}


print(l)
当然可以写成

print({x for x in range(1,11)})


python语句越简洁越好,这就是python所追求的简洁

生成器是什么?
生成器是这样一个函数,记住上一次返回时在函数体重的位置,对生成器函数的第二次调用跳转至该函数中间
上次调用的所有局部变量都不变
yield生成器
生成器就是迭代器,生成器就是一种迭代器,生成器拥有next方法并且行为与迭代器完全相同,因此
生成器也可以用于python的for循环当中

yield指令,可以暂停一个函数并返回中间结果,使用该指令的函数保存执行环境,并且在必要时回复,
生成器比迭代器更加强大也更加复杂

在python当中,当你定义了一个函数,使用了yield关键字时,这个函数就是一个生成器
函数返回的是一个对象,不是平常函数所用的return语句那样得到的是结果值。
生成器对象支持几个方法next(),send(),throw()

怎样理解?
一个实例:

def get():
yield 0
yield 1
yield 2
get()
调用这个函数得到的结果是<function get 0x00B2CB70>

说明这确实是一个函数类型,

g=get()


第一次调用生成器的next方法时,生成器才开始执行生成器函数
知道遇到yield暂时停止执行,并且yield的参数将作为此次next方法的返回值

next(g)     0
之后每一次调用生成器的next方法,生成器将从上次暂停执行的位置恢复执行
生成器函数,直到咱一次遇到yield时暂停,同样的yield的参数将作为next犯方法的返回值
next(g)     1

def fib():
a,b=0,1
while True:
yield b
a,b=b,a+b
for num in fib():
if num>100:
break
print(num)


那么send()方法呢。
send是恢复生成器的方法,yield可以有一个值,而这个值是在生成器的send方法被调用从而恢复执行的,调用send方法的参数

def repeater():
n=0
while True:
n=yield n
r=repeater()
next(r)
r.send(10)

调用send传入非None值前,生成器必须处于挂起状态,否则会抛出异常
不过,未启动的生成器仍可以使用None作为参数调用send

print list,type(list)
如何生成斐波那契数列?

清单1.简单输出斐波那契数列的前N个数

def fab(max):
n,a,b=0,0,1
L=[]
while n<max:
L.append(b)
a=b
b=a+b
n=n+1
return L
for n in fab(5):
print n

初学python不久,综合整理的文章,如有不足或者错误,欢迎大家指责。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python生成式 python