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
 
原文地址:https://www.cnblogs.com/Upward-man/p/6150175.html