生成式,生成器,迭代器,装饰器

列表生成式:可以对一组元素进行过滤,还可以对得到的元素进行转换处理;

例子: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

posted on 2017-11-04 08:50  阿文闲聊  阅读(134)  评论(0编辑  收藏  举报