[新星计划] Python高阶函数 | mapfiltersortedreduce
Posted mycpen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[新星计划] Python高阶函数 | mapfiltersortedreduce相关的知识,希望对你有一定的参考价值。
文章目录
系列文章
https://blog.csdn.net/cpen_web/category_11089219.html
● 介绍
高阶函数:把函数作为参数传入,这样的函数称为高阶函数。
# 示例
def func01(a, b):
print(f"a b")
def func02(func,a,b): # 注:把函数作为参数传递;func02称为高阶函数
print("start func......")
func(a,b)
func02(func01,"x","y")
○ 常用高阶函数
● map
用Python-map代码实现:f(x)=x*x
●内置函数map,map()函数接收两个参数,一个是函数,一个是Iterable(可多个)。
●map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
●map()传入的第一个参数是f,即函数对象本身。
●由于结果r是一个Iterator,Iterator是惰性序列。
●可通过list()函数让它把整个序列都计算出来并返回一个list。
●map()作为高阶函数,事实上它把运算规则抽象了,因此,我们不但可以计算简单的f(x)=x**2,还可以计算任意复杂的函数。
# 示例1:map 映射
def func(item): # 接收1个参数item
return item*item # 返回数的平方
a = [1,2,3,4,5,6] # 注:a是可迭代对象
result = map(func, a)
print(result) # 注:返回 map对象
#结果为 <map object at 0x0000020EDE156970>
print(list(result))
#结果为 [1, 4, 9, 16, 25, 36]
# 示例2:保留2位小数
b = [1.239865,4.56,3.2,9.82356]
result = map(lambda x:round(x,2), b)
print(list(result))
#结果为 [1.24, 4.56, 3.2, 9.82]
# 示例3:转化为百分数,并且保留2位小数
c = [0.000564, 0.456723, 0.5, 0.71345]
result = map(lambda x:format(x,'.2%'), c)
print(list(result))
#结果为 ['0.06%', '45.67%', '50.00%', '71.34%']
○ filter
用Python-filter代码实现:在一个list中,删掉偶数,只保留奇数
○Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。
○filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
○注意到filter()函数返回的是一个Iterator,也就是一个惰性序列。
# 示例1:保留奇数
a = [1,2,3,4,5,6,7,8]
def func01(x):
return x % 2 == 1 # 注:保留奇数;返回结果true\\false
result = filter(func01, a)
print(list(result))
#结果为 [1, 3, 5, 7]
# 示例2:返回100以内的回数
b = range(1, 101) # 注:字符串反向切片
def func02(x):
return str(x) == str(x)[::-1]
result = filter(func02, b)
print(list(result))
#结果为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 22, 33, 44, 55, 66, 77, 88, 99]
# 示例3:过滤出 1-100 以内 开平方根 是整数的数
# 方法:开平方后还在原列表里
# 过滤出 1-100 以内 开平方根 是整数的数
from math import sqrt
c = range(1, 101)
result = filter(lambda x:sqrt(x) in range(1, 101) , range(1, 101))
print(list(result)) # 注:开平方后的数还在 c 里面
#结果为 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
● sorted
用Python-sorted代码实现:按绝对值大小排序
sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序。
key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。
对比原始的list和经过key=abs处理过的list:
●执行语句:sorted([36, 5, -12, 9, -21], key=abs)
- 原始字符:list = [36, 5, -12, 9, -21]
- 经过key-abs对应得到:[36, 5, 12, 9, 21]
- 按照keys-abs排序结果:[5, 9, 12, 21, 36]
- 原始字符串最终结果:[5, 9, -12, -21, 36]
# 示例1:sorted(a)和a.sort()
>>> a = [1,2,4,3,0] # 注:不会改变a的值
>>> sorted(a) # 注:从小到大排序
[0, 1, 2, 3, 4]
>>> a.sort() # 注:会改变a的值
>>> a
[0, 1, 2, 3, 4]
# 示例2:全为布尔型,可以排序
>>> a = [1,True,0,False,"c"=="c"]
>>> sorted(a)
[0, False, 1, True, True]
# 示例3:按照字符串长度排序
# 注:按照首字母的ASCII码排序
>>> a = ["abc","defg","123456","1","sbbbfg"]
>>> sorted(a)
['1', '123456', 'abc', 'defg', 'sbbbfg']
# 注:按照字符串长度排序
>>> sorted(a,key=len)
['1', 'abc', 'defg', '123456', 'sbbbfg']
# 示例4:元组排序
# 元组的排序,先比较第一个值,再比较第二个,依次类推
>>> a=[(1,2),(2,2),(1,0),(2,4),(True,False)]
>>> sorted(a)
[(1, 0), (True, False), (1, 2), (2, 2), (2, 4)]
>>> sorted(a,reverse=True) # 注:反序 reverse=True
[(2, 4), (2, 2), (1, 2), (1, 0), (True, False)]
○ reduce
用Python-reduce代码实现:将列表[1,3,5,7,9],变成整数13579
○reduce把一个函数作用在一个序列[x1, x2, x3, …]上
○这个函数必须接收两个参数
○reduce把结果继续和序列的下一个元素做累积计算
○reduce(f, [x1, x2, x3, x4]) => f(f(f(x1, x2), x3), x4)
# 示例1:[1,2,3,4] --> 转化成1234
from functools import reduce # 注:导入模块
a = [1,2,3,4]
def func1(x,y): # 注:这个函数接收2个参数
return x*10+y
print(reduce(func1,a))
#结果为 1234
# 示例2:reduce 实现python的int功能
from functools import reduce
a = input("输入想要转化的数字:")
b = '1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'0':0
c = list(map(lambda i:b.get(i),a))
print(c)
def func(x,y):
return x*10+y
result = reduce(func,c)
print(result,type(result))
# 示例3:实现阶乘
from functools import reduce
n = int(input("输入"))
redu =reduce(lambda x,y:x*y,range(1,n+1))
print(redu)
#结果为 输入:4
#24
以上是关于[新星计划] Python高阶函数 | mapfiltersortedreduce的主要内容,如果未能解决你的问题,请参考以下文章
新星计划·2023-第1期 - Python赛道报名入口 -〖你就是下一个新星〗