python進階教程之閉包

2021-01-07 python大蛇

閉包

1. 函數引用

def test1():

print("--- in test1 func----")

#調用函數

test1()

#引用函數

ret = test1

print(id(ret))

print(id(test1))

#通過引用調用函數

ret()

運行結果:

--- in test1 func----

140212571149040

140212571149040

--- in test1 func----

2. 什麼是閉包

#定義一個函數

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

120

in test_in 函數, number_in is 200

220

3. 閉包再理解

內部函數對外部函數作用域裡變量的引用(非全局變量),則稱內部函數為閉包

# closure.py

def counter(start=0):

count=[start]

def incr():

count[0] += 1

return count[0]

return incr

啟動python解釋器

>>>import closeure

>>>c1=closeure.counter(5)

>>>print(c1())

6

>>>print(c1())

7

>>>c2=closeure.counter(100)

>>>print(c2())

101

>>>print(c2())

102

nonlocal訪問外部函數的局部變量(python3)

def counter(start=0):

def incr():

nonlocal start

start += 1

return start

return incr

c1 = counter(5)

print(c1())

print(c1())

c2 = counter(50)

print(c2())

print(c2())

print(c1())

print(c1())

print(c2())

print(c2())

4. 看一個閉包的實際例子:

def line_conf(a, b):

def line(x):

return a*x + b

return line

line1 = 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。這樣,我們就需要更多的參數傳遞,也減少了代碼的可移植性。

閉包思考:

1.閉包似優化了變量,原來需要類對象完成的工作,閉包也可以完成

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

