高阶函数
【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))