日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
Python中的匿名函數(shù)及遞歸思想簡(jiǎn)析

匿名函數(shù)

前言

上次咱們基本說(shuō)了一下函數(shù)的定義及簡(jiǎn)單使用,Python中的基本函數(shù)及其常用用法簡(jiǎn)析,現(xiàn)在咱們整點(diǎn)進(jìn)階一些的。同樣都是小白,咱也不知道實(shí)際需要不,但是對(duì)于函數(shù)的執(zhí)行順序以及裝飾器的理解還是很有必要的。

創(chuàng)新互聯(lián)建站專(zhuān)注于民樂(lè)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開(kāi)發(fā),購(gòu)物商城網(wǎng)站建設(shè)。民樂(lè)網(wǎng)站建設(shè)公司,為民樂(lè)等地區(qū)提供建站服務(wù)。全流程按需策劃,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

首先咱們先簡(jiǎn)單復(fù)習(xí)一下:

函數(shù)的定義:

 
 
 
 
  1. def 函數(shù)名字(參數(shù)): 
  2.   具體的函數(shù)語(yǔ)句塊 
  3.   return [需要返回的數(shù)據(jù)] 

函數(shù)的執(zhí)行:

 
 
 
 
  1. # 函數(shù)只有被調(diào)用的時(shí)候才執(zhí)行,函數(shù)可以執(zhí)行多次 
  2. 函數(shù)名稱(chēng)() 

局部與全局變量:

不同的函數(shù)有不同的作用域

 
 
 
 
  1. def test1(): 
  2.     name = 'XXX' 
  3.     print(name) 
  4.  
  5.  
  6. def test2(): 
  7.     name = 'YYY' 
  8.     print(name) 
  9.  
  10.  
  11. test1() 
  12. test2() 
 
 
 
 
  1. 局部想使用全局變量 使用global 變量名 
  2. 局部與全局變量同名仍要同時(shí)使用全局變量局部變量 globals()['變量名'] 

還有一種情況就是函數(shù)內(nèi)嵌套了函數(shù)想使用上次層函數(shù)的變量。

 
 
 
 
  1. def test1(): 
  2.    name = 'XXX' 
  3.  
  4.    def test2(): 
  5.        # 使用上一層的變量并打印查看 
  6.        nonlocal name 
  7.        print(name) 
  8.    # 在函數(shù)test1中調(diào)用執(zhí)行test2 
  9.    test2() 
  10.  
  11.  
  12. test1() 
  13. # 直接調(diào)用test2會(huì)拋出異常test2 未定義 
  14. # test2() 

因?yàn)榧^那里有空格,Python也是根據(jù)這種格式來(lái)判斷作用域的,只能像紅色框那樣在同一級(jí)的地方調(diào)用。

一個(gè)函數(shù)內(nèi)返回另一個(gè)函數(shù):

 
 
 
 
  1. def test1(): 
  2.    print("in the test1") 
  3.  
  4.  
  5. def test2(): 
  6.    print("in the test2") 
  7.    return test1() 
  8.  
  9.  
  10. test2() 

想把上面的這段代碼解釋清楚,咱們插播一個(gè)遞歸。

遞歸的特性:

  • 遞歸就是自己調(diào)用自己
  • 必須有個(gè)明確的結(jié)束條件,不然會(huì)導(dǎo)致棧溢出
  • 每次遞歸問(wèn)題都有所減少
  • 遞歸效率不高,但是有時(shí)候真的好用

來(lái)個(gè)最經(jīng)典的斐波拉契數(shù)組。

 
 
 
 
  1. # 斐波拉契數(shù)組長(zhǎng)這樣:1,1,2,3,5,8,13,21,34,55... 
  2. def fabonacci(n): 
  3.    # 結(jié)束條件 
  4.    if n <= 2: 
  5.        # 因?yàn)榍皟蓚€(gè)數(shù)字都是1,所以當(dāng)n小于等于2時(shí)返回1 
  6.        v = 1 
  7.        return v 
  8.    # 大于2的話就自己調(diào)用自己,斐波拉契第n個(gè)數(shù)字等于n-1的數(shù)字+n-2數(shù)字的和 
  9.    v = fabonacci(n-1)+fabonacci(n-2) 
  10.    return v 
  11.  
  12.  
  13. print(fabonacci(6)) 

 
 
 
 
  1. import sys 
  2.  
  3. # 打印當(dāng)前遞歸深度,默認(rèn)為1000 
  4. print(sys.getrecursionlimit()) 
  5. # 設(shè)置最大遞歸深度 
  6. sys.setrecursionlimit(999999999) 
  7. print(sys.getrecursionlimit()) 

其實(shí)就是表達(dá)函數(shù)內(nèi)調(diào)用另一個(gè)函數(shù),會(huì)等待另一個(gè)函數(shù)執(zhí)行完畢,該函數(shù)再執(zhí)行到結(jié)束...感覺(jué)遞歸講不講都一樣了...so,咱們還是趕緊回到正題,代碼的執(zhí)行順序是這樣子的....

當(dāng)然還能這么玩:

 
 
 
 
  1. def test1(): 
  2.    print("in the test1") 
  3.  
  4.  
  5. def test2(): 
  6.    print("in the test2") 
  7.    # 此處返回test1的內(nèi)存地址 
  8.    return test1 
  9.  
  10.  
  11. test2()() 
  12. # 先執(zhí)行test2(),返回test1的內(nèi)存地址 
  13. # 加上小括號(hào)執(zhí)行test1 

