zoukankan      html  css  js  c++  java
  • python 装饰器、生成器、迭代器

    # 装饰器
    '''
    由高阶函数(把一个函数名当作实参传递给另一个函数,返回值中包含函数名)

    嵌套函数(函数中嵌套函数)组成
    功能:在不更改原函数的代码和调用方式的前提下添加新的功能

    装饰器本身就是一个函数。使用方法如

    装饰器函数

    1、自动执行装饰器函数login并且被装饰的函数名(index)当做参数传递给函数(fun = index
    2、将装饰函数login的返回值auto重新赋值给被装饰的函数
    '''

    example
    # 如果被装饰的函数带参数
    def login(fun):
        def auto():
            print("add new Function")
            fun()
        return auto
    
    @login
    def index():
        print("in the index")
    
    index()
    
    
    # *args, **kwargs 万能参数, *args 传位置参数并将参数转换成为一个元组格式, **kwargs 传关键字参数,并转换成字典格式

    def login(fun):
        def auto(*args, **kwargs):
            print("add new Function")
            fun(*args, **kwargs)
        return auto
    
    
    @login
    def admin(name):
        print("the admin user name is {_name}".format(_name=name))
    
    admin("babi")
    # 场景应用,三个页面(index,admin,information)进入首页不用登录,进入后台和用户信息页面需要登录

    name, pwd = "jian", "0325"
    
    def login(fun):
        def demo(*args, **kwargs):
            usname = input("Username:").strip()
            passwd = input("Password:").strip()
            if usname == name and passwd == pwd:
                print("welcome to shopping car!")
                return fun(*args, **kwargs)
            else:
                print("Input error")
        return demo
    
    
    def index():
        print("in the index...........")
    
    
    @login
    def admin():
        print("in the admin===================")
        return "admin"
    
    
    @login
    def information(fuck):
        print("in the information-----------------{fa}".format(fa=fuck))
    
    
    index()
    
    admin()
    
    information('fuck fuck fuck')
    # 生成器 generator   
    可以在函数执行的过程中执行其他操作
    '''
    生成器本身也是一个函数,加上yield就变成了一个生成器,执行只能通过next一步步执行
    一般函数执行的时候都是一次性把整个函数执行完才能去执行其他的命令,而生成器是可以自由的进出函数内部,在执行过程中增加其他操作
    '''
    # example

    # 普通函数
    def fun():
        for i in range(4):
            print(i)
    
    fun()   # 0 1 2 3
    # 生成器函数,需要调用next才能一步步执行
    
    
    def test1():
        for j in range(3):
            print(j)
            yield
    
    yi = test1()    # test1() = <generator object test1 at 0x00000272AD062DB0> 生成器对象
    yi.__next__()
    print("做点其他事情")
    yi.__next__()

    # 生成器捕获异常方法

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b     # 相当于 c = (b, a+b)  a = c[0] b=c[1]
            n += 1
        return 'done'   # 直接使用__next__函数,如果调用的次数超过应有的次数,就会抛一个异常StopIteration,return指定报异常的值
    
    fi = fib(5)
    # try except 捕获error 并自定义 error 输出的警告代码, except 后指定报错的类型(StopIteration)
    while True:
        try:
            x = next(fi)
            print(x)
        except StopIteration as e:
            print('Error code return value', e.value)
            break

    # 迭代器

    from collections import Iterable  # 引用迭代对象
    from collections import Iterator  # 引用迭代器对象
    # Iterable 迭代对象(可循环的对象)
    '''
    string、列表、集合、元组、字典等
    '''
    
    # Iterator 迭代器对象 可以被next()函数调用并返回下一个值的对象 (迭代对象有next方法就成为迭代器对象:
    例如:a=[1,2,3],dir(a)不包含next方法,就不是迭代器对象),可以用isinstance判断是否是 print(isinstance([], list)) # True print(isinstance([], Iterator)) # False # 迭代对象可以通过iter()函数转换为 迭代器对象 print(isinstance(iter([]), Iterator)) # True
     
  • 相关阅读:
    app测试和web测试的相同点和不同点
    重写 和 重载
    23种设计模式总概括
    小程序webview跳转页面后没有返回按钮完美解决方案
    服务器配置https协议,三种免费的方法
    Android通过外部浏览器调用微信H5支付,Android+PHP详解
    vue多级复杂列表展开/折叠,全选/分组全选实现
    A very good RPC debugging session
    在WinForms中使用ActiveX
    Lauch Debugger automatically when start the process
  • 原文地址:https://www.cnblogs.com/Upward-man/p/6150175.html
Copyright © 2011-2022 走看看