# def aaa(func):# def bbb(*args,**kwargs):# res=func(*args,**kwargs)# return res# return bbb# def auth2(x,y,z):# def auth(func):# def wrapper(*args,**kwargs):# #认证功能# res=func(*args,**kwargs)# return res# return wrapper# return auth#### @auth(1,2,3)# def index():# print('from index')## index()import timefrom functools import wraps #def timmer(func): @wraps(func)#解决,返回帮助信息是原函数的帮助信息的问题,确保,引用返回原函数,帮助信息 def wrapper(*args,**kwargs): 'sssssssssssss' start_time=time.time() func(*args,**kwargs) #home(name) stop_time=time.time() print('run time is %s' %(stop_time-start_time)) return wrapper@timmerdef func(x): 'func test' print(x)func(1)print(func.__doc__)# print(help(func))
迭代器
# l=['a','b','c','d','e']# i=0# while i < len(l):# print(l[i])# i+=1## for i in range(len(l)):# print(l[i])#迭代器列表,元组,字符串有索引,下标,所以是可以用索引来循环, 但是,字典,文件,集合没有索引下标,怎么来遍历取值呢,就用到迭代器,只要有iter方法,就是一个迭代器,取到iter之后,再next方法就 可以遍历完#可迭代的:只要对象本身有__iter__方法,那它就是可迭代的# d={'a':1,'b':2,'c':3}# d.__iter__ #iter(d)###执行对象下的__iter__方法,得到的结果就是迭代器# i=d.__iter__()## print(i.__next__())# print(i.__next__())# print(i.__next__())# print(i.__next__())# d={'a':1,'b':2,'c':3}# i=iter(d)# # while True:# # try:# # print(next(i))# # except StopIteration:# # break#### l=['a','b','c','d','e']# i=l.__iter__()# while True:# try:# print(next(i))# except StopIteration:# break异常捕捉,的语法try: #正常的定义一个监视器,监视下面一句话 passexcept 异常抛出: 执行异常抛出后,你定义的语句
# d={'a':1,'b':2,'c':3}# d.__iter__### for k in d: #d.__iter__() 注意这里出现for的经典,这里的d,就是做了一个迭代器的功能,然后,每次,next取值,这里要放可迭代对像# print(k)### s={1,2,3,4}# for i in s:# print(i)# with open('a.txt','r') as f:# for line in f:# print(line)# f=open('a.txt','r')# f.__next__# f.__iter__# print(f)# print(f.__iter__())## for line in f: #f.__iter__()# print(line)# i=f.__iter__()# while True:# try:# print(next(i))# except StopIteration:# break#为什么要用迭代器: #优点 # 1:迭代器提供了一种不依赖于索引的取值方式,这样就可以遍历那些没有索引的可迭代对象了(字典,集合,文件) # 2:迭代器与列表比较,迭代器是惰性计算的,更节省内存,(迭代器有next方法,指向的就是一个地址,每次next才会把元素 取出来,你比如在for循环文件就是一行行的执行,) #缺点: # 1:无法获取迭代器的长度,使用不如列表索引取值灵活 # 2:一次性的,只能往后取值,不能倒着取值# l=[1,2,3]# # print(len(l))# i=iter(l)## print(next(i))# print(next(i))# print(next(i))# # print(next(i))### for x in i:# print(x)## for x in i:# print(x)## for x in i:# print(x)# for x in i:# print(x)#查看可迭代对象与迭代器对象from collections import Iterable,Iterators='hello'l=[1,2,3]t=(1,2,3)d={ 'a':1}set1={1,2,3,4}f=open('a.txt')#都是可迭代的,列表,元组,集合,字典,文 件# s.__iter__()# l.__iter__()# t.__iter__()# d.__iter__()# set1.__iter__()# f.__iter__()# print(isinstance(s,Iterable)) 正确# print(isinstance(l,Iterable)) 正确# print(isinstance(t,Iterable)) 正确# print(isinstance(d,Iterable)) 正确# print(isinstance(set1,Iterable)) 正确# print(isinstance(f,Iterable)) 正确#查看是否是迭代器,只有文件本身是迭代器,其他,列表,元组,字典,集合,都是可迭代对像,要调用iter方法,转换为迭代器print(isinstance(s,Iterator)) Falseprint(isinstance(l,Iterator)) Falseprint(isinstance(t,Iterator)) Falseprint(isinstance(d,Iterator)) Falseprint(isinstance(set1,Iterator)) Falseprint(isinstance(f,Iterator)) True
#生成器与return有何区别? #return只能返回一次函数就彻底结束了,而yield能返回多次值 生成器也是一次性的, 生成器就是个迭代器,把函数变成迭代器, #yield到底干了什么事情: #1.yield把函数变成生成器-->迭代器,这样就可以用for来循环了, #用return返回值能返回一次,而yield返回多次 #函数在暂停以及继续下一次运行时的状态是由yield保存,每次next取值执行,执行,碰到一个yield就停下来,下次next,又碰到yield停下来 from collections import Iterator#生成器就是一个函数,这个函数内包含有yield这个关键字def test(): print('one') yield 1 #return 1 print('two') yield 2 #return 2 print('three') yield 3 #return 2 print('four') yield 4 #return 2 print('five') yield 5 #return 2g=test()# print(g)# print(isinstance(g,Iterator))# g.__iter__()# g.__next__()# res=next(g)# print(res)## res=next(g)# print(res)## res=next(g)# print(res)## res=next(g)# print(res)## res=next(g)# print(res)## for i in g:# print(i)def countdown(n): print('start coutdown') while n > 0: yield n #1 n-=1 print('done')g=countdown(5)# print(g)# print(next(g))# print(next(g))# print(next(g))# print(next(g))# print(next(g))# print(next(g))# for i in g: #iter(g)# print(i)# while True:# try:# print(next(g))# except StopIteration:# break## def func():# n=0# while True:# yield n# n+=1## f=func()# print(next(f))import timedef tail(file_path): with open(file_path,'r') as f: f.seek(0,2) while True: line=f.readline() if not line: time.sleep(0.3) continue else: # print(line) yield linetail('/tmp/a.txt')
#如果在一个函数内部yield的使用方式是表达式形式的话,如x=yield,那么该函数成为协程函数def eater(name): print('%s start to eat food' %name) food_list=[] while True: food=yield food_list print('%s get %s ,to start eat' %(name,food)) food_list.append(food) print('done')e=eater('钢蛋')# print(e)print(next(e))print(e.send('包子'))print(e.send('韭菜馅包子'))print(e.send('大蒜包子'))#为什么叫协程?#协程怎么用?