亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python 語法之閉包

發布時間:2020-08-04 23:40:26 來源:網絡 閱讀:163 作者:ckllf 欄目:編程語言

  閉包的概念

  在計算機科學中,閉包(英語:Closure),又稱詞法閉包(Lexical Closure)或函數閉包(function closures),是引用了自由變量的函數。這個被引用的自由變量將和這個函數一同存在,即使已經離開了創造它的環境也不例外。

  在一些語言中,在函數中可以(嵌套)定義另一個函數時,如果內部的函數引用了外部的函數的變量,則可能產生閉包。運行時,一旦外部的 函數被執行,一個閉包就形成了,閉包中包含了內部函數的代碼,以及所需外部函數中的變量的引用。

  函數名稱的引用傳遞

  def func():

  print("--- func is run ----")

  func()

  ret = func

  print(id(ret))

  print(id(func))

  ret()

  運行結果:

  --- func is run ----

  56145576

  56145576

  --- func is run ----

  由上圖可知,和變量名一樣的,函數名只是函數代碼空間的引用,當函數名賦值給一個對象的時候就是引用傳遞。

  局部-全局變量

  定義在方法內的變量是局部變量,不能在方法外做引用;定義在模塊最外層的變量是全局變量,它是全局范圍內可見的。

  那么問題來了,當方法內部有嵌套方法時,嵌套方法能否使用父方法中定義的局部變量呢?答案是可以。

  def outer_func():

  data = 520

  def inner_func():

  return data

  return inner_func()

  print(outer_func())

  運行結果:

  520

  此時調用 outer_func() 函數的返回值就是 520,所以說嵌套方法可以使用父方法中聲明的局部變量。

  閉包的寫法

  上面的概念還算比較容易理解,那么什么是閉包呢?我們來看下面一段代碼:

  def outer_func():

  data = 520

  def inner_func():

  return data

  return inner_func

  print(outer_func())

  result = outer_func()

  print(result())

  運行結果:

  .inner_func at 0x02D8B6A8>

  520

  閉包的執行流程圖

  執行第 11 行代碼:

  先執行 print() 函數中的 outer_funcf() 函數,并將內層函數 inner_func() 函數的內存地址進行返回,最終 print() 函數將 return 返回的內層函數地址進行打印輸出。

  執行第 13 行代碼: 鄭州看婦科的醫院 http://www.ytsgfk120.com/

  先執行等號右側的 outer_func () 函數,最終返回 inner_func() 函數的地址引用。等號左側 result 變量進行接收內層函數地址。

  執行第 15 行代碼:

  先執行 print() 函數中 result() 函數,因為 result 變量保存了內層函數 inner_func() 函數的地址,所以 result 變量后面加上括號就相當于執行 inner_func() 函數。執行內層函數并且將 data 值返回,最終使用 print() 函數將返回值打印輸出。

  修改外部函數中的變量

  nonlocal 關鍵字用來在函數或其他作用域中使用外層的(非全局)變量,修飾變量后表示該變量是上一級函數中的局部變量,如果上一級函數中不存在該局部變量,nonlocal 位置會發生錯誤(最上層的函數使用 nonlocal 修飾變量必定會報錯)。

  data = 20

  def outer_func():

  data = 0

  def inner_func():

  nonlocal data

  data = 666

  print("--- inner_func ---:",data)

  inner_func()

  print("--- outer_func ---:",data)

  outer_func()

  print("--- 函數外 ---:",data)

  運行結果:

  --- inner_func ---: 666

  --- outer_func ---: 666

  --- 函數外 ---: 20

  總結

  函數名只是函數代碼空間的引用,當函數名賦值給一個對象的時候就是引用傳遞

  定義在方法內的變量是局部變量,不能在方法外做引用,但是可以被內層函數引用。

  閉包就是一個嵌套定義的函數,在外層運行時才開始內層函數的定義,然后將內部函數的引用傳遞給函數外的對象

  內部函數和使用的外部函數提供的變量構成的整體稱為閉包。


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

双桥区| 饶河县| 绵竹市| 商城县| 拜城县| 金昌市| 定西市| 鲁山县| 黔南| 古丈县| 鄱阳县| 南华县| 清远市| 巩留县| 安义县| 治县。| 佛坪县| 南涧| 河东区| 莒南县| 江山市| 沾益县| 大名县| 讷河市| 南岸区| 寻乌县| 措勤县| 鲁山县| 嘉兴市| 孙吴县| 永修县| 平武县| 郴州市| 固安县| 长春市| 温泉县| 盐边县| 瑞安市| 罗田县| 准格尔旗| 台湾省|