• day13迭代器、生成器


    1.复习

    # 函数 —— 2天
        # 函数的定义和调用
        # def 函数名(形参):
            #函数体
            #return 返回值
        #调用 函数名(实参)
        # 站在形参的角度上 : 位置参数,*args,默认参数(陷阱),**kwargs
        # 站在实参的角度上 : 按照位置传,按照关键字传
        # 返回值:没有返回值 返回一个值 返回多个值
        # 接收返回值:没有返回值不接收,返回一个值用一个变量接收,返回多个值用一个变量或者对应数目的变量接收
    # 闭包函数 —— 在内部函数引用外部函数的变量
    # 装饰器函数—— 装饰器一定是闭包函数
        # 装饰器的作用 : 在不改变原来函数的调用方式的情况下 在这个函数的前后添加新的功能
        # 完美的符合了一个开发原则 :开放封闭原则
            # 对扩展是开发的
            # 对修改是封闭的
        # 基础的装饰器
            # from functools import wraps
            # def wrapper(func):
            #     @wraps(func)
            #     def inner(*args,**kwargs):
            #          '''在函数被调用之前添加的代码'''
            #         ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用
            #         '''在函数被调用之后添加的代码'''
            #         return ret
            #     return inner
            # 使用 —— @wrapper
            # @wrapper
            # def func():   #inner
            #     pass
            #
            # func.__name__
        # 带参数的装饰器
            # @wrapper -- > @warapper(argument)
            # 三层嵌套函数
            # def outer(形参):
            #     def wrapper(func):
            #         def inner(*args,**kwargs):
            #             '''在函数被调用之前添加的代码'''
            #             ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用
            #             '''在函数被调用之后添加的代码'''
            #             return ret
            #         return inner
            #     return wrapper
            # @outer(True)
            # def func():
            #     pass
        # 多个装饰器装饰一个函数
            # 俄罗斯套娃
    
        #def wrapper1(func):
            #     @wraps(func)
            #     def inner(*args,**kwargs):
            #         print('before 1')
            #         print('******')
            #         ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用
            #         '''在函数被调用之后添加的代码'''
            #         return ret
        # def wrapper2(func):
        #     @wraps(func)
        #     def inner(*args,**kwargs):
        #         print('before 2')
        #         ret = func(*args,**kwargs)   # func是被装饰的函数 在这里被调用
        #         '''在函数被调用之后添加的代码'''
        #         return ret
        #   @wrapper1
        #   @wrapper2
        #   def func():
        #       print('111')
    # 迭代器和生成器 —— 两天
    # 内置函数 —— 两天
    View Code

    2.迭代器

    # 双下方法
    # print([1].__add__([2]))
    # print([1]+[2])
    
    # 迭代器
    # l = [1,2,3]
    # 索引
    # 循环 for
    # for i in l:
    #     i
    #
    # for k in dic:
    #     pass
    
    
    # list
    # dic
    # str
    # set
    # tuple
    # f = open()
    # range()
    # enumerate
    
    # print(dir([]))   #告诉我列表拥有的所有方法
    # ret = set(dir([]))&set(dir({}))&set(dir(''))&set(dir(range(10)))
    # print(ret)  #iterable
    # print('__iter__' in dir(int))
    # print('__iter__' in dir(bool))
    # print('__iter__' in dir(list))
    # print('__iter__' in dir(dict))
    # print('__iter__' in dir(set))
    # print('__iter__' in dir(tuple))
    # print('__iter__' in dir(enumerate([])))
    # print('__iter__' in dir(range(1)))
    
    # 只要是能被for循环的数据类型 就一定拥有__iter__方法
    # print([].__iter__())
    # 一个列表执行了__iter__()之后的返回值就是一个迭代器
    # print(dir([]))
    # print(dir([].__iter__()))
    # print(set(dir([].__iter__())) - set(dir([])))
    # print([1,'a','bbb'].__iter__().__length_hint__())  #元素个数
    # l = [1,2,3]
    # iterator = l.__iter__()
    # print(iterator.__next__())
    # print(iterator.__next__())
    # print(iterator.__next__())
    # print(iterator.__next__())
    
    # Iterable  可迭代的    -- > __iter__  #只要含有__iter__方法的都是可迭代的
    # [].__iter__() 迭代器  -- > __next__  #通过next就可以从迭代器中一个一个的取值
    
    # 只要含有__iter__方法的都是可迭代的 —— 可迭代协议
    
    # print('__iter__' in dir( [].__iter__()))
    # print('__next__' in dir( [].__iter__()))
    from collections import Iterable
    from collections import Iterator
    # print(isinstance([],Iterator))
    # print(isinstance([],Iterable))
    
    # class A:
    #     # def __iter__(self):pass
    #     def __next__(self):pass
    #
    # a = A()
    # print(isinstance(a,Iterator))
    # print(isinstance(a,Iterable))
    
    
    # l = [1,2,3,4]
    # for i in l.__iter__():
    #     print(i)
    
    # 迭代器的概念
    # 迭代器协议 —— 内部含有__next__和__iter__方法的就是迭代器
    
    # 迭代器协议和可迭代协议
    # 可以被for循环的都是可迭代的
    # 可迭代的内部都有__iter__方法
    # 只要是迭代器 一定可迭代
    # 可迭代的.__iter__()方法就可以得到一个迭代器
    # 迭代器中的__next__()方法可以一个一个的获取值
    
    # for循环其实就是在使用迭代器
    # iterator
    # 可迭代对象
    # 直接给你内存地址
    # print([].__iter__())
    # print(range(10))
    
    #for
    #只有 是可迭代对象的时候 才能用for
    #当我们遇到一个新的变量,不确定能不能for循环的时候,就判断它是否可迭代
    
    # for i in l:
    #     pass
    #iterator = l.__iter__()
    #iterator.__next__()
    
    #迭代器的好处:
        # 从容器类型中一个一个的取值,会把所有的值都取到。
        # 节省内存空间
            #迭代器并不会在内存中再占用一大块内存,
                # 而是随着循环 每次生成一个
                # 每次next每次给我一个
    # range
    # f
    # l = [1,2,3,45]
    # iterator = l.__iter__()
    # while True:
    #     print(iterator.__next__())
    
    # print(range(100000000000000))
    # print(range(3))
    # print(list(range(3)))
    # def func():
    #     for i in  range(2000000):
    #         i = 'wahaha%s'%i
    #     return i
    
    # 生成器 —— 迭代器
    # 生成器函数 —— 本质上就是我们自己写得函数
    # 生成器表达式
    l = [1,2,3,4,5]
    for i in l:
        print(i)
        if i == 2:
            break
    
    for i in l:
        print(i)
    View Code

    3.生成器

    #生成器函数
    def generator():
        print (1)
        print (2)
        return 'a'
    
    ret = generator()
    print(ret)
    
    #只要含有yield关键字的函数都是生成器函数
    # yield不能和return共用且需要写在函数内
    def generator():
        print(1)
        yield 'a'
        print (2)
        yield "b"
    # #生成器函数 : 执行之后会得到一个生成器作为返回值
    ret = generator()
    print(ret)
    print(ret.__next__())
    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
    View Code

    4.监听文件输入的例子

    def tail(filename):
        f = open(filename,encoding='utf-8')
        while True:
            line = f.readline()
            if line.strip():
                yield line.strip()
    
    g = tail('file')
    for i in g:
        if 'python' in i:
            print('***',i)
    View Code
  • 相关阅读:
    ASP.net 上传
    asp.net 上传
    asp.net dropdownlist和listbox
    jqeury之平移轮播
    vs2013的asp.net 管理
    jqeury轮播
    jqeury之轮播图
    重温委托(delegate)和事件(event)
    Log4Net
    解决SQL Server 阻止了对组件 'Ad Hoc Distributed Queries' 的 STATEMENT'OpenRowset/OpenDatasource' 的访问的方法
  • 原文地址:https://www.cnblogs.com/xingqisan/p/10712571.html
Copyright © 2020-2023  润新知