標籤:

Day9,回調函數,裝飾函數

一、回調函數

1. 定義:

是在某一個函數中調用另一個函數變數方式,來執行另一個函數

2. 示例分析

import random as rddef newRN(callback): # 生成10個[0,1)之間的數 ns = [] for i in range(10): ns.append(round(rd.random(), 2)) # 不用直接return,因為調用方告知不接收返回結果 # 改成回調的方式來接收 callback(ns)# 定義回調函數def callback_(numbers): # 進入到本函數內,意味著被調用方的函數已執行完畢 print(numbers)print(newRN(callback_))

3. 函數運用步驟

1)在調用方來聲明回調函數

2)如果需要回傳數據,在回調函數的參數列表中定義參數

3)在調用第三方(被調用方)功能函數時,將回調函數作為參數傳入

4)在被調用方的函數內,將完成的數據通過回調函數回傳給調用方

回調函數 是調用方為了接收被調用方返回的數據而聲明的,之前的方式調用某一個函數時,它可以直接通過 return 返回數據,但是在被調用方返回數據之前,調用方只能等待。而回調函數,對於調用方來說,不用等待,只需要提供一個地方(回調函數)來接收被調用方處理的數據結果即可。

註: 回調函數在調用方定義, 在調用第三方函數時,直接將回調函數的名字傳給第三方函數, 在第三方函數內部,等數據或功能完成後,再通過回調函數的名字,來執行回調函數

4. 練習:

定義函數,實現生成 n 個 點坐標(x , y), 每生成10個點後,調用回調函數。 並將生成 10個點 和 開始生成10個點的時間戳,在回調函數中每次一行寫入到 pots.dat文件中。

要求: 時間要轉成yyyy-mm-dd hh:mm:ss 格式,每一次信息都在同一行

文件模式: 『a+b』

二、裝飾函數

1.定義

裝飾器用來實現一種AOP切面功能,即一些函數在調用前都必須實現的功能,比如用戶是否登錄,用戶是否有許可權, 數據讀寫操作前打開事務等之類需求,由裝飾器來實現比較容易。

本意: 不修改現有的函數時,需要對函數進行額外地擴展功能,需要使用裝飾函數。

使用場景: 測試函數運行的時間, 在事務處理時的提交事務(資料庫),列印日誌等。

2. 如何定義裝飾函數:

def loging(fn): # 1. 函數參數必須且只能為一個參數,代表某一個被修飾的函數名 # 2. 定義一個包裝函數 def wrapper(*args, **kwargs): # 3. 包裝函數名可以任一命名,參數必須是*args, **kwargs # 4. 編寫擴展的功能語句 print(『———』) # 5. 調用被修飾的函數 # 調用時,必須傳入 wrapper包裝函數中的兩個參數:*args, **kwargs return fn(*args, **kwargs) # 返回結果, 如果想在函數調用後擴展功能,修改如: # result = fn(*args, **kwargs) # 6. 被修飾函數調用後的 擴展功能 # print(『*******』) # return result return wrapper # 7 最後,為裝飾函數返回 包裝函數名

3. 如何使用修飾函數:

在某一個現有函數上一行: @修飾函數名,如:@logingdef add(x, y): return x + yadd(10, 20)

4. 被修飾的函數執行的過程

1) 調用被修飾的函數, 在Python解析器,發現有一個裝飾函數, 停止對被修飾函數的調 用,轉到2步。

2) 調用裝飾函數,同時傳一個被裝飾的函數名,發現裝飾函數返回了一個其內部包裝(wrapper)函數,轉入第3步。

3) 調用裝飾函數的包裝函數,同時傳入被裝飾函數中的實際參數,在包裝函數中調用被裝飾的函數,在調用它的前後可以擴展自己的功能。最後 將 被裝飾函數返回的結果 返回給調用的地方,即轉給第1步的調用位置。

5. 練習:

1. 定義一個裝飾函數,實現對被裝飾函數的參數值範圍進行判斷,

如果超出了 1000的範圍,則列印警告。

addSalary(10000)

addSalary(500)

2. 定義一個裝飾函數,監測查詢函數(自定義)中是否包含 id屬性,

如果不包含,則列印警告。

queryStu(name=『disen』)

queryStu(id=『101』)


推薦閱讀:

python模擬登陸的時候,別人用的是js生成的驗證碼(純字元)如何獲得生成的動態頁面?
Python從零開始系列連載(26)——Python特色數據類型(函數)(上)
01 貓眼電影-最受期待榜榜單
請問安裝完anaconda後在開始的菜單中沒有Anaconda文件夾怎麼辦?
Python學到什麼樣子可以去找工作?

TAG:Python |