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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

python使用高阶函数实现_18.python高阶函数

發(fā)布時(shí)間:2024/7/23 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python使用高阶函数实现_18.python高阶函数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

什么是高階函數(shù):一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù)(一個(gè)函數(shù)可以用來接收另一個(gè)函數(shù)作為參數(shù)),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù)(若返回值為該函數(shù)本身,則為遞歸),滿足其一則為高階函數(shù)。函數(shù)的形參位置必須接受一個(gè)函數(shù)對象。

代碼理解高階函數(shù)的含義:

1 '''函數(shù)當(dāng)做參數(shù)被傳遞到另個(gè)函數(shù)是什么樣的。把a(bǔ)bs()函數(shù)賦值給了f變量,接下來就可以像使用abs()函數(shù)本身那樣使用f變量了,區(qū)別只是換了個(gè)名字而已'''

2

3 f = abs #將求絕對值的abs函數(shù)賦值給f變量

4 f(-123) #f變量等同于abs函數(shù)的功能和性質(zhì),區(qū)別只是換了個(gè)別名

5 print(f(-123)) #輸出結(jié)果 123

6 print(type(f)) # 查看下這個(gè)f變量的類型,顯示為內(nèi)置函數(shù),因?yàn)樗恼嫔砭褪莾?nèi)置abs()函數(shù)

7

8 '''這說明變量可以指向函數(shù),既然變量可以指向函數(shù),而我們知道函數(shù)的參數(shù)可以接收變量。也就是說一個(gè)函數(shù)可以接收另一個(gè)函數(shù)作為參數(shù),一起來看看下面這個(gè)例子'''

9 defadd_(a, b, f_):10 return f_(a) + f_(b) #在本例中等同于 abs(a) + abs(b)

11

12 result = add_(-10, -20, abs) #這里把python內(nèi)置函數(shù)abs作為參數(shù)傳遞給add_

13 print(result) #30

代碼演示高階函數(shù)兩種場景:

1 #高階函數(shù)之 ---》參數(shù)為函數(shù)

2 defbar():3 print("in the bar..")4 deffoo(func):5 func()6 print("in the foo..")7

8 foo(bar)9

10

11 #高階函數(shù)之 ---》返回值為函數(shù)

12 defbar():13 print("in the bar..")14 deffoo(func):15 print("in the foo..")16 returnbar17 res=foo(bar)18 res()19

20 '''以上兩個(gè)示例中,函數(shù)foo()為高階函數(shù)。示例一中函數(shù)bar作為foo的參數(shù)傳入;示例二中函數(shù)bar作為foo的返回值。

注意:函數(shù)名(例如bar 、foo)-->其為該函數(shù)的內(nèi)存地址;函數(shù)名+括號(hào)(例如 bar()、foo() )-->調(diào)用該函數(shù)'''

python里的高階函數(shù)有 filter、map、reduce、sorted、匿名函數(shù)lambda,遞歸函數(shù)等。

1). map函數(shù)

功能:map函數(shù)接收的是兩個(gè)參數(shù),接收一個(gè)函數(shù) f 和一個(gè)或多個(gè)序列l(wèi)ist,其功能是將序列中的值處理再依次返回至新列表內(nèi),其返回值為一個(gè)迭代器對象。

語法格式:map(function, iterable,[iterable1, ...iterablen]):

參數(shù):(1).function: 函數(shù)對象 ;(2).iterable:序列(可迭代)對象 (字符串、列表、range...)

返回值:得到的這個(gè)map對象是一個(gè)迭代器對象,屬于惰性序列的范疇。

代碼演示map實(shí)現(xiàn)原理:

1 #需求:將lt = ['1','2','3','4','5'] 轉(zhuǎn)換成 [1,2,3,4,5]

2

3 #代碼實(shí)現(xiàn)一:使用傳統(tǒng)技術(shù)來實(shí)現(xiàn)

4 lt = ['1','2','3','4','5','6']5 lt1 =[]6 for i inlt:7 num =int(i)8 lt1.append(num)9 print(lt1) #[1, 2, 3, 4, 5, 6] 由于列表屬于非惰性序列范疇,即可以直接打印看效果

