閉包---在函數內部再定義一個函數

?什么是閉包

# 定義一個函數
def test(number):# 在函數內部再定義一個函數,并且這個函數用到了外邊函數的變量,那么將這個函數以及用到的一些變量稱之為閉包def test_in(number_in):print("in test_in 函數, number_in is %d" % number_in)return number+number_in# 其實這里返回的就是閉包的結果return test_in# 給test函數賦值,這個20就是給參數number
ret = test(20)# 注意這里的100其實給參數number_in
print(ret(100))#注 意這里的200其實給參數number_in
print(ret(200))

運行結果:


in test_in 函數, number_in is 100
120in test_in 函數, number_in is 200
220

?看一個閉包的實際例子:

def line_conf(a, b):def line(x):return a*x + breturn lineline1 = line_conf(1, 1)
line2 = line_conf(4, 5)
print(line1(5))
print(line2(5))

這個例子中,函數line與變量a,b構成閉包。在創建閉包的時候,我們通過line_conf的參數a,b說明了這兩個變量的取值,這樣,我們就確定了函數的最終形式(y = x + 1和y = 4x + 5)。我們只需要變換參數a,b,就可以獲得不同的直線表達函數。由此,我們可以看到,閉包也具有提高代碼可復用性的作用。

如果沒有閉包,我們需要每次創建直線函數的時候同時說明a,b,x。這樣,我們就需要更多的參數傳遞,也減少了代碼的可移植性。

注意點:

由于閉包引用了外部函數的局部變量,則外部函數的局部變量沒有及時釋放,消耗內存

?修改外部函數中的變量

python3的方法

def counter(start=0):def incr():nonlocal startstart += 1return startreturn incrc1 = counter(5)
print(c1())
print(c1())c2 = counter(50)
print(c2())
print(c2())print(c1())
print(c1())print(c2())
print(c2())

python2的方法


def counter(start=0):count=[start]def incr():count[0] += 1return count[0]return incrc1 = closeure.counter(5)
print(c1())  # 6
print(c1())  # 7
c2 = closeure.counter(100)
print(c2())  # 101
print(c2())  # 102

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/456756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/456756.shtml
英文地址,請注明出處:http://en.pswp.cn/news/456756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

慕課網_《Java實現對稱加密》學習總結

時間:2017年4月11日星期二說明:本文部分內容均來自慕課網。慕課網:http://www.imooc.com教學示例源碼:https://github.com/zccodere/s...個人學習源碼:https://github.com/zccodere/s... 第一章:對稱加密算…

大數據之MapReduce詳解(MR的運行機制及配合WordCount實例來說明運行機制)

目錄前言:1、MapReduce原理2、mapreduce實踐(WordCount實例) 目錄 今天先總體說下MapReduce的相關知識,后續將會詳細說明對應的shuffle、mr與yarn的聯系、以及mr的join操作的等知識。以下內容全是個人學習后的見解,如…

生動形象的理解什么是裝飾器!

裝飾器 裝飾器是程序開發中經常會用到的一個功能,用好了裝飾器,開發效率如虎添翼,所以這也是Python面試中必問的問題,但對于好多初次接觸這個知識的人來講,這個功能有點繞,自學時直接繞過去了,…

PLSQL 申明和游標

--從鍵盤輸入一個數 accept b prompt 請輸入一個大于零的數字; declareanum number : &b; beginwhile anum>0loopdbms_output.put_line(anum);anum:anum-1;end loop; end;declarev_num number; begin -- 從stsu表中選出id最大的值,并根據該值打印次數select …

20155222 2016-2017-2 《Java程序設計》第8周學習總結

