成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python中的匿名函數及遞歸思想簡析

開發 后端
上次咱們基本說了一下函數的定義及簡單使用,Python中的基本函數及其常用用法簡析,現在咱們整點進階一些的。同樣都是小白,咱也不知道實際需要不,但是對于函數的執行順序以及裝飾器的理解還是很有必要的。

匿名函數

前言

上次咱們基本說了一下函數的定義及簡單使用,Python中的基本函數及其常用用法簡析,現在咱們整點進階一些的。同樣都是小白,咱也不知道實際需要不,但是對于函數的執行順序以及裝飾器的理解還是很有必要的。

[[326783]]

首先咱們先簡單復習一下:

函數的定義:

 

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

函數的執行:

 

  1. # 函數只有被調用的時候才執行,函數可以執行多次 
  2. 函數名稱() 

局部與全局變量:

不同的函數有不同的作用域

 

  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. 局部與全局變量同名仍要同時使用全局變量局部變量 globals()['變量名'

還有一種情況就是函數內嵌套了函數想使用上次層函數的變量。

 

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

 

 

 

因為箭頭那里有空格,Python也是根據這種格式來判斷作用域的,只能像紅色框那樣在同一級的地方調用。

一個函數內返回另一個函數:

 

  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() 

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

遞歸的特性:

  • 遞歸就是自己調用自己
  • 必須有個明確的結束條件,不然會導致棧溢出
  • 每次遞歸問題都有所減少
  • 遞歸效率不高,但是有時候真的好用

來個最經典的斐波拉契數組。

 

  1. # 斐波拉契數組長這樣:1,1,2,3,5,8,13,21,34,55... 
  2. def fabonacci(n): 
  3.    # 結束條件 
  4.    if n <= 2: 
  5.        # 因為前兩個數字都是1,所以當n小于等于2時返回1 
  6.        v = 1 
  7.        return v 
  8.    # 大于2的話就自己調用自己,斐波拉契第n個數字等于n-1的數字+n-2數字的和 
  9.    v = fabonacci(n-1)+fabonacci(n-2) 
  10.    return v 
  11.  
  12.  
  13. print(fabonacci(6)) 

 

 

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

其實就是表達函數內調用另一個函數,會等待另一個函數執行完畢,該函數再執行到結束...感覺遞歸講不講都一樣了...so,咱們還是趕緊回到正題,代碼的執行順序是這樣子的....

 

 

 

 

當然還能這么玩:

 

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

匿名函數

  1. 使用lambda 創建
  2. 簡單來說匿名函數就是一個沒有名字的簡單函數
  3. 匿名函數只有一個表達式,return 表達式計算的值

創建一個簡單的匿名函數,命令如下所示。

 

  1. 格式       lambda 參數列表:表達式 

 

  1. lambda num1, num2: num1+num2 

使用一個變量接收一下,就是保存的內存地址,加上小括號傳入參數就能運行了。

 

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

我使用的編輯器是VS Code ,發現了一個問題,格式化代碼的時候把匿名函數改成了函數...具體原因及細節未知。

格式化前:

 

 

 

 

格式化后:

 

 

 

 

map 映射(循環讓每一個函數執行函數,結果保存到新的列表)

map(匿名函數,可迭代對象)

map()處理序列中的每個元素,得到的結果是一個可迭代對象,該對象個數和位置與原來一樣。

 

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

filter 判斷

filter()遍歷序列中的每個元素,得到的結果是True則留下來。

 

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

reduce:將序列進行合并操作

 

  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) 

第一次運行的時候x,y是可迭代對象的前兩個,后面x都是之前的累加,y則是沒有進行累加的第一個,說一下reduce(lambda x, y: x+y, num_li)這個吧,可以打個斷點看一下。

 

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

匿名函數的好處:

  • 簡化代碼
  • 沒有名字,避免函數名字沖突

查看某個模塊的所有方法:

 

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

提取數據結構:

 

  1. # 可能有這種需求,一個人給你個文件,讀取出來是文本,或者是需要計算的公式,但是他是字符串 
  2.  
  3. # 假如是個字典格式的 {'name':'sb'},但是他是個文本 
  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. # 注意只能提取出來格式與要提取的格式一樣的文本 

總結:

本文基于Python,主要講解了遞歸思想和匿名函數相關知識,例舉了幾個常用的匿名函數及其基本用法,如lambda、map、reduce、filter等,并簡述了匿名函數的優點。關于匿名函數,還有以下一點需要注意。

匿名函數書寫簡單,適用于僅有一個簡單表達式的函數,并且避免了函數名字沖突的問題,兩個函數名字沖突下面函數會覆蓋上面函數的功能,如:

 

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

 

但是編輯器能檢測出兩個同名的函數,有一個編輯異常,雖然能正常運行,但是顯然不符合代碼開發規范。匿名函數沒有名字肯定不會出現函數名字重復。

責任編輯:華軒 來源: Python爬蟲與數據挖掘
相關推薦

2020-05-11 09:38:52

Python開發函數

2023-10-17 11:34:42

2009-09-03 10:52:41

C#遞歸樹

2010-01-20 14:25:56

函數調用

2022-11-11 10:23:04

2015-05-13 10:36:43

2010-01-25 10:10:42

C++函數參數

2010-02-22 10:27:44

Python應用程序

2009-08-13 14:36:40

C#結構體構造函數

2011-07-12 14:04:58

2017-05-16 08:59:16

MVCCMYSQL樂觀鎖

2010-09-09 11:25:09

2010-09-10 13:57:55

echo命令

2010-09-13 16:58:13

2009-06-08 21:25:29

Java聲音技術

2010-09-08 16:25:39

SIP協議棧

2010-09-10 09:52:44

開源協議棧

2022-09-02 08:03:44

IO程序網卡

2010-05-06 12:02:43

路由負載均衡

2011-06-16 10:04:36

光纜光纖
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产传媒毛片精品视频第一次 | 欧美一区中文字幕 | 精品二三区 | 国产精品99久久久久久大便 | 中文字幕 在线观看 | 狠狠操狠狠操 | 国产无人区一区二区三区 | 国产激情片在线观看 | 午夜丁香视频在线观看 | 中文字幕国产精品视频 | 黄色一级毛片 | 久久久久久久久中文字幕 | 日韩黄 | 91精品国产综合久久久久久蜜臀 | 欧美自拍另类 | 天天操网 | 国产日韩欧美另类 | www.久久 | 欧美日韩精品中文字幕 | 久久r精品 | av永久免费 | 噜久寡妇噜噜久久寡妇 | 国产伦精品一区二区三区精品视频 | 日本高清视频在线播放 | 中文字幕高清免费日韩视频在线 | 日韩在线国产 | 精品久久久久久亚洲精品 | 综合九九 | 久久久久国产精品一区二区 | 亚洲综合大片69999 | 亚洲欧美在线一区 | 国产高清免费 | 国产高清精品一区二区三区 | av在线一区二区三区 | 国产主播第一页 | 天天弄| 日韩欧美亚洲 | 午夜一级做a爰片久久毛片 精品综合 | 亚洲乱码一区二区三区在线观看 | 欧美精品影院 | 欧美精品在线播放 |