您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python函數的返回值與嵌套函數是什么”,在日常操作中,相信很多人在Python函數的返回值與嵌套函數是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python函數的返回值與嵌套函數是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
返回值指的是函數返回的結果;
return執行完畢后面的語句將不會再執行;
def add(x, y): print(x, y) #輸出:10 20 return x + y # 返回值, return以后的語句將不會再執行 print(x) print(y) add(10,20)
如果一個函數里面有兩個return,前面return執行完畢,后面的return也不會執行;
def add(x, y): print(x, y) # 輸出:1 2 return x + y # 函數體內,碰到return語句,函數執行完畢,之后的語句將不會再執行 return x - y # 不會再次執行 add(1,2)
Python函數都有返回值,如果有return語句,是顯式返回;
如果沒有return語句,默認返回None,是隱式返回;
如果返回多個值通過逗號分開,會把值進行壓縮,封裝成一個元組;
def get_data(x,y,z): return x + 1, y + 1, z + 1 print(get_data(1,2,3)) # 得到的是一個元組(2, 3, 4)
如果返回一個列表,得到的就是一個列表;
def get_data(x,y,z): return [x + 1, y + 1, z + 1] print(get_data(1,2,3)) # 得到的是一個列表[2, 3, 4]
def outer_function(): # 內部函數 def inner_function(): print("inner_function") # 輸出:inner_function print("outer_function") # 輸出:outer_function # 內部調用 inner_function() outer_function() # 注意:inner_function函數只能在outer_function函數內部調用,無法再outer_function函數外部被調用
嵌套函數的內部函數只能在包含它的函數的直接父級調用,也就是只能在包含它的外部函數中調用;
嵌套函數層數不宜過深,一般3層以內即可,太深不夠直觀,容易造成代碼混亂;
作用域指的是,一個標識符的作用范圍就是這個標識符的作用域;
在函數里面定義的變量(即局部作用域)只能在函數體內部被訪問,函數外部不能訪問;
def add(x, y): z = 100 print(x, y , z) #輸出:1 2 100 add(1,2) print(z) #報錯:NameError: name 'z' is not defined
在函數外部定義的變量(即全局作用域)能在函數體外部被訪問,也能在函數體內部被訪問;
z = 100 def add(x, y): print(x, y, z)# 輸出:1 2 100 add(1, 2) print(z) # 輸出:100
閉包:內部函數引用了外部函數的變量,這就是閉包的定義;
如果函數體想訪問變量,只能在變量定義之后才能訪問;
# 例1 x=5 def add(): y = x + 1 print(y) #輸出:6 add() # 例2 x=5 def add(): x = x + 1 # 報錯:local variable 'x' referenced before assignment add() # 報錯原因分析: # 在例1中,函數內部引用的x為函數外部的x, 因此x的值為5 # 在例2中,函數內部重新定義了x的值,那么整個函數內部都會使用這個內部x, # 因此在運算x + 1的時候,x還沒有完成定義就被引用了,這里的x引用的一定是內部正在定義的 x,不是函數外部的 x=5這個x; # 例3: x=5 def add(): print(x) # 這里的x引用的是x = 1的x,但是執行print(x)時,x還沒有被定義,所以報錯:local variable 'x' referenced before assignment x = 1 add()
如果要訪問函數體內部的函數,可以先把內部函數的函數名作為外部函數的返回值,把外部函數的引用賦值給變量,再調用變量;
# 例4: def outer_function(): x = 100 def inner_function(): print(x) # 內部函數引用了外部函數的自由變量 輸出:100 return inner_function ret = outer_function() ret()
global關鍵字:可以指定變量為全局變量,但是global關鍵字會污染全局變量,也就是會覆蓋之前全局變量的值,所以最好慎用;
x=1 def add(): global x # 使用global關鍵字,指定x的引用全局的x變量 x = x + 1 print(x) #輸出:2 add() x = 100 def foo(): global x # x被聲明了全局變量 x = 10 x += 1 print(x) # x的值為11 foo() print(x) # 輸出x的值為:11,原本這里應該引用的是全局變量x = 100 的,因此global關鍵字污染了全局變量 x
nonlocal關鍵字:可以申明內部函數的變量引用的是外部函數變量的值(作用域在外部函數),不是全局作用域的值,因此不會污染全局作用域;
def outer_function(): x = 100 def inner_function(): x = x + 1 # 這樣會報錯,函數內部重新定義了x的值,但是還沒有完成定義就被引用了 print(x) return inner_function ret = outer_function() ret() def outer_function(): x = 1 def inner_function(): nonlocal x # 使用nonlocal關鍵字聲明x 為外層函數的x的值 x = x + 1 #所以這里使用的x 是外層函數的x print(x) #輸出:2 return inner_function ret = outer_function() ret()
同一個函數的生命周期相同,函數的默認值會綁定在函數的整個生命周期上,不會因為函數內部對默認值的操作而發生改變;
def add(lst = []): lst.append('hello') print(lst) add() # 輸出:['hello'] print('id={}'.format(id(add))) # 函數對象的id值不變,調用的是同一個函數 id=1837000 add() # 輸出['hello', 'hello'] print('id={}'.format(id(add))) # 函數對象的id值不變,調用的是同一個函數 id=1837000 # 查看函數的位置參數的默認值 print(add.__defaults__) #輸出:(['hello', 'hello'],) # 查看函數的關鍵字參數的默認值 print(add.__kwdefaults__) #輸出:None
可以使用淺拷貝copy(簡寫[:])來清空默認值,那每次調用函數,默認值都為初始值;
def add(lst = []): lst = lst[:] lst.append('hello') print(lst) add() # 輸出:['hello'] add() # 輸出:['hello']
也可以通過參數值判斷來給默認值重新賦值,那每次調用函數,默認值都為初始值;
def add(lst=None): if lst is None: lst = [] lst.append(1) print(lst) add() # 輸出:[1] print(add.__defaults__) # 輸出: (None,) add([1, 2, 3]) # 輸出: [1, 2, 3, 1] print(add.__defaults__) # 輸出:(None,) add([4, 5, 6]) # 輸出:[4, 5, 6, 1] print(add.__defaults__) # 輸出:(None,)
def add(): print('add') del add add()
可以通過 del 函數名 的方式來刪除函數,再調用函數時,就會報錯不存在;
到此,關于“Python函數的返回值與嵌套函數是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。