Python 閉包函式說明

安全劍客發表於2019-12-24
在 Python 中很多地方都會使用到閉包,那麼究竟什麼叫做閉包呢?

在一些語言中,在函式中可以(巢狀)定義另一個函式時,如果內部的函式引用了外部的函式的變數,則可能產生閉包。閉包可以用來在一個函式與一組“私有”變數之間建立關聯關係。在給定函式被多次呼叫的過程中,這些私有變數能夠保持其永續性。

簡而言之, 閉包的特點就是內部函式引用了外部函式中的變數。 在Python中,支援將函式當做物件使用,也就是可以將一個函式當做普通變數一樣用作另一個函式的引數和返回值。擁有此類特性的語言,一般都支援閉包。

閉包中被內部函式引用的變數,不會因為外部函式結束而被釋放掉,而是一直存在記憶體中,知道內部函式被呼叫結束。

閉包函式

閉:指的是定義在函式內部的函式
比如手機是閉包函式(內層函式),被手機包裝盒 (外層函式) 包裹起來,
手機可以使用包裝盒中的東西,內層函式可以引用外層函式的名字。
閉包函式是 函式巢狀、函式物件、名稱空間與作用域 結合體。

基本形式:

def outer():
name ='egon'
def inner():
print('my name is %s' %name)
return inner
# print(outer())
f=outer()
f()

閉包的小應用:

#爬蟲:模擬訪問百度
import requests
def get(url):
response = requests.get(url)
if response.status_code == 200:
print(response.text)
get(')
get(')
get(') #問題:每次訪問百度,都要呼叫一次,填一次地址
# 解決辦法:用閉包函式
def outter():
url = ' #問題:把地址定死了,
def get():
response = requests.get(url)
if response.status_code == 200:
print(response.text)
return get
baidu = outter() #baidu --->get
baidu()
# 改進:
def outter(url):
def get():
response = requests.get(url)
if response.status_code == 200:
print(response.text)
return get
baidu = outter(') #baidu --->get
taobao = outter(') #taobao --->get
baidu() #專門調百度
taobao() #專門調淘寶

原文地址:

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2670362/,如需轉載,請註明出處,否則將追究法律責任。

相關文章