10

11

12 #代碼實(shí)現(xiàn)二:使用新技術(shù)來實(shí)現(xiàn)

13 #思路步驟一:定義一個(gè)函數(shù),功能:將str數(shù)據(jù) --> int數(shù)據(jù)

14 importcollections15 lt = ['1','2','3','4','5','6']16 defchr2Int(chr):17 returnint(chr)18

19 mo = map(chr2Int,lt) #這里的chr2Int后面不能加(),也不能傳參*****

20 print(map,type(mo)) #

21 print(isinstance(mo,collections.Iterator)) #True,驗(yàn)證是否是迭代器對象,True才能使用next

22 print(next(mo)) #1

23 print(list(mo)) #[2, 3, 4, 5, 6] 將map對象(惰性的)轉(zhuǎn)換為list對象(非惰性的)

24

25

26 #代碼實(shí)現(xiàn)三:終極操作

27 print(list(map(chr2Int,lt))) #[1, 2, 3, 4, 5, 6]

28 print(list(map(int,lt)) #[1, 2, 3, 4, 5, 6]

29

30 '''map(int,lt):執(zhí)行過程如下:31 1).lt --> 取出第一個(gè)元素:'1'當(dāng)做實(shí)際參數(shù)傳遞給int函數(shù)的形參位置 --> int('1'),將轉(zhuǎn)換以后的結(jié)果:1保留到map對象的第一個(gè)元素位置32 2).lt --> 取出第二個(gè)元素:'2'當(dāng)做實(shí)際參數(shù)傳遞給int函數(shù)的形參位置 --> int('2'),將轉(zhuǎn)換以后的結(jié)果:2保留到map對象的第二個(gè)元素位置33 以此類推...34 直到map函數(shù)執(zhí)行完了,整個(gè)map對象才真正成型了...'''

代碼演示示例:

1 #實(shí)例1: lt = [1,2,3,4,5] --> 得到:['1','2','3','4','5']

2

3 lt = [1,2,3,4,5]4

5 #自定義函數(shù):從int --》 str

6 defint2Str(i):7 returnstr(i)8

9 print(list(map(int2Str,lt))) #['1', '2', '3', '4', '5']

10 print(list(map(str,lt))) #['1', '2', '3', '4', '5']

11 print(list(map(lambda x: str(x),lt))) #['1', '2', '3', '4', '5']

12

13

14 #實(shí)例2:lt = [1,2,3,4,5] --> 得到:[1,4,9,16,25]

15

16 lt = [1,2,3,4,5]17

18 #自定義函數(shù):目標(biāo)實(shí)現(xiàn)開方操作

19 defkaifang(num):20 return num ** 2

21

22 print(list(map(kaifang,lt))) #[1, 4, 9, 16, 25]

23 print(list(map(lambda x: x ** 2,lt))) #[1, 4, 9, 16, 25],map結(jié)合匿名函數(shù)使用,用的比較多

2).reduce函數(shù)

功能:reduce函數(shù)也是一個(gè)參數(shù)為函數(shù),一個(gè)為可迭代(序列)對象的高階函數(shù),但reduce()傳入的函數(shù)必須接收兩個(gè)參數(shù),reduce()對list的每個(gè)元素反復(fù)調(diào)用函數(shù)function。所以reduce()函數(shù)接收的參數(shù)和 map()類似,但是行為不同。reduce() 函數(shù)會(huì)對參數(shù)序列中元素進(jìn)行累積,其返回值為一個(gè)值而不是迭代器對象,故其常用與疊加、疊乘等。

語法格式:reduce(function, iterable[, iterable1,...,iterablen] [, initializer])

參數(shù):function -- 函數(shù),有兩個(gè)參數(shù)。iterable -- 可迭代對象。initializer -- 可選,初始參數(shù)

返回值:為一個(gè)值,而不是迭代器對象

【注意】:reduce函數(shù)屬于functools模塊中的函數(shù),所以需要顯示的先導(dǎo)入functools模塊再使用from functools import reduce

