1. 程式人生 > >python3 速查參考- python基礎 -> 函數編程之 裝飾器、生成器

python3 速查參考- python基礎 -> 函數編程之 裝飾器、生成器

tps icm com 對象 www turn 局限性 pan rgs

裝飾器


1.速查筆記

#-- 函數裝飾器:是它後邊的函數的運行時的聲明 由@符號以及後邊緊跟的"元函數"(metafunction)組成  
        @staticmethod  
        def smeth(x): print(x)  
    # 等同於:  
        def smeth(x): print(x)  
        smeth = staticmethod(smeth)  

定義:在代碼運行期間動態增加功能的方式,稱之為“裝飾器”(Decorator)

經典示例:

# -*-  coding:utf-8 -*-
import time def timer(func): #把被裝飾的函數ceshi的內存地址傳給了func def deco(*args,**kwargs): start_time = time.time() func(*args,**kwargs) stop_time = time.time() print(測試函數運行時間,(stop_time-start_time)) return deco #返回deco的內存地址 @timer def ceshi(a): time.sleep(
3) print(測試%s%a) ceshi(裝飾器)

2. 原則:①不能修改被裝飾函數的源代碼;②不能修改被裝飾函數的調用方式

3.實現裝飾器的技能儲備

① 函數本身即是變量

② 高階函數,把一個函數名當做實參穿給另一個函數

③ 嵌套函數

參考:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014318435599930270c0381a3b44db991cd6d858064ac0000

生成器


1.速查筆記

#-- 生成器函數:yield VS return  
def gensquare(N): for i in range(N): yield i** 2 # 狀態掛起 可以恢復到此時的狀態 for i in gensquare(5): # 使用方法 print(i, end = ) # [0, 1, 4, 9, 16] x = gensquare(2) # x是一個生成對象 next(x) # 等同於x.__next__() 返回0 next(x) # 等同於x.__next__() 返回1 next(x) # 等同於x.__next__() 拋出異常StopIteration #-- 生成器表達式:小括號進行列表解析 G = (x ** 2 for x in range(3)) # 使用小括號可以創建所需結果的生成器generator object next(G), next(G), next(G) # 和上述中的生成器函數的返回值一致 #(1)生成器(生成器函數/生成器表達式)是單個叠代對象 G = (x ** 2 for x in range(4)) I1 = iter(G) # 這裏實際上iter(G) = G next(I1) # 輸出0 next(G) # 輸出1 next(I1) # 輸出4 #(2)生成器不保留叠代後的結果 gen = (i for i in range(4)) in gen # 返回True in gen # 返回True in gen # 返回False,其實檢測2的時候,1已經就不在生成器中了,即1已經被叠代過了,同理2、3也不在了

2. 生成器表達式

局限性:只能適合簡單的算法

示例:

test = (x**2 for x in range(1,10))
print(next(test))
print(test.__next__())

3. 生成器函數 yield

斐波那契函數的打印示例:

def fib(max):
    a,b,n = 1,1,0
    while n<max:
        yield b
        a,b = b,a+b
        n+=1
    return b
test = fib(10)
print(test.__next__())
print(next(test))
for i in test:
    print(i)

python3 速查參考- python基礎 -> 函數編程之 裝飾器、生成器