🍖閉包函數

引入

閉包函數實際上是 名稱空間與做用域, 函數嵌套, 函數對象的中和運用python

一.什麼是閉包函數

  • 閉 : 指的是定義在函數內部的函數

  • 包 : 閉函數引用了一個來自外層函數的變量

'總結一句話來講' : 定義在函數內部的函數, 而且該函數包含對外部函數做用域中名字的引用,該函數就稱爲閉包函數
    
def outter():
     name='egon'
     def inner():
         print('my name is %s' %name)
     return inner  #注意不能加括號

f=outter()    #f=inner
  • 注意 : 做用域在函數定義階段就規定死了, 與調用的位置無關
🎅定義階段已經規定死了到'outter'下面的"x"去拿
def outter():
     x=2           
     def inner():
         # x=1
         print('from inner',x)

     return inner

🎅在全局裏面定義也無效
 f=outter()  # f=inner
 print(f)
 x=11111111111111111
 f()  # 2

🎅把它裝進一個函數,在函數裏面再定義也是無效的
 def foo():
     x=111111111111111111
     f()

 foo()  # 2

二.爲函數傳值的方式

方式一 : 將值以參數的形式傳入

import requests

🎅將"url"以參數的形式傳入(也是最經常使用)
def get(url):
    response=requests.get(url)下載
    if response.status_code == 200:
        print(response.text)

get('https://www.baidu.com')
get('https://www.python.org')

方式二 : 以包的方式傳入

🎅這是個獲取網絡源碼的功能
import requests    

def outter(url):
    def get():
        response=requests.get(url)
        if response.status_code == 200:
            print(response.text)
    return get
    
baidu = outter('https://www.baidu.com')
baidu()

若是難以理解,就來個精簡版網絡

def outter(x):
	def wrapper():
		print(x)    #按照查找的優先級去查找"x"
	return wrapper  #吐出了函數"wrapper"的內存地址

f = outter(10)  #這裏返回的值就是函數"wrapper"的內存地址,賦值給"f",加括號就調用
f()  #10
相關文章
相關標籤/搜索