python学习day13 迭代器,生成器

# 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)
原文地址:https://www.cnblogs.com/wujunjie-sir/p/9198207.html