生成式,生成器,迭代器,装饰器
列表生成式:可以对一组元素进行过滤,还可以对得到的元素进行转换处理;
例子:a=[x*x for x in xrange(10) if x*x%2==0]
列表生成器:最简单的办法,把原来的生成式的[]换成()就ok了;
lt = (x*x for x in xrange(1,10) if x%2==0)
print(type(lt))
print(lt.next())
for i in lt;
print (i)
生成式和生成器的区别:
一个直接返回了表达式的结果列表,
而另一个是一个对象,该对象包含了
对表达式结果的计算引用,通过循环
可以直接输出;
生成器不会一次性列出所有的数据,
当你用到的时候,在列出来,更加
节约内存的使用率;
yield语句:
当函数被调用时,他们返回一个生成器对象,
这个对象支持迭代器接口。每当遇到yield关键字
的时候,你可以理解函数的return 语句,yield
后面的值就是返回值,但是不像一般的函数在
return后退出去,生成器函数在生成值后会
自动挂起并暂停他们的执行和状态,他的本地变量
将保存状态信息,这些信息在函数恢复时将再度
有效;
可迭代对象:可以通过循环调用出来的,就是可迭代的对象[],{},(),生成式;
迭代器:生成器,必须通过next函数调用的;
装饰器:其实就是一个以函数作为参数并返回一个替换函数的可执行函数;
def outer(some_func):
def inner():
print "before some_func"
ret = some_func()
return ret + 1
return inner
def foo():
return 1
decorated = outer(foo)
decorated()
函数装饰器 @ 符号:
@ wrapper
def add(a, b):
return Coordinate(a.x + b.x, a.y + b.y)
调用wrapper函数来装饰add函数;
练习题:用函数实现9*9乘法口诀
def func(n):
for i in xrange(1,n):
yield " ".join(["{0}*{1}={2}".format(x,i,x*i) for x in xrange(1,i+1) ])
for i in func(10):
print i