相關焦點

  • python中的閉包
    python 閉包是python學習中一個重要的知識點。
  • 前端基礎進階(五):JavaScript 閉包詳細圖解
    而這次重新回過頭來對基礎知識進行梳理,要講清楚閉包,也是一個非常大的挑戰。閉包有多重要?如果你是初入前端的朋友,我沒有辦法直觀的告訴你閉包在實際開發中的無處不在,但是我可以告訴你,前端面試,必問閉包。面試官們常常用對閉包的了解程度來判定面試者的基礎水平,保守估計,10個前端面試者,至少5個都死在閉包上。
  • Python遞歸函數、閉包和裝飾器
    目錄:一、遞歸函數二、閉包的深入講解三、裝飾器的使用一、 遞歸函數closure閉包定義:將內嵌函數的語句和這些語句的執行環境打包在一起時,得到的對象稱為閉包(closure)閉包滿足的三個條件:1.
  • python教程
    開發知識體系序號教程名稱400301-Python快速入門連結: 400402-Python初級課程連結:400503- Python 定向爬蟲入門400604-Linux從入門到精通400705-Linux從入門到精通400806-Python資料庫操作400907-Apache
  • python進階教程之變量
    變量進階目標01.a = 1a = "hello" a = [1, 2, 3] a = [3, 2, 1]python demo_list = [1, 2, 3]print("定義列表後的內存地址 %d" % id(demo_list))demolist.append(999) demolist.pop
  • 深入理解 Python 內部函數和閉包(進階)
    本文以內部函數為主線,深入講解內部函數和閉包的應用場景和原理,學會後你的 Python 水平會再上一個臺階,對工作面試或實戰應用都會很有幫助本文包括:函數是一等公民 Python 是面向對象的程式語言,對象是 Python 的一等公民
  • 書聲琅琅:好的Python入門教程
    好的Python入門教程,書聲琅琅教育番茄老師微信pykf20介紹,python語言現在應用非常廣泛,不管是大數據還是人工智慧,應用最多的語言還是python,因此對於許多小白來講,看到python從業者的高薪資,想要轉行,或者致力於python開發的朋友,如果要學習python,從零基礎開始,一定需要一套完整的學習路線。
  • Github標星5.6k的《Python進階》中文版下載
    今天就給大家分享一本進階向的Python書籍:《Python進階》。它是《Intermediate Python》的中文譯本,內容精練,難度差不多相當於學完本教室入門教程的程度。適合已經學完基礎的同學。
  • python高級進階 002第一個pyqt5程序
    瀏覽器版本過低,暫不支持視頻播放以下開始文字講解:在上一節的教程中,我們已經將圖形化界面開發的基本環境已經搭建完畢,本節,我們繼續使用pyqt5開發程序。app.exec_()主要作用是用死循環來監聽界面的關閉按鈕等界面控制項等事件__name__在本文件運行的時候,結果就是__main__使用__name__==『__main__『來模擬python程序主入口為了使得我們能夠對qtdesigner設計後生成的代碼更加熟悉,我們今後會更多直接使用純pyqt5代碼來編寫程序,當然,在熟悉以後,我們可以直接使用qtdesigner直接快速圖形化開發界面
  • 五、閉包
    初學JavaScript時,我在閉包上,走了很多彎路。而這次重新回過頭來對基礎知識進行梳理,要講清楚閉包,也是一個非常大的挑戰。閉包有多重要?如果你是初入前端的朋友,我沒有辦法直觀的告訴你閉包在實際開發中的無處不在,但是我可以告訴你,前端面試,必問閉包。
  • 聊聊Python中的閉包
    來源: rainyear 連結:https://github.com/rainyear/pytips/blob/master/Markdowns/2016-03-10-Scope-and-Closure.md(點擊尾部閱讀原文前往)閉包
  • 說說Python中閉包是什麼?
    廢話不多說,開始今天的題目:問:說說Python中閉包是什麼?答:可以將閉包理解為一種特殊的函數,這種函數由兩個函數的嵌套組成,外函數和內函數。在一個外函數中定義了一個內函數,內函數裡運用了外函數的臨時變量,並且外函數的返回值是內函數的引用。這樣就構成了一個閉包。
  • 第55p,閉包函數,函數知識的綜合運用
    大家好,我是楊數Tos,這是《從零基礎到大神》系列課程的第55篇文章,第三階段的課程:Python進階知識:Python進階知識:詳細講解Python中的函數(八)====> 函數的嵌套調用之閉包函數。
  • 《流暢的python》閱讀筆記(上)
    起步《流暢的python》是一本適合python進階的書, 裡面介紹的基本都是高級的python用法.
  • Python 從入門到進階經典書籍,你看過幾本?
    作者 | 小帥b來源 | 學習pyth
  • Python小白也可以學會的爬蟲教程
    前言有一段沒用 python 了,我也不知道自己為什麼對 python 越來越淡,可能自己還是比較喜歡 android ,畢竟自己第一次接觸編程就是 android,為了android學java,然後接觸的python,這次也是因為android
  • Python——五分鐘理解函數式編程與閉包
    由於在Python當中也是一切都是對象,如果我們 把閉包外層的函數看成是一個類的話,其實閉包和類區別就不大了,我們甚至可以給閉包返回的函數關聯函數,這樣幾乎就是一個對象了。和寫一個class相比,通過閉包的方法 運算速度會更快。原因比較隱蔽,是因為閉包當中沒有self指針,從而節省了大量的變量的訪問和運算,所以計算的速度要快上一些。但是閉包搞出來的偽對象是 不能使用繼承、派生等方法的,而且和正常的用法格格不入,所以我們知道有這樣的方法就可以了,現實中並不會用到。
  • 解讀Python函數閉包的概念及作用域
    但在一些情況下,可以將函數內部的嵌套函數引入到全局環境中使用,Python將引入到全局環境中使用的嵌套函數及其環境變量構建成一個封閉的包,該包內的環境變量不受外部環境的影響,這就是我們將要討論的閉包。前面我們了解了嵌套函數的作用域僅限於其父函數體內,如果在父函數體外調用其嵌套的函數,就會超出嵌套函數的作用域。
  • 入門Python, 看這些資料就夠了
    目錄:第一部分: Python入門&進階教程第二部分: Python Web框架第三部分: Python擴展資料推薦的學習路徑: 1. 使用實驗樓的開箱即用環境快速刷完Python3簡明教程,django基礎教程;2.
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    教程大合集,包含python所有就業方向,每套課程均來自市面上主流培訓機構的原版教程,價值都在數百元以上 每套課程均包含:視頻課程+課件+原始碼 重要:建議根據自己工作方向和需求,重點選擇2到3套課程學精,吃透,然後在工作 重要:零基礎小白建議先選擇零基礎全能篇的一套課程學精,然後再根據自 己的需求和規劃選擇學習其他方向課程,學完後一定要多實踐