• 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)
  • 相关阅读:
    设计模式总结——程序猿的武功秘籍(上)
    php获取分类以下的全部子类方法
    TypeError: Cannot read property 'style' of null 错误解决
    Java抽象类
    PHP_SELF、 SCRIPT_NAME、 REQUEST_URI差别
    [WPF]使用Pack URI路径訪问二进制资源
    Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组
    Android JNI编程(四)——C语言多级指针、数组取值、从控制台输入数组
    Android JNI编程(三)——C语言指针的初步认识、指针变量、互换两个数、函数返回多个值
    Android JNI编程(二)——C语言的基本数据类型,输出函数,输入函数
  • 原文地址:https://www.cnblogs.com/wujunjie-sir/p/9198207.html
Copyright © 2020-2023  润新知