代碼演示reduce實(shí)現(xiàn)原理:

1 from functools importreduce2

3 '''當(dāng)調(diào)用reduce(f,[1,3,5,7,9])時(shí),reduce函數(shù)將做如下計(jì)算:由于f這個(gè)函數(shù)的功能是計(jì)算兩個(gè)元素的值,所以先計(jì)算頭兩個(gè)元素:f(1,3),4 結(jié)果為4;再把結(jié)果和第3個(gè)元素計(jì)算:f(4,5),結(jié)果為9;再把結(jié)果和第4個(gè)元素計(jì)算:f(9,7),結(jié)果為16;5 再把結(jié)果和第5個(gè)元素計(jì)算:f(16,9),結(jié)果為25;由于沒有更多的元素了,計(jì)算結(jié)束,返回結(jié)果25。'''

6 deff(x, y):7 return x +y8

9 result = reduce(f, [1, 3, 5, 7, 9])10 print(result) #25

11

12

13 '''reduce()**還可以接收第3個(gè)可選參數(shù),作為計(jì)算的初始值。如果把初始值設(shè)為100,如計(jì)算:結(jié)果將變?yōu)?25,

因?yàn)榈谝惠営?jì)算是:計(jì)算初始值和第一個(gè)元素:f(100, 1),結(jié)果為101。'''

14 reduce(f, [1, 3, 5, 7, 9], 100)15

16

17 #使用 lambda 匿名函數(shù)

18 reduce(lambda x, y: x+y, [1,3,5,7,9])

1 '''reduce函數(shù)執(zhí)行順序:先將lsd中的第一和第二個(gè)元素傳入到fn中參與運(yùn)算,運(yùn)算后得到結(jié)果,再和第三個(gè)元素傳入到fn中參與運(yùn)算,以此類推...'''

2

3 #需求:得到元祖tp = (1,2,3,4)中元素的和值

4

5 '''首先自定義函數(shù) --> add作用:對列表中的元素進(jìn)行求和操作 def add(x,y)6 然后使用reduce函數(shù)執(zhí)行過程如下:7 第一次:add(1,2)8 第二次:add(add(1,2),3)9 第三次:add(add(add(1,2),3),4)'''

10

11 #代碼實(shí)現(xiàn)一:遞歸的思想來實(shí)現(xiàn)

12 tp = (1,2,3,4)13 defmySum(num):14 if num == 1:15 return 1

16 return num + mySum(num - 1)17

18 print(mySum(4))19

20

21 #代碼實(shí)現(xiàn)二:reduce函數(shù)實(shí)現(xiàn)

22 from functools importreduce23 defadd(x,y):24 return x +y25

26 res =reduce(add,tp)27

28 print(res,type(res)) #10

29 print(reduce(lambda x,y: x +y,tp)) # 1030 print(sum(tp)) # 10直接使用內(nèi)置函數(shù)sum()了

代碼演示示例:

1 #實(shí)例1:lt = [1,2,3,4] 得到其中元素的乘積

2

3 lt = [1,2,3,4]4 print(reduce(lambda x,y: x *y,lt))5

6 #實(shí)例2:從鍵盤讀入一個(gè)整數(shù)字符串?dāng)?shù)據(jù),例如:'12345',將其轉(zhuǎn)換為12345;

7 '''注意:不能直接使用int()來實(shí)現(xiàn).思路:使用map和reduce配合來實(shí)現(xiàn)8 步驟一:'12345' --》拆分為散裝數(shù)據(jù):1 2 3 4 5 可以使用map來實(shí)現(xiàn)9 步驟二:將map對象中的數(shù)據(jù) 1 2 3 4 5 組合成為 --> 12345 可以使用reduce來實(shí)現(xiàn)10 '''

11 from functools importreduce12

13 str1 = '12345'

14 defchr2Int(str):15 returnint(str)16

17 defzuhe(x,y):18 return x * 10 +y19

20 mo =map(chr2Int,str1)21 num =reduce(zuhe,mo)22 print(num,type(num)) #12345

