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

來源:互聯網
上載者:User

標籤:square   pytho   for   iter   記憶體   icm   class   裝飾器   使用   

裝飾器

 

1.速查筆記

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

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

經典樣本:

# -*-  coding:utf-8 -*-import timedef 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的記憶體位址@timerdef 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 btest = fib(10)print(test.__next__())print(next(test))for i in test:    print(i)

 

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.