日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

匿名函数自我调用_Python中的匿名函数及递归思想简析

發布時間:2023/12/10 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 匿名函数自我调用_Python中的匿名函数及递归思想简析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

匿名函數

前言

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

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

函數的定義:

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

函數的執行:

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

局部與全局變量:

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

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

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

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

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

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

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

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

遞歸的特性:

  • 遞歸就是自己調用自己

  • 必須有個明確的結束條件,不然會導致棧溢出

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

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

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

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

import sys# 打印當前遞歸深度,默認為1000print(sys.getrecursionlimit())# 設置最大遞歸深度sys.setrecursionlimit(999999999)print(sys.getrecursionlimit())

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

當然還能這么玩:

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

匿名函數

  • 使用lambda 創建

  • 簡單來說匿名函數就是一個沒有名字的簡單函數

  • 匿名函數只有一個表達式,return 表達式計算的值

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

    格式???????lambda?參數列表:表達式lambda?num1,?num2:?num1+num2

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

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

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

    格式化前:

    格式化后:

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

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

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

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

    filter 判斷

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

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

    reduce:將序列進行合并操作

    from functools import reducenum_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)

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

    第一次x = 1 , y = 2第二次x = 3 , y = 3第三次x = 6 , y = 4第四次x = 10 , y = 5...
    匿名函數的好處:
    • 簡化代碼

    • 沒有名字,避免函數名字沖突

    查看某個模塊的所有方法:
    # print(dir(模塊名字))# 例如:import timeprint(dir(time))print(dir(list))

    提取數據結構:

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

    總結:

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

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

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

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

    End

    碼農升級

    長按二維碼關注

    你點的每個在看,我都認真當成了喜歡

    總結

    以上是生活随笔為你收集整理的匿名函数自我调用_Python中的匿名函数及递归思想简析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。