溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python中的匿名函數(shù)及遞歸思想分析

發(fā)布時間:2021-09-01 18:28:41 來源:億速云 閱讀:113 作者:chen 欄目:編程語言

本篇內(nèi)容主要講解“Python中的匿名函數(shù)及遞歸思想分析”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python中的匿名函數(shù)及遞歸思想分析”吧!

匿名函數(shù)

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

函數(shù)的定義:

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

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

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

局部與全局變量:

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

def test1():     name = 'XXX'     print(name)   def test2():     name = 'YYY'     print(name)   test1() test2()
局部想使用全局變量 使用global 變量名 局部與全局變量同名仍要同時使用全局變量局部變量 globals()['變量名']

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

def test1():    name = 'XXX'     def test2():        # 使用上一層的變量并打印查看        nonlocal name        print(name)    # 在函數(shù)test1中調(diào)用執(zhí)行test2    test2()   test1() # 直接調(diào)用test2會拋出異常test2 未定義 # test2()

Python中的匿名函數(shù)及遞歸思想分析

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

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

def test1():    print("in the test1")   def test2():    print("in the test2")    return test1()   test2()

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

遞歸的特性:

  • 遞歸就是自己調(diào)用自己

  • 必須有個明確的結(jié)束條件,不然會導(dǎo)致棧溢出

  • 每次遞歸問題都有所減少

  • 遞歸效率不高,但是有時候真的好用

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

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

Python中的匿名函數(shù)及遞歸思想分析

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

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

Python中的匿名函數(shù)及遞歸思想分析

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

def test1():    print("in the test1")   def test2():    print("in the test2")    # 此處返回test1的內(nèi)存地址    return test1   test2()() # 先執(zhí)行test2(),返回test1的內(nèi)存地址 # 加上小括號執(zhí)行test1

匿名函數(shù)

  1. 鴻蒙官方戰(zhàn)略合作共建——HarmonyOS技術(shù)社區(qū)

  2. 使用lambda 創(chuàng)建

  3. 簡單來說匿名函數(shù)就是一個沒有名字的簡單函數(shù)

  4. 匿名函數(shù)只有一個表達(dá)式,return 表達(dá)式計(jì)算的值

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

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

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

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

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

格式化前:

Python中的匿名函數(shù)及遞歸思想分析

格式化后:

Python中的匿名函數(shù)及遞歸思想分析

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

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

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

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

filter 判斷

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

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

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

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

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

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

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

  • 簡化代碼

  • 沒有名字,避免函數(shù)名字沖突

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

# print(dir(模塊名字)) # 例如: import time print(dir(time))  print(dir(list))

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

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

總結(jié):

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

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

def func():    print('aaa')  def func():    print('bbb')   func()

Python中的匿名函數(shù)及遞歸思想分析

Python中的匿名函數(shù)及遞歸思想分析

Python中的匿名函數(shù)及遞歸思想分析

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

到此,相信大家對“Python中的匿名函數(shù)及遞歸思想分析”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI