自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇文章帶你搞定Python返回函數(shù)

開發(fā) 后端
返回函數(shù),簡(jiǎn)單的說(shuō)就是返回值是一個(gè)函數(shù)。返回的是函數(shù),調(diào)用返回的函數(shù)的時(shí)候才會(huì)返回結(jié)果。

 [[385647]]

一、什么是返回函數(shù)?

返回函數(shù),簡(jiǎn)單的說(shuō)就是返回值是一個(gè)函數(shù)。

返回的是函數(shù),調(diào)用返回的函數(shù)的時(shí)候才會(huì)返回結(jié)果。

二、閉包 (以返回函數(shù)的形式實(shí)現(xiàn))

相關(guān)參數(shù)和變量都保存在返回的函數(shù)中,這種稱為“閉包(Closure)”。

  1. def returnre(a, b): 
  2.     def re(): 
  3.         return a + b 
  4.  
  5.     return re 
  6.  
  7. test01 = returnre(1, 2) 
  8. test02 = returnre(1, 2) 
  9. print(test01 == test02)  # 每次調(diào)用都會(huì)返回新生成的函數(shù) 

比如上面例子的re函數(shù)閉包的特性,嵌套定義在非全局作用域里面的函數(shù),能夠記住它在被定義的時(shí)候它所處的封閉命名空間。

來(lái)看一個(gè)例子:

  1. def closur(a): 
  2.     def myprint(): 
  3.         print(a) 
  4.  
  5.     return myprint 
  6.  
  7. test = closur(1) 
  8. test() 

代碼解析:

變量a是函數(shù)closur的一個(gè)本地變量,只應(yīng)該存在于函數(shù)運(yùn)行時(shí),但正因?yàn)殚]包的特性,將a的值封裝進(jìn)了返回函數(shù)。

  1. def closuretest02(*args): 
  2.     f = [] 
  3.     for i in args: 
  4.         def test(): 
  5.             return i**2 
  6.         f.append(test) 
  7.     return f 
  8. test = closuretest02(1,2,3,4) 
  9. for i in test: 
  10.     print(i()) 

返回閉包時(shí)牢記的一點(diǎn)就是:

返回函數(shù)不要引用任何循環(huán)變量,或者后續(xù)會(huì)發(fā)生變化的變量。

如果一定要引用循環(huán)變量怎么辦?

方法是再創(chuàng)建一個(gè)函數(shù),用該函數(shù)的參數(shù)綁定循環(huán)變量當(dāng)前的值,無(wú)論該循環(huán)變量后續(xù)如何更改,已綁定到函數(shù)參數(shù)的值不變:

  1. def count(): 
  2.     def f(j): 
  3.         def g(): 
  4.             return j*j 
  5.         return g 
  6.     fs = [] 
  7.     for i in range(1, 4): 
  8.         fs.append(f(i)) # f(i)立刻被執(zhí)行,因此i的當(dāng)前值被傳入f() 
  9.     return fs 

再看看結(jié)果:

  1. f1, f2, f3 = count() 
  2. print(f1()) 
  3.  
  4. print(f2()) 
  5. print(f3()) 

注:

缺點(diǎn)是代碼較長(zhǎng),可利用lambda函數(shù)縮短代碼。

一個(gè)函數(shù)可以返回一個(gè)計(jì)算結(jié)果,也可以返回一個(gè)函數(shù)。返回一個(gè)函數(shù)時(shí),牢記該函數(shù)并未執(zhí)行,返回函數(shù)中不要引用任何可能會(huì)變化的變量。

三、拓展

nonlocal

nonlocal適用于嵌套函數(shù)中內(nèi)部函數(shù)修改外部變量的值。

  1. def outside(): 
  2.     a = 1 
  3.     print('outside' + str(id(a))) 
  4.     def inside(): 
  5.         nonlocal a 
  6.         print('inside ' + str(id(a))) 
  7.     inside() 
  8. outside() 

因?yàn)槭褂胣onlocal后,返回了閉包中有父函數(shù)的變量,所以父函數(shù)那里不會(huì)被回收。

四、總結(jié)

本文基于Python基礎(chǔ),介紹了返回函數(shù)。常見的返回函數(shù)的應(yīng)用。函數(shù)作為返回值,閉包在實(shí)際應(yīng)用中需要的點(diǎn),遇到的難點(diǎn),提供有效的解決方案。使用Python語(yǔ)言,能夠更好的理解。

歡迎大家積極嘗試,有時(shí)候看到別人實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,但是到自己動(dòng)手實(shí)現(xiàn)的時(shí)候,總會(huì)有各種各樣的問(wèn)題,切勿眼高手低,勤動(dòng)手,才可以理解的更加深刻。

代碼很簡(jiǎn)單,希望對(duì)你學(xué)習(xí)有幫助。

本文轉(zhuǎn)載自微信公眾號(hào)「Go語(yǔ)言進(jìn)階學(xué)習(xí)」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Go語(yǔ)言進(jìn)階學(xué)習(xí)公眾號(hào)。

 

責(zé)任編輯:武曉燕 來(lái)源: Go語(yǔ)言進(jìn)階學(xué)習(xí)
相關(guān)推薦

2024-04-17 13:21:02

Python匿名函數(shù)

2021-05-15 10:16:14

Python匿名函數(shù)

2020-02-28 11:29:00

ElasticSear概念類比

2021-11-10 09:19:41

PythonShutil模塊

2021-11-17 10:11:08

PythonLogging模塊

2022-05-28 15:59:55

PythonPandas數(shù)據(jù)可視化

2021-03-24 10:00:32

Python遞歸函數(shù)Python基礎(chǔ)

2021-04-24 10:19:41

Python函數(shù)指向

2025-02-19 10:39:26

Python高階函數(shù)函數(shù)名

2021-01-29 18:41:16

JavaScript函數(shù)語(yǔ)法

2022-03-30 10:51:40

JavaScript性能調(diào)優(yōu)

2021-11-13 10:11:45

Pythonurllib庫(kù)Python基礎(chǔ)

2023-06-15 10:11:08

JavaScript函數(shù)表達(dá)式

2021-05-15 09:18:04

Python進(jìn)程

2021-03-15 08:38:42

StringBuffeJava基礎(chǔ)Java開發(fā)

2022-02-21 09:44:45

Git開源分布式

2023-05-12 08:19:12

Netty程序框架

2021-06-30 00:20:12

Hangfire.NET平臺(tái)

2021-05-21 09:01:29

JavaScript 前端函數(shù)閉包

2021-02-20 10:06:14

語(yǔ)言文件操作
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)