1. 程式人生 > >對於回調函數的理解

對於回調函數的理解

none fine 解釋 好的 它的 chunk 實現 參數傳遞 兩個

  關於回調函數,網上有很多說明和各種解釋,多數在嘗試用語言描述。我認為,如果對各個角色之間的關系不清楚,如果沒有相關的編程需求,那麽語言便非常無力,很難理解。

這是360百科的解釋:

  在計算機程序設計中,回調函數,或簡稱回調,是指通過函數參數傳遞到其它代碼的,某一塊可執行代碼的引用。這一設計允許了底層代碼調用在高層定義的子程序。
  【什麽是其它代碼?什麽是某一塊?什麽是可執行?什麽是引用?什麽是允許?什麽是底層代碼?什麽是高層定義?什麽是子程序?這些詞,每一個詞都有很多含義,如果你理解回調,那麽這個定義描述得非常準確,如果你不理解回調,那麽等於沒說,文字都認識,連起來不知道啥意思。】

這是知乎的一個解釋:

  https://www.zhihu.com/question/19801131

還有些用指針來進行說明

   如果一個人不知道回調,他很可能也不了解指針這個C語言中的核心。

一圖解千言,一例解千言,下面是一個python中的回調函數例子,可能可以有效地說明什麽是回調函數

urlretrieve(url, filename=None, reporthook=None, data=None)

這是urllib.request中的一個函數,用於直接將遠程數據下載到本地。

  • url是你要下載的鏈接
  • 參數 finename 指定了保存本地路徑(如果參數未指定,urllib會生成一個臨時文件保存數據。)
  • 參數 reporthook 是一個回調函數,當連接上服務器、以及相應的數據塊傳輸完畢時會觸發該回調,我們可以利用這個回調函數來顯示當前的下載進度
  • 參數 data 指 post 到服務器的數據,該方法返回一個包含兩個元素的(filename, headers)元組,filename 表示保存到本地的路徑,header 表示服務器的響應頭。

  註意看reporthook,作為一名使用Python做開發的程序員,你不是在為Python開發插件,而是在用現成的插件去實現你的功能,那麽,Python和它的插件,整體上是封閉的,假裝你看不到Python的源代碼。

  此時,你要使用urlretrieve這個函數,分以下幾種情況:

  1.你可以只用一個參數的,即urlretrieve(url),那麽你只能把遠程的鏈接所打開的頁面存到本地。

  2.除了查看那個實際下載的文件是否完成和在控制臺中查看程序的執行結束以外,實際上你無法知道1的進度,也無法知道是否下載成功。那麽,此時reporthook就有作用了,你需要給urlretrieve傳一個你本地函數的名字,帶著3個參數(假設這個函數是func(a,b,c),函數名是func),在你無法看到的urlretrieve內部,必要的時候,它會調用你傳給它的這個函數(func),把合適的數據賦給這個func的3個參數,然後,你就可以在你本地處理這3個參數,比如,打印出來。

  這三個參數,按順序分別表示:已經下載的數據塊、數據塊的大小、遠程文件的大小,得到這幾個數據,我們就可以得到下載的進度。

  以下是官方文檔中的說明:

   If reporthook is given, it must be a function accepting three numeric parameters: A chunk number, the maximum size chunks are read in and the total size of the download (-1 if unknown). It will be called once at the start and after each chunk of data is read from the network. reporthook is ignored for local URLs.

來源:https://docs.python.org/3.6/library/urllib.request.html#module-urllib.request

以下是代碼:

import urllib

def cbk(a, b, c): 

    ‘‘‘回調函數
    @a: 已經下載的數據塊
    @b: 數據塊的大小
    @c: 遠程文件的大小
    ‘‘‘ 
    per = 100.0 * a * b / c 

    if per > 100: 
        per = 100 
    print(%.2f%% % per)
   
url = http://www.bing.com
local = d://bing.html
urllib.urlretrieve(url, local, cbk)

(以上代碼來自http://www.nowamagic.net/academy/detail/1302861)

這是你作為一個使用者,使用別人設計好的函數時的情況。

 

對於回調函數的理解