博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python函数第4天(day 23)
阅读量:6229 次
发布时间:2019-06-21

本文共 5211 字,大约阅读时间需要 17 分钟。

# 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('大蒜包子'))#为什么叫协程?#协程怎么用?

 

转载于:https://www.cnblogs.com/wanchenxi/p/7401572.html

你可能感兴趣的文章
设计模式——单例模式
查看>>
240. Search a 2D Matrix II
查看>>
php-预定义
查看>>
IntelliTrace 调试、定位异常
查看>>
linux Shell脚本编码格式
查看>>
String方法
查看>>
冲刺第五天
查看>>
php操作mysql与sqlite类
查看>>
Bitmap压缩到指定尺寸大小,获取圆角、圆形图片
查看>>
解决:模态框中使用select2下拉选项无法搜索
查看>>
LeetCode OJ:Min Stack(最小栈问题)
查看>>
什么是FPGA,PAL,EPLD?
查看>>
OO第一次博客作业
查看>>
计算机发展史简述
查看>>
wpf 遍历控件及其值
查看>>
Unity5.6.4f1 配置WebGL教程
查看>>
linux -硬盘分区
查看>>
Struts1防止重复提交
查看>>
JS控制滚动条的位置
查看>>
来自我的破船大大的博客,记录他的iOS成长之路,与君同勉!
查看>>