匿名函數(shù)

  1. 使用lambda 創(chuàng)建
  2. 簡(jiǎn)單來(lái)說(shuō)匿名函數(shù)就是一個(gè)沒(méi)有名字的簡(jiǎn)單函數(shù)
  3. 匿名函數(shù)只有一個(gè)表達(dá)式,return 表達(dá)式計(jì)算的值

創(chuàng)建一個(gè)簡(jiǎn)單的匿名函數(shù),命令如下所示。

 
 
 
 
  1. 格式       lambda 參數(shù)列表:表達(dá)式 
 
 
 
 
  1. lambda num1, num2: num1+num2 

使用一個(gè)變量接收一下,就是保存的內(nèi)存地址,加上小括號(hào)傳入?yún)?shù)就能運(yùn)行了。

 
 
 
 
  1. func = lambda num1, num2: num1+num2 
  2.  
  3. print(func(1, 2)) 

我使用的編輯器是VS Code ,發(fā)現(xiàn)了一個(gè)問(wèn)題,格式化代碼的時(shí)候把匿名函數(shù)改成了函數(shù)...具體原因及細(xì)節(jié)未知。

格式化前:

格式化后:

map 映射(循環(huán)讓每一個(gè)函數(shù)執(zhí)行函數(shù),結(jié)果保存到新的列表)

map(匿名函數(shù),可迭代對(duì)象)

map()處理序列中的每個(gè)元素,得到的結(jié)果是一個(gè)可迭代對(duì)象,該對(duì)象個(gè)數(shù)和位置與原來(lái)一樣。

 
 
 
 
  1. li = [1, 5, 3, 2, 3] 
  2. res = map(lambda x: x+1, li) 
  3. print(type(res)) 
  4. # 返回的map對(duì)象 
  5. print(list(res)) 

filter 判斷

filter()遍歷序列中的每個(gè)元素,得到的結(jié)果是True則留下來(lái)。

 
 
 
 
  1. people = ['sb_laowang', 'sb_xiaozhang', 'sb_laozhang', 'xiaoliu'] 
  2. # 將滿足以帥比開(kāi)頭的保存為新的對(duì)象 
  3. res = filter(lambda x: x.startswith('sb'), people) 
  4. print(type(res)) 
  5. print(list(res)) 

reduce:將序列進(jìn)行合并操作

 
 
 
 
  1. from functools import reduce 
  2. num_li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
  3. str_li = list('hello') 
  4. res_num = reduce(lambda x, y: x+y, num_li) 
  5. res_str = reduce(lambda x, y: x+y, str_li) 
  6. print(str_li) 
  7.  
  8.  
  9. print(type(res_num), res_num) 
  10. print(type(res_str), res_str) 

第一次運(yùn)行的時(shí)候x,y是可迭代對(duì)象的前兩個(gè),后面x都是之前的累加,y則是沒(méi)有進(jìn)行累加的第一個(gè),說(shuō)一下reduce(lambda x, y: x+y, num_li)這個(gè)吧,可以打個(gè)斷點(diǎn)看一下。

 
 
 
 
  1. 第一次x = 1 , y = 2 
  2. 第二次x = 3 , y = 3 
  3. 第三次x = 6 , y = 4 
  4. 第四次x = 10 , y = 5 
  5. ... 

匿名函數(shù)的好處:

  • 簡(jiǎn)化代碼
  • 沒(méi)有名字,避免函數(shù)名字沖突

查看某個(gè)模塊的所有方法:

 
 
 
 
  1. # print(dir(模塊名字)) 
  2. # 例如: 
  3. import time 
  4. print(dir(time)) 
  5.  
  6. print(dir(list)) 

提取數(shù)據(jù)結(jié)構(gòu):

 
 
 
 
  1. # 可能有這種需求,一個(gè)人給你個(gè)文件,讀取出來(lái)是文本,或者是需要計(jì)算的公式,但是他是字符串 
  2.  
  3. # 假如是個(gè)字典格式的 {'name':'sb'},但是他是個(gè)文本 
  4. temp1 = "{'name':'sb'}" 
  5. print(temp1,type(temp1)) 
  6. temp2 = eval(temp1) 
  7. print(temp2, type(temp2)) 
  8.  
  9. temp3 = "1+2" 
  10. print(eval(temp3)) 
  11.  
  12. # 注意只能提取出來(lái)格式與要提取的格式一樣的文本 

總結(jié):

本文基于Python,主要講解了遞歸思想和匿名函數(shù)相關(guān)知識(shí),例舉了幾個(gè)常用的匿名函數(shù)及其基本用法,如lambda、map、reduce、filter等,并簡(jiǎn)述了匿名函數(shù)的優(yōu)點(diǎn)。關(guān)于匿名函數(shù),還有以下一點(diǎn)需要注意。

匿名函數(shù)書(shū)寫(xiě)簡(jiǎn)單,適用于僅有一個(gè)簡(jiǎn)單表達(dá)式的函數(shù),并且避免了函數(shù)名字沖突的問(wèn)題,兩個(gè)函數(shù)名字沖突下面函數(shù)會(huì)覆蓋上面函數(shù)的功能,如:

 
 
 
 
  1. def func(): 
  2.    print('aaa') 
  3.  
  4. def func(): 
  5.    print('bbb') 
  6.  
  7.  
  8. func() 

但是編輯器能檢測(cè)出兩個(gè)同名的函數(shù),有一個(gè)編輯異常,雖然能正常運(yùn)行,但是顯然不符合代碼開(kāi)發(fā)規(guī)范。匿名函數(shù)沒(méi)有名字肯定不會(huì)出現(xiàn)函數(shù)名字重復(fù)。


網(wǎng)站名稱(chēng):Python中的匿名函數(shù)及遞歸思想簡(jiǎn)析
瀏覽地址:http://www.5511xx.com/article/dpgjhod.html