码迷,mamicode.com
首页 > 编程语言 > 详细

python生成式生成器详细解答

时间:2015-07-22 00:11:39      阅读:214      评论:0      收藏:0      [点我收藏+]

标签:

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生成式生成器详细解答

标签:

原文地址:http://my.oschina.net/u/2391943/blog/481617

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!