15.高阶函数

一、高阶函数

函数的本质:函数是一个变量,函数名是一个变量名,一个函数可以作为另一个函数的参数或返回值使用

如果A函数作为B函数的参数,B函数调用完成之后,会得到一个结果,则B函数被称为高阶函数

常用的高阶函数:map(),reduce(),filter(),sorted()

1.map()

map(func,iterable),返回值是一个iterator【容器,迭代器】

​ func:函数​ iterable:可迭代对象【容器】,可以是多个,常用列表

功能:将iterable容器中的每一个元素传递给func,func返回一个结果,结果会成为iterator中的元素

容器----》func----》新的容器

"""
iterable:可迭代对象,list,tuple,str,dict,set,range(),生成器都是可迭代对象
iterator:迭代器,只有生成器是迭代器
"""
​
"""
map(func,iterable...),返回值是一个iterator【容器,迭代器】
    func:函数
    iterable:可迭代对象【容器】,可以是多个,常用列表
​
功能:将iterable容器中的每一个元素传递给func,func返回一个结果,结果会成为iterator中的元素
     容器----》func----》新的容器
"""
# 1.生成一个容器,其中的元素是1,4,9,16,25
# 方式一
list1 = [i ** 2 for i in range(1,6)]
print(list1)
​
# 方式二
def func1(x):
    return x ** 2
r1 = map(func1,range(1,6))
print(r1)
# for ele in r1:
#     print("结果:",ele)
print(list(r1))
​
# 方式三:一般情况下,如果需要自定义的函数作为参数使用且逻辑比较简单,建议使用匿名函数
r2 = map(lambda x:x ** 2,range(1,6))
print(r2)
print(list(r2))
​
# 2.
# 注意:func需要设置几个参数,取决于有几个iterable参与运算
# func的形参个数必须和iterable的个数保持一致
# 工作原理:将多个iterable相同索引出的元素同时传值给func
def func2(x,y):
    return x + y
r3 = map(func2,[1,2,3],[4,5,6])
print(list(r3))  # [5, 7, 9]
​
r4 = map(lambda x,y:x + y,[1,2,3],[4,5,6])
print(list(r4))  # [5, 7, 9]

2.reduce()

reduce(func,seq)

​ func:函数​ seq:序列【容器】

功能:减少

首先将seq中的第0个元素和第1个元素传递给func,进行运算,返回结果1接着,将 结果1 和第2个元素传递给func,进行运算,返回结果2接着,将 结果2 和第3个元素传递给func,进行运算,返回结果3....直到所有的元素全部参与运算,表示运算结束

"""
reduce(func,seq)
    func:函数
    seq:序列【容器】
功能:减少
工作原理:
    首先将seq中的第0个元素和第1个元素传递给func,进行运算,返回结果1
接着,将 结果1 和第2个元素传递给func,进行运算,返回结果2
接着,将 结果2 和第3个元素传递给func,进行运算,返回结果3
....
直到所有的元素全部参与运算,表示运算结束
​
分析:
    reduce(func,[a,b,c,d])
    r1 = func(a,b)
    r2 = func(r1,c)
    r3 = func(r2,d)
​
    r3 = func(func(func(a,b),c),d)
​
    seq--->func---->value
"""
​
# 注意:reduce中的函数一定是两个参数,最终得到的结果是一个值
​
from functools import  reduce
​
# 1.求1~100之间的所有整数的和
# 方式一
total1 = 0
for i in range(1,101):
    total1 += i
print(total1)
​
# 方式二
total2 = sum(range(1,101))
print(total2)
​
# 方式三
def add(x,y):
    # print(x,y)
    return x + y
r = reduce(add,range(1,101))
print(r)
​
# 方式四
r = reduce(lambda x,y:x + y,range(1,101))
print(r)
​
# 2.练习
# a.求20的阶乘
r = reduce(lambda x,y:x * y,range(1,21))
print(r)
​
# b.已知列表[2,5,3,9],通过reduce做出操作,得到2539数字
"""
2,5----》25---》2 * 10 + 5
25,3----》253---》25 * 10 + 3
253,9---》2539----》253 * 10 + 9
"""
numlist = [2,5,3,9]
r = reduce(lambda x,y:x * 10 + y,numlist)
print(r)
​
# r = int(reduce(lambda x,y:str(x) + str(y),numlist))
# print(r)

