Python中期學者必備之閉包

本文默認定義:

list為列表僅含有自然數元素.


假設進行針對list的排序,最常用的也是最簡單的做法就是調用python內建函數:sort,將輔助函數傳遞給key參數,返回值進行確認各個元素的所在位置,輔助函數可以判斷元素所在群組,返回相應的key.

在簡單的輸入值之後,得到如下結果:


下面由此函數引入,來看一下閉包的概念:

閉包(closure)是函數式編程的重要的語法結構。函數式編程是一種編程範式 (而面向過程編程和面向對象編程也都是編程範式)。在面向過程編程中,我們見到過函數(function);在面向對象編程中,我們見過對象(object)。函數和對象的根本目的是以某種邏輯方式組織代碼,並提高代碼的可重複使用性(reusability)。閉包也是一種組織代碼的結構,它同樣提高了代碼的可重複使用性。

不同的語言實現閉包的方式不同。Python以函數對象為基礎,為閉包這一語法結構提供支持的 (我們多次看到Python使用對象來實現一些特殊的語法)。Python一切皆對象,函數這一語法結構也是一個對象。在函數對象中,我們像使用一個普通對象一樣使用函數對象,比如更改函數對象的名字,或者將函數對象作為參數進行傳遞.

上例子的函數中,help函數訪問外層函數的group參數,調用了作用域以外的變數,就是因為它的閉包屬性.

def sort0(value,group): def help(x): if x in group: return (0,x) return (1,x) value.sort(key=help)list0 = [9,8,5,4,10,5,12]list1 = [8,6,4,5]sort0(list0,list1)print(list0)

上述函數中,help作用域中的group屬於上一層函數,並不在help的範圍內,而卻能成功調用,讓我們不難理解,閉包其實就是一個帶有環境變數的函數.

閉包的基本應用

在日常的開發過程中,閉包的作用可以提高代碼復用性,看下面的例子:

def math_line(a, b): def line(x): return ax + b return line

在上述代碼中,a與b作為外層函數變數被賦值,轉而被內層函數加以利用,ab與line構成一個閉包,使得我們每次要得到不同的直線的時候,只需要改變a與b的參數傳入值即可,這是函數共同的特性,重複使用,閉包也同樣擁有這樣的特性,閉包還比一般的函數更加節省定義的空間,讓函數定義更為整潔.


總結起來,閉包的使用需要有以下三個條件:

  • 閉包函數必須多層函數
  • 內嵌函數需要引用該嵌套函數上一級定義空間中的變數
  • 閉包函數必須返回內嵌函數

關於閉包的使用還需要多練習,閉包對於未來並行計算的實現有著重大的推進作用,有這方面想法的朋友可以多關注.


關注我們 , 每天一起探討關於開發中的新鮮事

剛創了個新QQ群:685012311

歡迎大家進來交流,一起進步 !

每天不斷的乾貨 , 助你成長 .


推薦閱讀:

Python分詞模塊jieba (01)-jieba安裝,分詞,提取關鍵詞,自定義分詞,切換詞庫講解
從1+1到混沌 | Mathematica系列教程·第一集
c語言的發展歷史如何?
C語言基礎:不定參數

TAG:編程 | 閉包 | Python |