# 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)