2017python学习的第四天,生成器,装饰器迭代器

#先要认识列表生成器
a = [x*2 for x in range(10)]
#他其实就是等于
# b = []
# for x in range(10):
# b.append(x *2)
# print(a,' ',b)
#把[]改成()就是生成器
c = (x*2 for x in range(10))
print(c)#输出结果就是<generator object <genexpr> at 0x0000000000D17BA0>
#他其实就是一个等待调用的函数~本身没有结果等待调用的时候才返回结果,用__next__()来调用

print(c.__next__())
print(c.__next__())
print(c.__next__())
print(c.__next__())
print(c.__next__())


================================================================================
import time


#定义消费者的行为过程
def consumer(name):
print('%s想要吃包子了'%name)
# baozi = yield #在这里需要把上面的执行返回并且中断等待,当有值传进来的时候继续执行下面的代码
while True :
baozi = yield #在这里需要把上面的执行返回并且中断等待,当有值传进来的时候继续执行下面的代码
print('包子%s来了,被%s吃了'%(baozi,name))


#定义生产者的行为过程
def producer():
c = consumer('柳黎')
c1 = consumer('彬彬')
c.__next__()
c1.__next__()
print('生产者开始做包子了')
for i in range(10):
time.sleep(1)
c.send(i)
c1.send(i)
producer()





'''装饰器:
定义:
装饰器本质就是一个函数,
装饰:他就是来装饰其他函数(就是为其他的函数添加附加的功能)
原则:
1.不能修改被装饰的函数的源代码.
2.不能修改被装饰的函数的调用方式
实现装饰器的知识储备:
1.函数即“变量”
2.高级函数
2.1.把一个函数名当作实参传给另外一个函数。
2.2.返回值中包含函数名
3.嵌套函数
“高阶函数+嵌套函数=”装饰器
'''
如果想对装饰器想要比较好一点的了解的话
就把高阶函数先做一次然后再找个的基础上面再做一次嵌套函数就可以理解了

import  time

def timmer(func):
def warpper(*args,**kwargs):
start_time=time.time()
func()
stop_time=time.time()
print('the func run time is %s'%(stop_time-start_time))
return warpper

@timmer

def func1():
time.sleep(3)
print('this is func1')

func1()


'''
迭代器:
首先可以循环的数据类型是
(list,tuple,dict,str,set)
generator,包括生成器和带yield的generator的function
这些都是可以直接作用循环的循环体也可以看作是对象,而这些对象被称为可迭代的对象Iterable
可以用isinstance()来判断是不是iterable

生成器是可以被next()函数不停调用并且返回下一个值,直到最后无法返回下一个值的时候出现异常Stopiteration
而!!!可以被next()调用并且返回下一个值的对象叫做迭代器:Iterator!!!
可以用isinstance()老判断是不是Iterator对象

我的理解(注意不一定正确)
Iterable 其实就是一个循环体

Iterator 其实就是一个函数,他是可以可以被netx()调用并且可以返回值的
那么Iterable是不是可以变成Iterator呢?
是可以的


'''
a = [1,2,3,4] #a是一个list,也可以说是一个Iterable
b = iter(a)#这样就可以把他变成一个Itertor了
#那么b就是可以被next()调用了
print(next(b))
print(next(b))
print(next(b))

'''
list,dict,set,tuple 等等为什么就不能是Iterator呢?
其实最简单的理解方法就是一个[]就是一个固定的值已经确定存在了,而Iterator却是要被调用的时候才有值返回的
'''




原文地址:https://www.cnblogs.com/Howardandlili/p/6812869.html