Python之高阶函数(abs、map、reduce、filter、lambda匿名函数)
Python之高階函數(shù)(abs、map、reduce、filter、lambda匿名函數(shù))
- 什么是內(nèi)置高階函數(shù)
高階函數(shù):一個(gè)函數(shù)可以作為參數(shù)傳給另外一個(gè)函數(shù),或者一個(gè)函數(shù)的返回值為另外一個(gè)函數(shù)(若返回值為該函數(shù)本身,則為遞歸),滿足其一則為高階函數(shù)。
- abs函數(shù)
abs() 函數(shù)返回?cái)?shù)字的絕對(duì)值。
示例:
>>> a = -16 >>> print(abs(a)) 16 >>> print(abs(-5)) 5 >>> f = abs >>> print(f(-10)) 10函數(shù)本身也可以賦值給變量,變量可以指向函數(shù):
[kiosk@foundation13 ~]$ vim test.py [kiosk@foundation13 ~]$ cat test.py def fun(x,y,f):return f(x),f(y) print(fun(-10,34,abs)) [kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test.py (10, 34)- map函數(shù)
map()函數(shù)接收的是兩個(gè)參數(shù),一個(gè)函數(shù),一個(gè)序列(列表),其功能是將傳入的函數(shù)依次作用到序列的每個(gè)元素,并且把結(jié)果作為新的序列返回。
示例:
1.對(duì)于一個(gè)序列[-1,3,-4,-5]的每一個(gè)元素求絕對(duì)值
2.對(duì)于每個(gè)元素求階乘
[kiosk@foundation13 ~]$ vim test1.py [kiosk@foundation13 ~]$ cat test1.py import random def factoria(x):res = 1for i in range(1,x+1):res = res * ireturn res li = [random.randint(2,7) for i in range(10)] print(list(map(factoria,li))) [kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test1.py [2, 24, 24, 120, 5040, 720, 720, 2, 720, 24] [kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test1.py [720, 720, 5040, 720, 5040, 5040, 24, 120, 24, 120] [kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test1.py [5040, 720, 120, 2, 24, 5040, 720, 2, 6, 24]- reduce函數(shù)
reduce():把一個(gè)函數(shù)作用在一個(gè)序列上,這個(gè)函數(shù)必須接收兩個(gè)參數(shù)
reduce把結(jié)果繼續(xù)和序列的下一個(gè)元素做累積計(jì)算
reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
python2中:reduce是內(nèi)置函數(shù)
python3中 from functools import reduce
示例:
[kiosk@foundation13 ~]$ vim test2.py [kiosk@foundation13 ~]$ cat test2.py from functools import reduce def multi(x,y):return x*y print(reduce(multi,range(1,5)))def add(x,y):return x+y print(reduce(add,range(1,6))) [kiosk@foundation13 ~]$ /usr/local/python3/bin/python3 test2.py 24 15- filter函數(shù)
和map()函數(shù)類似的,也接收一個(gè)函數(shù)和一個(gè)序列,但是和map()不同的是,filter()把傳入的函數(shù)依次作用于每個(gè)元素,然后根據(jù)返回值是True或者False決定保留還是丟棄該元素。
示例:
0~100之間的偶數(shù):
l
- lambda匿名函數(shù)
lambda()匿名函數(shù)是指一類無需定義標(biāo)識(shí)符(函數(shù)名)的函數(shù)或子程序。
lambda 函數(shù)可以接收任意多個(gè)參數(shù) (包括可選參數(shù)) 并且返回單個(gè)表達(dá)式的值。
匿名函數(shù)的關(guān)鍵字為 lambda。
冒號(hào)前面是形參,冒號(hào)后面是返回值。
示例:
分別打印元素的累加、平方、范圍內(nèi)的所有偶數(shù):
- 高階函數(shù)的綜合練習(xí)
1.將一個(gè)字符串轉(zhuǎn)換成整型 ‘332.31321’
from functools import reducedef str2int(s):def char2int(ch):c = {str(x): x for x in range(10)}return c[ch]def fun(n1, n2):return n1 * 10 + n2return reduce(fun, map(char2int, s))num = str2int('12345') print(type(num), num)2.利用map()函數(shù),把用戶輸入的不規(guī)范的英文名字,變?yōu)槭鬃帜复髮?#xff0c;其他小寫的規(guī)范名字
def zz(x):return x.capitalize() name = input('請(qǐng)輸入英文名字:') print(list(map(zz, name.split())))3.利用map和reduce編寫一個(gè)str2float函數(shù),把字符串’123.456’轉(zhuǎn)換成浮點(diǎn)數(shù)123.456
from functools import reduce def str2float(s):s1 = s.split('.')[0]s2 = s.split('.')[1][::-1]c2n = {str(i):i for i in range(1,10)}def number(x):return c2n[x]def before_c2n(x,y):return x*10+ydef after_c2n(x,y):return x*0.1+yreturn reduce(before_c2n,map(number,s1)) + 0.1*reduce(after_c2n,(map(number,s2))) print(str2float('345.678'))4.回?cái)?shù)是指從左向右讀和從右向左讀都是一樣的數(shù),例如12321,909。請(qǐng)利用filter()篩選出回?cái)?shù)
def huishu(s):s = str(s)return s == s[::-1] li = [123,23432,121,4567,12421] print(list(filter(huishu,li)))END
總結(jié)
以上是生活随笔為你收集整理的Python之高阶函数(abs、map、reduce、filter、lambda匿名函数)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式之工厂模式类图
- 下一篇: python学习3:IDEL(pytho