23

24

25 #終極版:

26 print(reduce(lambda x,y: x * 10 + y,map(int,str1))) #12345

3).filter函數(shù)

功能:filter()函數(shù)也是接收兩個(gè)參數(shù),接收一個(gè)函數(shù)和一個(gè)序列的高階函數(shù),其主要功能是過濾,過濾掉不符合條件的元素,序列的每個(gè)元素作為參數(shù)傳遞給函數(shù)進(jìn)行判,然后返回 True 或 False,最后將返回 True 的元素放到新序列中。filter的意思:在計(jì)算機(jī)領(lǐng)域中我們都稱為過濾器。

語法格式:filter(function, iterable)

參數(shù):和map、reduce一樣理解,function:判斷函數(shù),iterable :可迭代對象。

返回值:一個(gè)惰性序列對象(filter對象,迭代器對象),例如列表

代碼演示示例:

1 #示例1:lt = [1,2,3,4,5,6,7,8] --> 得到:[2,4,6,8]

2

3 lt = [1,2,3,4,5,6,7,8]4 #代碼實(shí)現(xiàn)一:老技術(shù)

5 lt1 =[]6 for i inlt:7 if i % 2 ==0:8 lt1.append(i)9

10 print(lt1)11

12

13 #代碼實(shí)現(xiàn)二:新技術(shù)(filter)

14 deffunc(o):15 if o % 2 ==0:16 returnTrue17 returnFalse18

19 fo =filter(func,lt)20

21 print(fo,type(fo)) #

22 print(list(filter(func,lt))) #[2, 4, 6, 8]

23 print(isinstance(fo,collections.Iterator)) #Ture

24 print(isinstance(fo,collections.Iterable)) #Ture

25 print(next(fo)) #2

26 print(next(fo)) #4

27 print(list(fo)) #[6, 8]

28

29

30 #終極版:

31 print(list(filter(lambda x:x % 2 == 0,lt))) #[2, 4, 6, 8]

32

33

34 #示例2:lt = [345,0,'abcde',1.2,0,3.14,0.0,'haha','hehe',True,False,[],(),{},{1,2,3},[10,20,30],{'name':'zs','age':30},None]

35 得到如下效果:lt = [345,'abcde',1.2,3.14,'haha','hehe',True,{1,2,3},[10,20,30],{'name':'zs','age':30}]36

37 lt = [345,0,'abcde',1.2,0,3.14,0.0,'haha','hehe',True,False,[]38 ,(),{},{1,2,3},[10,20,30],{'name':'zs','age':30},None]39

40 print(list(filter(lambdax: bool(x),lt)))41 #或者

42 print(list(filter(bool,lt)))43

44

45 #示例3:lt1 = ['aaaaaaaa','bbbbb','cccccc','ddd']得到如下效果:['aaaaaaaa','cccccc']

46

47 lt1 = ['aaaaaaaa','bbbbb','cccccc','ddd']48

49 print(list(filter(lambda x: len(x) > 5,lt1)))

高階函數(shù)以及匿名函數(shù)之間的配合使用(練習(xí)):

1 '''模板一:lambda和filter的配合使用'''

2 #需求:lt = [1,2,3,4,5,6,7,8,9] --> 得到[3,6,9]

3

4 print(list(filter(lambda x: x % 3 ==0,lt)))5

6

7 '''模板二:lambda 和map的配合使用'''

8 #需求:演示開平方操作 --> 容器對象:range

9

10 mo = map(lambda x: x ** 2,range(5))11 print(list(mo))12

13

14 '''模板三:在模板二的基礎(chǔ)上進(jìn)行功能擴(kuò)展:range(10),過濾以后保留的數(shù)據(jù)范圍大小為:(5,50)之間'''

15

16 mo = map(lambda x: x ** 2,range(10))17 fo = filter(lambda x: x > 5 and x < 50,mo)18 print(list(fo))19

20

21 '''模板四:lambda 和reduce配合使用'''

22 #求和值

23 importfunctools24

25 lt = [1,2,3,4,5]26

