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
相关文章
相关标签/搜索