• python开发学习day16 (三层装饰器;迭代器)


    2020-06-22                      目录:

    一、嵌套三层的装饰器

    二、迭代器

    2.1  迭代器是什么

    2.2  __iter__方法及其调用

    2.3  可迭代的对象

    2.4  迭代器对象

    2.5  for循环的原理

    2,6  总结迭代器

    一、嵌套三层的装饰器

    通过闭包的方式为函数体传参,可以包一层,也可以包两层

    @后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “@函数名(参数)”的返回值必须是一个函数的内存地址

    示例:

    def outter2(mode):  # mode在outter和wrapper后面传参都不行,只能再包一层函数传参
        def outter(func):
            def wrapper(*args, **kwargs):
                inp_name=input("please input your name: ").strip()
                inp_pwd=input("please input your password: ").strip()
                if mode == "file":
                    print('认证来源=====>file')
                    with open('user.db', mode='rt', encoding='utf-8') as f:
                        for line in f:
                            name_db,pwd_db=line.strip('
    ').split(':')
                            if inp_name == name_db and inp_pwd == pwd_db:
                                print('login successful')
                                res = func(*args, **kwargs)
                                return res
                        else:
                            print("账号或密码错误")
                elif mode == "ldap":
                    print('认证来源=====>ldap')
                elif mode == "mysql":
                    print('认证来源=====>mysql')
                else:
                    print("未知的认证来源")
            return wrapper
        return outter
    
    @outter2(mode="mysql")   # index = outter(index) ==> index = wrapper
    def index(x, y):
        print('index===>', x, y)
    
    
    index(1, 2)    # wrapper(1,2)

    二、迭代器

    2.1  迭代器是什么

    迭代是一个重复的过程,但并不是单纯的重复,它的每一次重复都是基于上一次的结果而来的
    迭代器是一种迭代取值的工具,这种取值方式是通用的,不依赖于索引和key(如:集合和句柄,没有索引和key也可以迭代取值)

    2.2  __iter__方法及其调用

    python为str、list、tuple、dict、set、f文件对象 都内置了__iter__方法
    __iter__调用得到的返回值就是对应的迭代器
    
    l1 = [1,2,3]
    res = l1.__iter__()  就等同于  res = iter(l1)
    print(res)  # >>>  <list_iterator object at 0x000001942A9C4A30>
    a = res.__next__()  # a=next(res)  a=1
    b = res.__next__()  # b=next(res)  b=2
    c = res.__next__()  # c=next(res)  c=3
    d = res.__next__()  # StopIteration 报错,l1只有三个值

    2.3  可迭代的对象

    可迭代的对象:有__iter__内置方法的对象都是可迭代的对象,str、list、tuple、dict、set、文件对象

    2.4  迭代器对象

    可迭代对象.__iter__()得到的返回值就是迭代器对象
    特点:
    ① 有__next__方法
    ② 有__iter__方法,调用得到的就是迭代器自身
    f = open(r'user.db', mode='rt', encoding='utf-8')
    line=f.__next__() # 读第一行
    print(line)
    line=f.__next__() # 读第二行
    print(line)
    f.close()

    2.5  for循环的原理

    for循环的本质就是迭代器的循环
    d = {"k1": 111, "k2": 222, "k3": 3333}
    for k in d:
        print(k)
    工作步骤:① 调用in后面对象的__iter__方法,得到对应的迭代器
         ② k=next(迭代器),然后执行一次循环
         ③ 循环往复,直到把迭代器的值取完,抛出异常,for循环会将自动捕捉异常,然后结束循环

    2.6  总结迭代器

    优点:① 不依赖索引,是通用的取值方式
         ② 节省内存,读取文件时,每次只读一行
    缺点:① 不能取指定位置的值(没有索引和key)
       ② 不能预估值的个数,无法统计长度
  • 相关阅读:
    动态规划之 0-1背包问题及改进
    动态规划之矩阵连乘
    python3 入门 (四) 类与继承
    动态规划之最长公共子序列(LCS)
    java并发包分析之———AQS框架
    java并发包分析之———BlockingQueue
    java并发包分析之———Deque和LinkedBlockingDeque
    java并发包分析之———concurrentHashMap
    java并发包分析之———ConcurrentSkipListMap
    java并发包分析之———Atomic类型
  • 原文地址:https://www.cnblogs.com/cui-cheng/p/13178977.html
Copyright © 2020-2023  润新知