标签:
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不久,综合整理的文章,如有不足或者错误,欢迎大家指责。
标签:
原文地址:http://my.oschina.net/u/2391943/blog/481617