07_Python-CSDN_高阶函数

:点击此处或下方 以展开或折叠目录

1
2
3
4
5
6
7
8
9
10
11
高阶函数:把函数作为参数传入,这样的函数称为高阶函数。

# 示例
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

● 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 示例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

○ filter

用Python-filter代码实现:在一个list中,删掉偶数,只保留奇数

○Python内建的filter()函数用于过滤序列。和map()类似,filter()也接收一个函数和一个序列。

○filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。

○注意到filter()函数返回的是一个Iterator,也就是一个惰性序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 示例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

● sorted

用Python-sorted代码实现:按绝对值大小排序

sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序。

key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

对比原始的list和经过key=abs处理过的list:

●执行语句:sorted([36, 5, -12, 9, -21], key=abs)

  1. 原始字符:list = [36, 5, -12, 9, -21]

  2. 经过key-abs对应得到:[36, 5, 12, 9, 21]

  3. 按照keys-abs排序结果:[5, 9, 12, 21, 36]

  4. 原始字符串最终结果:[5, 9, -12, -21, 36]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 示例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

○ 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 示例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