掃二維碼與項(xiàng)目經(jīng)理溝通
我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
上次咱們基本說了一下函數(shù)的定義及簡單使用,Python中的基本函數(shù)及其常用用法簡析,現(xiàn)在咱們整點(diǎn)進(jìn)階一些的。同樣都是小白,咱也不知道實(shí)際需要不,但是對于函數(shù)的執(zhí)行順序以及裝飾器的理解還是很有必要的。

創(chuàng)新互聯(lián)建站專注于民樂企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),購物商城網(wǎng)站建設(shè)。民樂網(wǎng)站建設(shè)公司,為民樂等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)建站專業(yè)和態(tài)度為您提供的服務(wù)
首先咱們先簡單復(fù)習(xí)一下:
函數(shù)的定義:
- def 函數(shù)名字(參數(shù)):
- 具體的函數(shù)語句塊
- return [需要返回的數(shù)據(jù)]
函數(shù)的執(zhí)行:
- # 函數(shù)只有被調(diào)用的時(shí)候才執(zhí)行,函數(shù)可以執(zhí)行多次
- 函數(shù)名稱()
局部與全局變量:
不同的函數(shù)有不同的作用域
- def test1():
- name = 'XXX'
- print(name)
- def test2():
- name = 'YYY'
- print(name)
- test1()
- test2()
- 局部想使用全局變量 使用global 變量名
- 局部與全局變量同名仍要同時(shí)使用全局變量局部變量 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()
因?yàn)榧^那里有空格,Python也是根據(jù)這種格式來判斷作用域的,只能像紅色框那樣在同一級的地方調(diào)用。
一個(gè)函數(shù)內(nèi)返回另一個(gè)函數(shù):
- def test1():
- print("in the test1")
- def test2():
- print("in the test2")
- return test1()
- test2()
想把上面的這段代碼解釋清楚,咱們插播一個(gè)遞歸。
遞歸的特性:
來個(gè)最經(jīng)典的斐波拉契數(shù)組。
- # 斐波拉契數(shù)組長這樣:1,1,2,3,5,8,13,21,34,55...
- def fabonacci(n):
- # 結(jié)束條件
- if n <= 2:
- # 因?yàn)榍皟蓚€(gè)數(shù)字都是1,所以當(dāng)n小于等于2時(shí)返回1
- v = 1
- return v
- # 大于2的話就自己調(diào)用自己,斐波拉契第n個(gè)數(shù)字等于n-1的數(shù)字+n-2數(shù)字的和
- v = fabonacci(n-1)+fabonacci(n-2)
- return v
- print(fabonacci(6))
- import sys
- # 打印當(dāng)前遞歸深度,默認(rèn)為1000
- print(sys.getrecursionlimit())
- # 設(shè)置最大遞歸深度
- sys.setrecursionlimit(999999999)
- print(sys.getrecursionlimit())
其實(shí)就是表達(dá)函數(shù)內(nèi)調(diào)用另一個(gè)函數(shù),會等待另一個(gè)函數(shù)執(zhí)行完畢,該函數(shù)再執(zhí)行到結(jié)束...感覺遞歸講不講都一樣了...so,咱們還是趕緊回到正題,代碼的執(zhí)行順序是這樣子的....
當(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ù)
創(chuàng)建一個(gè)簡單的匿名函數(shù),命令如下所示。
- 格式 lambda 參數(shù)列表:表達(dá)式
- lambda num1, num2: num1+num2
使用一個(gè)變量接收一下,就是保存的內(nèi)存地址,加上小括號傳入?yún)?shù)就能運(yùn)行了。
- func = lambda num1, num2: num1+num2
- print(func(1, 2))
我使用的編輯器是VS Code ,發(fā)現(xiàn)了一個(gè)問題,格式化代碼的時(shí)候把匿名函數(shù)改成了函數(shù)...具體原因及細(xì)節(jié)未知。
格式化前:
格式化后:
map 映射(循環(huán)讓每一個(gè)函數(shù)執(zhí)行函數(shù),結(jié)果保存到新的列表)
map(匿名函數(shù),可迭代對象)
map()處理序列中的每個(gè)元素,得到的結(jié)果是一個(gè)可迭代對象,該對象個(gè)數(shù)和位置與原來一樣。
- li = [1, 5, 3, 2, 3]
- res = map(lambda x: x+1, li)
- print(type(res))
- # 返回的map對象
- print(list(res))
filter 判斷
filter()遍歷序列中的每個(gè)元素,得到的結(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)行的時(shí)候x,y是可迭代對象的前兩個(gè),后面x都是之前的累加,y則是沒有進(jìn)行累加的第一個(gè),說一下reduce(lambda x, y: x+y, num_li)這個(gè)吧,可以打個(gè)斷點(diǎn)看一下。
- 第一次x = 1 , y = 2
- 第二次x = 3 , y = 3
- 第三次x = 6 , y = 4
- 第四次x = 10 , y = 5
- ...
匿名函數(shù)的好處:
查看某個(gè)模塊的所有方法:
- # print(dir(模塊名字))
- # 例如:
- import time
- print(dir(time))
- print(dir(list))
提取數(shù)據(jù)結(jié)構(gòu):
- # 可能有這種需求,一個(gè)人給你個(gè)文件,讀取出來是文本,或者是需要計(jì)算的公式,但是他是字符串
- # 假如是個(gè)字典格式的 {'name':'sb'},但是他是個(gè)文本
- 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)知識,例舉了幾個(gè)常用的匿名函數(shù)及其基本用法,如lambda、map、reduce、filter等,并簡述了匿名函數(shù)的優(yōu)點(diǎn)。關(guān)于匿名函數(shù),還有以下一點(diǎn)需要注意。
匿名函數(shù)書寫簡單,適用于僅有一個(gè)簡單表達(dá)式的函數(shù),并且避免了函數(shù)名字沖突的問題,兩個(gè)函數(shù)名字沖突下面函數(shù)會覆蓋上面函數(shù)的功能,如:
- def func():
- print('aaa')
- def func():
- print('bbb')
- func()
但是編輯器能檢測出兩個(gè)同名的函數(shù),有一個(gè)編輯異常,雖然能正常運(yùn)行,但是顯然不符合代碼開發(fā)規(guī)范。匿名函數(shù)沒有名字肯定不會出現(xiàn)函數(shù)名字重復(fù)。

我們在微信上24小時(shí)期待你的聲音
解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流