20155222 2016-2017-2 《Java程序設計》第8周學習總結 教材學習內容總結 Java NIO(New IO)是一個可以替代標準Java IO API的IO API(從Java 1.4開始),Java NIO提供了與標準IO不同的IO工作方式。 Java NIO: Channels and Buffers(通道和緩沖區&…

BAT經典面試題精簡版(基礎知識附答案)

文章目錄目錄J2SE基礎JVM操作系統TCP/IP數據結構與算法目錄 J2SE基礎 九種基本數據類型的大小,以及他們的封裝類。 原始類型封裝類 booleanBoolean charCharacter byteByte shortShort intInteger longLong floatFloat doubleDouble Switch能否用string做參數&…

使用2to3.py 轉換 python2.x 代碼 到python3

1.使用Windows 命令提示符(cmd)cd到2to3.py 腳本所在位置,如下圖: 找不到的2 to 3.py的去 pycharm中雙擊shift搜索一下 2.緊接著運行 2to3.py 腳本(可省略) 3.執行你想要轉換的文件 python 2to3.py -w H:…

iis6.0與asp.net的運行原理

這幾天上網翻閱了不少前輩們的關于iis和asp.net運行原理的博客,學的有點零零散散,花了好長時間做了一個小結(雖然文字不多,但也花了不少時間呢),鄙人不才,難免有理解不道的地方,還望…

元類--用不上的先了解

元類 1. 類也是對象 在大多數編程語言中,類就是一組用來描述如何生成一個對象的代碼段。在Python中這一點仍然成立: >>> class ObjectCreator(object): … pass … >>> my_object ObjectCreator() >>> print(my_ob…

Android學習筆記進階十之Matrix錯切變換

剛開始我也不懂啥叫錯切變換,一看效果圖你就恍然大悟。 對圖像的錯切變換做個總結: x x0 b*y0; y d*x0 y0; 與之對應的方法是: [java] view plaincopyMatrix matrix new Matrix(); matrix.setSkew(0.0f, 0.5f);

SQL數據庫實戰(含建表數據和查詢案例)

Oracle數據庫安裝的時候會自帶一個練習用數據庫(其中包含employee表,后來版本中此表改名為emp); 首先在安裝過程中應該有個選項“是否安裝實例表”(完全安裝模式下默認是選擇的),需要選擇才有此…

Django中的核心思想ORM---元類實現ORM

1. ORM是什么 ORM 是 python編程語言后端web框架 Django的核心思想,“Object Relational Mapping”,即對象-關系映射,簡稱ORM。 一個句話理解就是:創建一個實例對象,用創建它的類名當做數據表名,用創建它…

移動互聯網廣告 - 第十更 - 廣告投放運營 DashBoard - 2016/12/10

廣告投放運營 DashBoard設計 移動互聯網互聯網廣告投放,數據監控DashBoard,基礎樣例示意,下圖僅供參考(來自于互聯網)。 轉載于:https://www.cnblogs.com/pythonMLer/p/6154700.html

微信小程序中使用emoji表情相關說明

2019獨角獸企業重金招聘Python工程師標準>>> 本帖將聚合一些跟emoji表情有關的知識;相關文章:“i愛記賬” 小程序后端開發小結 第7條經驗前端傳過來的昵稱和備注信息一定要經過嚴格的正則表達式過濾,放置出現XSS等攻擊&#xff0c…

java.lang.IllegalArgumentException: Does not contain a valid host:port authority: ignorethis

執行Hive語句運行MapReduce程序時突然出現這樣的異常: Total MapReduce jobs 1 Launching Job 1 out of 1 Number of reduce tasks not specified. Estimated from input data size: 1 In order to change the average load for a reducer (in bytes):set hive.ex…

Oracle基礎語句

1、創建表create table IT_EMPLOYEES(ENPLOYEES_ID NUMBER(6) NOT NULL UNIQUE,FIRST_NAME VARCHAR2(20),LAST_NAME VARCHAR2(25) NOT NULL,EMAIL VARCHAR2(25),PHONE_NUMBER VARCHAR2(20),JOB_ID VARCHAR2(10),SALARY NUMBER(8,2),MANAGER_ID NUMBER(6));2、--創建索引&#x…

Linux三劍客之grep 與 egrep

grep:Linux上文本處理三劍客1 grep:文本過濾(模式:pattern)工具; *(grep, egrep, fgrep) 2 sed:stream editor,文本編輯工具; 3 awk:Linux上的實現gawk,文本報…

WSGI直觀形象的了解一下

1. 瀏覽器請求動態頁面過程 2. WSGI 怎么在你剛建立的Web服務器上運行一個Django應用和Flask應用,如何不做任何改變而適應不同的web架構呢? 在以前,選擇 Python web 架構會受制于可用的web服務器,反之亦然。如果架構和服務器可以…

安裝Hbase(分布式)遇到一些問題及解決方法

問題一:安裝完成后在Hbase shell 命令行執行list命令時,爆出如下錯誤: hbase(main):001:0> list TABLE …

安裝MySql卡在Start Service的問題

我的情況:之前在windows下安裝過5.6版本,卸載后,現在安裝5.7版本,然后卡在Start Service這里,log日志沒報任何錯誤,后來經過不斷的嘗試各種網上的辦法終于把問題解決了。 問題的原因就是當初卸載5.6版本時…