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
相關文章
相關標籤/搜索