成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python閉包的概念、形式與應用

開發 后端 前端
動態語言因其方便快捷的開發方式成為很多人喜愛的編程語言,伴隨Python等動態語言的流行,我們經常聽到一個名詞——閉包,很多人會問閉包是什么?閉包是用來做什么的?本文就將以Python為例,講解Python閉包的概念、形式與應用。

閉包并不是什么新奇的概念,它早在高級語言開始發展的年代就產生了。51CTO在此之前也曾陸續報導了《學習Scala的閉包》、《PHP 5.3閉包語法初探》以及《揭開Javascript閉包的真實面目》。閉包(Closure)是詞法閉包(Lexical Closure)的簡稱。對閉包的具體定義有很多種說法,這些說法大體可以分為兩類:

◆一種說法認為閉包是符合一定條件的函數,比如參考資源中這樣定義閉包:閉包是在其詞法上下文中引用了自由變量的函數。

◆另一種說法認為閉包是由函數和與其相關的引用環境組合而成的實體。比如參考資源中就有這樣的的定義:在實現深約束時,需要創建一個能顯式表示引用環境的東西,并將它與相關的子程序捆綁在一起,這樣捆綁起來的整體被稱為閉包。

這兩種定義在某種意義上是對立的,一個認為閉包是函數,另一個認為閉包是函數和引用環境組成的整體。雖然有些咬文嚼字,但可以肯定第二種說法更確切。閉包只是在形式和表現上像函數,但實際上不是函數。函數是一些可執行的代碼,這些代碼在函數被定義后就確定了,不會在執行時發生變化,所以一個函數只有一個實例。

閉包在運行時可以有多個實例,不同的引用環境和相同的函數組合可以產生不同的實例。所謂引用環境是指在程序執行中的某個點所有處于活躍狀態的約束所組成的集合。其中的約束是指一個變量的名字和其所代表的對象之間的聯系。那么為什么要把引用環境與函數組合起來呢?這主要是因為在支持嵌套作用域的語言中,有時不能簡單直接地確定函數的引用環境。

閉包和函數對象本質上是同一種東西,閉包是函數對象的簡化。閉包將環境數據保存在func_closure中,函數對象則將相關數據保存在對象中。二者均可用于filter、map、reduce等函數中。

下面分別使用閉包和函數對象來做同一件事情,感覺二者非常相似。

  1. ?[Copy to clipboard]View Code PYTHONIn [68]: class counter_class():  
  2.     def __init__(self, start_at):  
  3.         self.start_at = start_at  
  4.     def __call__(self):  
  5.         self.start_at += 1  
  6.         return self.start_at  
  7.    ....:       
  8.    ....:       
  9.    
  10. In [74]:   
  11.    
  12. In [75]: c1 = counter_class(5)  
  13.    
  14. In [76]: c1()  
  15. Out[76]: 6  
  16.    
  17. In [77]: c1()  
  18. Out[77]: 7  
  19. In [78]: c1()  
  20. Out[78]: 8 
  1. In [80]: def counter_closure(start_at = 0):  
  2.     count = [start_at]  
  3.     def incr():  
  4.         count[0] += 1  
  5.         return count[0]  
  6.     return incr  
  7.    ....:   
  8.    
  9. In [86]: c2 = counter_closure(5)  
  10.    
  11. In [87]: c2()  
  12. Out[87]: 6  
  13. In [88]: c2()  
  14. Out[88]: 7  
  15.    
  16. In [89]: c2()  
  17. Out[89]: 8  

支持閉包的語言有這樣的特性:

1、函數是一階值(First-class value),即函數可以作為另一個函數的返回值或參數,還可以作為一個變量的值。

2、函數可以嵌套定義,即在一個函數內部可以定義另一個函數。

顯然Python對這兩個特性支持都非常好,Java要想支持閉包改動就有點大了。在Python中函數同類差不多,而在Java中類是最小的組織單元,目前JDK 6.0上面兩個特性一個都不支持。至于C++這樣更底層的語言要支持閉包估計是不可能的。

Python中的閉包

Python因其簡單易學、功能強大而擁有很多擁護者,很多企業和組織在使用這種語言。Python使用縮進來區分作用域的做法也十分有特點。下面是一個Python的例子:

  1. 清單 6. Python 1  
  2. def addx(x):  
  3. def adder (y): return x + y  
  4. return adder  
  5.  
  6. add8 = addx(8)  
  7. add9 = addx(9)  
  8.  
  9. print add8(100)  
  10. print add9(100) 

在Python中使用def來定義函數時,是必須有名字的,要想使用匿名函數,則需要使用lambda語句,象下面的代碼這樣:

  1. 清單 7. Python 2  
  2. def addx(x):  
  3. return lambda y: x + y  
  4.  
  5. add8 = addx(8)  
  6. add9 = addx(9)  
  7.  
  8. print add8(100)  
  9. print add9(100) 

【編輯推薦】

  1. 揭開Javascript閉包的真實面目
  2. 談PHP閉包特性在實際應用中的問題
  3. PHP 5.3閉包語法的具體講解
  4. 淺析Javascript閉包的特性
  5. Javascript利用閉包循環綁定事件
責任編輯:王曉東 來源: 51CTO網絡整理
相關推薦

2024-01-22 09:51:32

Swift閉包表達式尾隨閉包

2020-02-12 16:58:15

JavaScript前端技術

2016-09-14 09:20:05

JavaScript閉包Web

2024-09-03 09:47:09

閉包裝飾器Python

2023-02-07 07:47:52

Python裝飾器函數

2023-11-02 08:53:26

閉包Python

2016-11-01 09:18:33

Python閉包

2011-07-27 16:55:12

Objective-c 閉包

2010-07-26 11:27:58

Perl閉包

2021-05-28 07:12:59

Python閉包函數

2009-07-22 07:43:00

Scala閉包

2010-05-18 14:21:35

MySQL視圖

2010-06-13 13:50:02

MySQL存儲引擎

2011-07-05 10:27:26

JAVA閉包

2023-11-26 00:34:36

Javascript應用方法

2009-10-26 09:41:26

PHP5.3閉包特性

2010-06-17 10:22:47

PHP

2024-04-26 00:07:27

SDKAPI工具

2009-07-24 17:30:37

Javascript閉

2021-02-21 16:21:19

JavaScript閉包前端
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产综合久久久久久 | 国产精品久久久久久影视 | 成人久久| 最新中文字幕在线 | 免费精品在线视频 | 成人在线免费网站 | 天天色天天色 | 国产精品久久久久久久久久 | 伊人久久大香线 | 中文字幕乱码一区二区三区 | 99久久99| 中文字幕精品一区久久久久 | 亚洲国产一区二区三区 | 中文字幕日韩一区 | av特级毛片 | 一级欧美| 爱爱视频在线观看 | 亚洲精品免费在线观看 | 一级黄色淫片 | 欧美簧片| 成人小视频在线观看 | 日韩av一区二区在线观看 | 国产精品美女www爽爽爽视频 | 久久99精品久久久久久青青日本 | 精品中文字幕视频 | 蜜臀久久99精品久久久久久宅男 | 污污免费网站 | 久久精品网| jdav视频在线观看免费 | 在线看亚洲 | 日韩欧美精品一区 | 日本韩国欧美在线观看 | 91国产视频在线观看 | 一区欧美 | 黄色一级网 | 男人的天堂在线视频 | 亚洲日韩中文字幕一区 | 最新伦理片 | 国产一区二区三区亚洲 | 97超在线视频 | 人人爽人人爽人人片av |