python3---高阶函数

本文深入探讨Python3中的高阶函数,包括map、reduce、filter和sorted的使用方法及其应用,同时介绍了lambda匿名函数的定义与实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

高阶函数

【1】高阶函数的理解和简单使用

定义函数:
	def fun(a,b):
	    return a+b
调用函数:
	a = fun(1,2)
	print(a)
高阶函数:
	 - 实参是一个函数名
	 - 函数的返回值是一个函数
	 - 函数本身也可以赋值给变量 变量可以指向函数
print(abs(-11))
f = abs
print(f(-10))
高阶函数传递的参数包含函数名
	def fun(x,y,f):
	    return f(x),f(y)
	print(fun(-10,34,abs))

【2】内置高阶函数—map(函数,序列)

1> map函数的使用方法
map()函数接收两个参数,一个是函数,一个是序列
map将传入的函数依次作用到序列的每个元素,并且把结果
作为新的序列返回
print(map(abs,[-2,9,-5]))	<map object at 0x7f31257242e8>	返回的是一个对象
print(list(map(abs,[-2,9,-5]))	把map对象用列表生成式表示出来
2>内置高阶函数- map函数的应用
map( )函数接收两个参数,一个是函数,一个是序列
map( )将传入的函数依次作用到序列的每个元素,并且把结果作为新的序列返回
需求1:对于序列[-1,3,-4,-5]的每个元素求绝对值
print(list(map(abs,[1,-3,-4,5]))

map函数的应用1:对于序列的每个元素求阶乘

import random
def factoria(x):
    """对与x求阶乘"""
    res = 1
    for i in range(1,x+1):
        res = res * i
    return res
li = [random.randint(2,7) for i in range(10)]
print(list(map(factoria,li))) 	#将li序列中的每个元素依次作用于factoria函数

map函数的应用2:用户接收遗传数字;将该字符串中的所有数字转化为整型并以列表格式输出
在这里插入图片描述

练习:
题目描述:
现在IPV4下用一个32位无符号整数来表示,一般用点分方式来显示,点将IP地址分成4个部分,每个部分为8位,表示成一个无符号整数(因此不需要用正号出现);
如10.137.17.1,是我们非常熟悉的IP地址,一个IP地址串中没有空格出现(因为要表示成一个32数字);
现在需要你用程序来判断IP是否合法。

输入描述:
输入一个ip地址
输出描述:
返回判断的结果YES or NO

示例1:
输入
10.138.15.1
输出
YES
num = list(map(int, input().split('.')))
count = 0
for i in num:
    if i >= 0 or i <= 255:
        count += 1
if count == 4:
    print('YES')
else:
    print('NO')

【3】内置高阶函数—reduce(函数,序列)

1> reduce函数的使用方法
 reduce:把一个函数作用在一个序列上,这个函数必须接收两个参数
 
 reduce:把结果继续和序列的下一个元素做累积计算
 	reduce(f,[x1,x2,x3,x4]) = f(f(f(x1,x2),x3),x4)
 	
 使用reduce函数需要导入函数:from functools import reduce
from functools import reduce
"""
python2:reduce为内置函数
python3:from functools import reduce
"""

# 累乘
def multi(x,y):
    return x*y

print(reduce(multi,range(1,4)))

# 累加
def add(x,y):
    return x+y

print(reduce(add,[1,2,3,4,5]))
2> reduce函数的应用

在这里插入图片描述

【4】内置高阶函数—filter(函数,序列)

1> filter函数的使用方法
filter:过滤函数和map()类似,filter()也接收一个函数和一个序列;
	但是和map()不同的是,filter()把传入的函数依次作用于每个元素;
	然后根据返回值是True还是False决定保留还是丢弃该元素;
	
	函数中只能接受一个形参,函数的返回值只能是True或者False;
2> filter函数的应用
# 函数只能有一个形参,函数的返回值只能是True或者False
def f(n):
    if n % 2 == 0:
        return True
    else:
        return False
print(list(filter(f,range(100))))
`拿出1~100之间的所有素数`

在这里插入图片描述

【5】内置高阶函数—sorted(函数)

1> list.sort()和sorted()的比较
list.sort():是在原列表上面进行排序
sorted():是将原函数重新排序,生成一个新的列表
sorted( )函数也是接收两个参数,一个是序列,一个是函数
不同的是,sorted( )先写序列,再写函数

在这里插入图片描述

2> sorted()函数的应用

应用1:对商品进行排序
在这里插入图片描述
在这里插入图片描述
应用2:

给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
# 输入:
    第一行是数组长度, 后续每一行是数组的一条记录;
    4
    0
    7
    0
    2
# 输出:
    调整后数组的内容;
    7
    2
    0
    0

[1]
在这里插入图片描述
[2]
在这里插入图片描述

【6】匿名函数—lambda

1> lambda函数的定义
1. 匿名函数的关键字为  lambda, 冒号前面是形式参数, 冒号后面是返回值;
2. 匿名函数的形式参数可以是: 必选, 默认, 可变, 关键字参数
3. 匿名函数经常和高阶函数连接使用。
2> lambda函数的使用
1>.f = lambda : "hello"
   print(f())
2>.f1 = lambda x, y=2: x**y
   print(f1(2))
   print(f1(2,3))
3>.f4 = lambda x,y=2,*args,**kwargs: (x,y,args,kwargs)
   print(f4(2,3,4,5,a=1,b=2))
4>.from functools import reduce
   print(reduce(lambda x, y: x + y, range(5)))
5>.print(list(map(lambda x: x ** 2, range(5))))

在这里插入图片描述

reduce
from functools import reduce

# reduce()函数实现累加
def add(x, y):
    return x + y   
print(reduce(add, [1, 2, 3, 4, 5]))

# 匿名函数结合reduce()函数实现累加
print(reduce(lambda x, y: x + y, [1, 2, 3, 4, 5]))
map
# map()函数求序列内元素的平方
def mypow(x):
    return x ** 2    
print(list(map(mypow, range(5))))

# 匿名函数结合map()函数求序列内元素的平方
print(list(map(lambda x: x ** 2, range(5))))
filter
# filter()函数找序列中的偶数
def is_odd(x):
    return x % 2 == 0    
print(list(filter(is_odd, range(10))))

# 匿名函数结合filter()函数找序列中的偶数
print(list(filter(lambda x: x % 2 == 0, range(10))))
sorted
# 匿名函数结合sorted()函数对序列进行排序
Info = [
    # 商品名称 商品数量 商品单价
    ['apple1', 100, 35],
    ['apple3', 50, 55],
    ['apple4', 50, 25],
    ['apple2', 200, 45]
]

# 默认按商品名称进行排序
print(sorted(Info))
# 按商品数量进行排序
print(sorted(Info, key=lambda x: x[1]))
# 按商品单价进行排序
print(sorted(Info, key=lambda x: x[2]))
# 先按商品数量进行排序,如果商品数量一致,则按商品单价进行排序
print(sorted(Info, key=lambda x:(x[1],x[2])))
# 对于字典里面嵌套字典进行排序
d = {
    '003':{
        'name':'apple1',
        'count':100,
        'price':10
    },
    '002':{
        'name':'apple2',
        'count':200,
        'price':2
    }

}
 
print(d.items())	# [('key',{}),(),()]

# x:('003', {'name': 'apple1', 'count': 100, 'price': 10})
# 
print(sorted(d.items(),key=lambda x:x[1]['count']))
print(sorted(d.items(),key=lambda x:x[1]['price']))

练习_奇偶数排序

问题描述:
有一个整数列表(10个元素), 要求调整元素顺序,把所有的奇数放在前面, 偶数放在后面。
import random
# 方法一:
li = [random.randint(1,10) for i in range(10)]
print(sorted(li,key=lambda n:(n%2==0)))

# 方法二:
print(sorted(list(map(lambda x:random.randint(1,10),range(10))),key=lambda n:n%2==0))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值