一、內嵌函數
內嵌函數指的是在一個函數體內部定義的函數,可以稱它為函數的函數,也就是子函數,外部的函數稱之為母函數,就類似局部變量和全局變量
子函數體內定義的變量只在其函數內部有效,但其內部可以調用母函數定義的變量,但無法直接修改母函數體內定義的變量。
二、閉包
閉包是一種滿足特定要求的內嵌函數(子函數),其外部的函數稱為母函數,則當子函數體內有對母函數體內定義的變量的引用時我們稱這個子函數為一個閉包
但當母函數和其閉包都定義了參數時,由於在母函數體外是無法直接對閉包進行函數的調用的,為了能夠實現對閉包的調用,需要在母函數內增加一條返回閉包函數名本身的語句,這個時候調用母函數后返回的是一個閉包的函數對象,就可以通過這種方法間接的調用閉包函數
下訴代碼中,我們也可以使用fun1(7)(8)

1 def fun1(x): 2 def fun2(y): 3 return x*y 4 return fun2 5 6 i = fun1(7) 7 type(i) 8 <class 'function'> 9 i(8) 10 56
三、在內嵌函數中(子函數)修改外部函數(母函數)的變量的進行修改
Python3可以實現,多使用一條聲明語句:nonlocal 注意與global語句的區別,global語句是在函數體內修改全局變量的值,
格式:nonlocal 外部函數的變量名

1 def mother(): 2 var = 110 3 print('mother中的var的值為',var) 4 def son(): 5 nonlocal var 6 var = 119 7 print('Son中的var的值為',var) 8 print('函數中的var的值為',var) 9 return son 10 11 12 >>> mother()() 13 mother中的var的值為 110 14 函數中的var的值為 110 15 Son中的var的值為 119 16 這時我們打印var的值,其為119, 17 因為程序的運行過程是,mother運行結束返回son->son運行