27 my_sum = functools.reduce(lambda x,y: x +y,lt)28 print(my_sum)29

30

31 '''模板五:求兩個(gè)列表對象中元素的和,返回新列表:32 lt1 = [1,2,3,4], lt2 = [5,6,7,8], 結(jié)果:lt3 = [6,8,10,12]'''

33

34 mo = map(lambda x,y: x +y,lt1,lt2)35 print(list(mo))36

37

38 '''模板六:求字符串中每個(gè)單詞的長度content = "welcome to shanghai", 結(jié)果:[7,2,8]'''

40 #使用切割的思想:切完之后得到一個(gè)列表對象,內(nèi)部元素["welcome","to","shanghai"]

41 words_list =content.split()42 mo =map(len,words_list)43 print(list(mo))

總結(jié)

以上是生活随笔為你收集整理的python使用高阶函数实现_18.python高阶函数的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美a免费 | 夜夜爽夜夜| 婷婷在线免费视频 | 在线视频精品 | 天天澡天天狠天天天做 | 蜜桃av噜噜 | 免费草逼网站 | 成人午夜精品一区二区三区 | 国产成人精品免费网站 | 日韩 国产 | 一级伦理农村妇女愉情 | 综合久久综合久久 | 久久综合88 | av在线影片 | 国产美女一区二区三区 | 亚洲爱情岛论坛永久 | 不卡av免费观看 | 伊人中文字幕 | 在线观看免费国产视频 | 自拍偷拍第 | 性欧美xxxx| 一本一道无码中文字幕精品热 | 亚洲精品视频国产 | 玖玖玖在线观看 | 免费黄色小视频网站 | 337p亚洲精品色噜噜狠狠 | 久久精品国产一区二区三区 | 国产99在线观看 | 婷婷调教口舌奴ⅴk | 进去里片欧美 | 正在播放木下凛凛xv99 | 上海毛片 | 日韩黄色三级 | 97人妻人人揉人人躁人人 | 欧美在线一二三区 | 久久综合久色欧美综合狠狠 | 啪视频在线观看 | av在线a| 九一国产视频 | 五月天婷婷激情视频 | 狠狠躁日日躁夜夜躁 | 亚洲一区二区三区蜜桃 | 超碰在线成人 | 色婷婷av久久久久久久 | 国产亚洲精品成人无码精品网站 | 免费av中文字幕 | 91视频在| 亚洲精品五月 | 国产精品99精品无码视亚 | 亚洲精品一二三四区 | 二级毛片在线观看 | av大片在线免费观看 | 色婷婷久久一区二区三区麻豆 | 老司机午夜免费视频 | 激情五月婷婷丁香 | 午夜两性视频 | 日本一区中文字幕 | 成人欧美一区二区三区白人 | 很黄很污的视频网站 | 亚洲精品国产精品国自 | 欧美做爰猛烈床戏大尺度 | 色综合中文网 | 欧美精品电影一区二区 | 黑人中文字幕一区二区三区 | 亚洲天天干 | 欧美一区二区激情视频 | 精品一区二区久久久久久按摩 | 色天天av | 漂亮人妻洗澡被公强 日日躁 | 欧美人成在线视频 | 欧美成年人在线观看 | 日韩最新av | a天堂视频 | 欧美色呦呦 | 中文av免费观看 | 精久久久 | 美女被草网站 | a级片在线看 | 夜夜爽夜夜叫夜夜高潮漏水 | 高清无打码 | 亚洲综合图片一区 | 狠狠躁18三区二区一区视频 | 在线观看黄网址 | 久久性网| 麻豆精品国产传媒av绿帽社 | 成人免费性生活视频 | 国产又粗又长又黄的视频 | 69视频网站 | 无码人妻精品一区二区三区99日韩 | 激情视频一区二区 | 日韩在线视频你懂的 | 老司机伊人| 欧美成人三级在线视频 | 精品久久香蕉国产线看观看亚洲 | 波多野结衣三区 | 亚洲av日韩精品久久久久久久 | 色999日韩 | 国产黄色一区二区 | 日韩一区二区三区精品 |