# from collections import Iterable # # l = [1, 2, 3, 4] # t = (1, 2, 3, 4) # d = {1: 2, 3: 4} # s = {1, 2, 3, 4} # # print(isinstance(l, Iterable)) # print(isinstance(t, Iterable)) # print(isinstance(d, Iterable)) # print(isinstance(s, Iterable)) # l = [1,2,3,4] # l_iter = l.__iter__() # while True: # try: # item = l_iter.__next__() # print(item) # except StopIteration: # break # import time # def genrator_fun1(): # a = 1 # print('现在定义了a变量') # yield a # b = 2 # print('现在又定义了b变量') # yield b # # g1 = genrator_fun1() # print('g1 : ',g1) #打印g1可以发现g1就是一个生成器 # print('-'*20) #我是华丽的分割线 # print(next(g1)) # time.sleep(1) #sleep一秒看清执行过程 # print(next(g1)) # 初识生成器二 # def produce(): # """生产衣服""" # for i in range(2000000): # yield "生产了第%s件衣服"%i # # product_g = produce() # print(product_g.__next__()) #要一件衣服 # print(product_g.__next__()) #再要一件衣服 # print(product_g.__next__()) #再要一件衣服 # num = 0 # for i in product_g: #要一批衣服,比如5件 # print(i) # num +=1 # if num == 5: # break # 到这里我们找工厂拿了8件衣服,我一共让我的生产函数(也就是produce生成器函数)生产2000000件衣服。 # 剩下的还有很多衣服,我们可以一直拿,也可以放着等想拿的时候再拿 # 复习完美装饰器 # from functools import wraps # # # def wrapper(func): # @wraps(func) # def inner(*args, **kwargs): # '''之前要做的事情''' # ret = func(*args, **kwargs) # '''之后要做的事情''' # return ret # # return inner # 带参数的完美装饰器 # from functools import wraps # # def outer(形参): #统一管理该函数 # def wrapper(func): # @wraps(func) # def inner(*args, **kwargs): # '''之前要做的事情''' # ret = func(*args, **kwargs) # '''之后要做的事情''' # return ret # # return inner # return wrapper # # 多个装饰器修饰同一个函数 # 记住俄罗斯套娃的顺序 1,2,3,被修饰的函数,3,2,1 # def wrapper1(func): # def inner(*args, **kwargs): # '''之前要做的事情''' # print('before 1') # ret = func(*args, **kwargs) # '''之后要做的事情''' # print('after 1') # return ret # # return inner # # def wrapper2(func): # def inner(*args, **kwargs): # '''之前要做的事情''' # print('before 2') # ret = func(*args, **kwargs) # '''之后要做的事情''' # print('after 2') # return ret # # return inner # # @wrapper1 # @wrapper2 # def func(): # pass # func() # 可迭代对象和迭代器 # 双下方法 # print([1].__add__([2])) #底层代码 # print([1]+[2]) # 迭代器 # l = [1,2,3] # print('__iter__' in dir(bool)) # print('__iter__' in dir(l)) # print('__iter__' in dir({})) # print('__iter__' in dir('')) # print('__iter__' in dir(set)) # print('__iter__' in dir(tuple)) # print('__iter__' in dir(range(1))) # print('__iter__' in dir(enumerate([]))) # 可迭代协议————只要含有__iter__方法的就是可迭代的_ # [].__iter__()迭代器-->__next()__ 通过next从迭代器中一个一个取值 # print('__iter__' in dir([].__iter__())) # print('__next__' in dir([].__iter__())) # 迭代器同时有iter和next方法 # from collections import Iterator # from collections import Iterable # print(isinstance([],Iterable)) # print(isinstance([],Iterator)) # 可见列表是可迭代对象但却不是迭代器 # 可迭代协议————只要内部含有__iter__方法的就是可迭代的_ # 迭代器协议————只要内部含有__next__和__iter__方法的就是迭代器 # 可以被for循环的就是可迭代对象 # 可迭代内部都有__iter__方法 # 迭代器一定是可迭代对象,可迭代对象不一定是迭代器 # 可迭代对象.__iter__()就是可以生成一个迭代器 # 迭代器通过.__next__()就可以一个一个取值 # for循环其实就是在使用迭代器 # from collections import Iterator # from collections import Iterable # l=range(100) # for i in l: # pass # iterator=l.__iter__() # print(isinstance(l,Iterable)) # print(isinstance(l,Iterator)) # print(isinstance(iterator,Iterable)) # print(isinstance(iterator,Iterator)) # for循环先将可迭代对象转换成迭代器,再用__next__方法取值 # for循环其实就是在使用迭代器 # 迭代器的好处 # 一个一个取值,会把所有值的取到 # 一次只取一个值,节省内存空间 # 生成器————自己写的迭代器 # 生成器函数 # 生成器表达式 # 生成器表达式 # l =[1,2,3,4,5] # for i in l: # print(i) # if i == 2: # break # for i in l : # print(i) # def generator(): #普通函数 # print(1) # return 'a' # ret = generator() # print(ret) # 生成器函数 # 只要是内部含有yield关键字的函数都是生成器函数 # yield不能和return函数共用,且需写在函数内部 # def generator(): # print(1) # yield 'a' # #执行之后会得到一个生成器作为返回值 # ret = generator() # print(ret) #生成器 # print(ret.__next__()) # def generator(): # print(1) # yield 'a' # print(2) # yield 'b' # yield 'c' # g = generator() # for i in g: # print(i) # # ret = g.__next__() # print(ret) # ret = g.__next__() # print(ret) # ret = g.__next__() # print(ret) # 娃哈哈%i # def wahaha(): # for i in range(2000000): # yield '娃哈哈%s'%i # g = wahaha() # g1 = wahaha() # print(g.__next__()) # print(g1.__next__()) # g = wahaha() # count = 0 # for i in g: # count +=1 # print(i) # if count > 50: # break # print('*******',g.__next__()) # for i in g: # count +=1 # print(i) # if count > 100: # break # 监听文件输入 # def tail(filename): # f = open(filename, encoding='utf-8') # while True: # line = f.readline() # if line.strip(): # yield line.strip() # # # g = tail('msg') # # print(g) #此时g是一个生成器 # for i in g: # if 'python' in i: # print("***", i)