3.filter()

filter(func,iterable):过滤

​ func:函数​ iterable:可迭代对象

功能:将iterable中的元素依次传递给func,根据func的返回值决定是否保留该元素,如果func的返回值为True,则表示当前元素需要保留,如果为False,则表示过滤

"""
filter(func,iterable):过滤,返回值是迭代器
    func:函数
    iterable:可迭代对象【容器】
​
功能:将iterable中的元素依次传递给func,根据func的返回值决定是否保留该元素,
     如果func的返回值为True,则表示当前元素需要保留,如果为False,则表示过滤
"""
​
# 1.需求:已知列表list1 = [234,45,56,76,8,2,34,56,6,1,2,34,56,19,45]
# 将其中的奇数过滤掉
list1 = [234,45,56,76,8,2,34,56,6,1,2,34,56,19,45]
# 方式一
list2 = []
for num in list1:
    if num % 2 == 0:
        list2.append(num)
print(list2)
​
# 方式二
list3 = [num for num in list1 if num % 2 == 0]
print(list3)
​
# 方式三
def func(x):
    # if x % 2 == 0:
    #     return True
    # return False
​
    return x % 2 == 0
​
r = filter(func,list1)
print(r)
print(list(r))
​
# 方式四
r1 = filter(lambda x:x % 2 == 0,list1)
print(list(r1))
​
# 练习:已知列表,将其中的数字元素挑出来
datalist = ['faf','gag',10,'hello',35,45,7,8]
# 方式一
list1 = [data for data in datalist if type(data) == int or type(data) == float]
print(list1)
# 方式二
list2 = list(filter(lambda x:type(x) == int or type(x) == float,datalist))
print(list2)

4.sorted()

【面试题】列表中的sort函数和高阶函数sorted的区别和联系1.调用语法:

​ 列表.sort(reverse,key=func),

​ sorted(iterable,reverse,key=func)

2.结果:sort是在原列表内部排序的,sorted是生成了一个新的列表3.二者默认情况下都是升序排序,如果要降序,则都是设置reverse=True

"""
【面试题】列表中的sort函数和高阶函数sorted的区别和联系
1.调用语法:
    列表.sort(reverse,key=func),
    sorted(iterable,reverse,key=func)
2.结果:sort是在原列表内部排序的,sorted是生成了一个新的列表
3.二者默认情况下都是升序排序,如果要降序,则都是设置reverse=True
"""
​
"""
sorted(list,reverse,key=func)
    list:需要排序的列表
    reverse:表示升序还是降序,默认值为False表示升序,如果设置为True则表示降序
    key=func:表示自定义排序的规则,工作原理:将列表中的元素依次传递给func,func的返回值就是排序的规则
"""
# 1.升序
list1 = [34,1,4,67]
list1.sort()
print(list1)
​
# 【面试题】
list1 = [34,1,4,67]
sorted(list1)
print(list1)  # [34,1,4,67]
​
# 正确写法
list1 = [34,1,4,67]
list2 = sorted(list1)
print(list2)  # [1, 4, 34, 67]
​
# 2.降序
list1 = [34,1,4,67]
list1.sort(reverse=True)
print(list1)
​
list1 = [34,1,4,67]
list2 = sorted(list1,reverse=True)
print(list2)
​
# 3.自定义排序规则,如果系统有存在的函数,则直接使用,如果不存在,则自定义
# 需求:按照字符串的长度进行降序排序
list2 = ['4562','fahgjahgja','xag','r','gaga4']
list2.sort(reverse=True,key=len)
print(list2)
​
list2 = ['4562','fahgjahgja','xag','r','gaga4']
list21 = sorted(list2,reverse=True,key=len)
print(list21)
​
# 练习:按照年龄进行升序排序
students = [
    {'name':'aaa','age':10},
    {'name':'ccc','age':17},
    {'name':'bbb','age':13},
    {'name':'eee','age':20},
    {'name':'ddd','age':11}
]
students.sort(key=lambda x:x['age'])
print(students)
​
students = [
    {'name':'aaa','age':10},
    {'name':'ccc','age':17},
    {'name':'bbb','age':13},
    {'name':'eee','age':20},
    {'name':'ddd','age':11}
]
new_students = sorted(students,key=lambda x:x['age'])
print(new_students)

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiayi_init_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值