高阶函数
-实参是一个函数名
-函数的返回值是一个函数
函数本身也可以赋值给变量 变量可以指向函数
例子:求绝对值
print(abs(-11)) ##abs函数作用于-11 abs函数是求绝对值的
内置高阶函数
1、map()函数
接收两个参数, 一个是函数, 一个是序列
map将传入的函数依次作用到序列的每个元素 并且把结果作为新的序列返回。
例子1:对于序列[-1,3,-4,-5]的每个元素求绝对值
print(list(map(abs,[-1,3,-4,5]))) ##map()表示传入一个函数,并且作用于列表
例子2:对于序列的每个元素求阶乘
import random
def factoria(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))) ##将函数内置,作用与列表
2、内置高阶函数reduce
reduce是把结果继续和和序列的下一个元素作累积运算,
reduce接受两个参数
python2.x中,reduce是内置函数
python3.x中,需要导入,即from functools import reduce
例子1,累加
from functools import reduce ##导入reduce
def multi(x,y):
return x+y
print(reduce(multi,range(1,4)))
例子2,累乘
from functools import reduce
def multi(x,y):
return x*y
print(reduce(multi,(1,2,3,4)))
3、内置高阶函数filter
filter和map函数相似,也是接收一个函数和一个序列
filter把传入和函数依次作用,并根据返回值是True还是False决定保留还是丢弃,True保留,False丢弃,相当于过滤
例子,求偶数
def isodd(num): ##构造一个求偶数的函数
if num%2 ==0:
return True
else:
return False
print(list(filter(isodd,range(30)))) ##类似于map,需要加list显示输出值
4、内置高阶函数sorted
默认sort和sorted方法由小到大进行排序,resverse=True表示由大到小排序
例子1,由大到小排序
li = [1,2,3,4]
a= li.sort(reverse=True) #resverse=True表示由大到小排序
print(li)
例子2:
info = [
# 商品 数量 价格
('apple1', 29 ,3),
('apple2', 27 ,77),
('apple3', 25 ,5),
('apple4', 30 ,34),
('apple5', 50 ,23)
]
print(sorted(info)) ##默认排序,是根据第一列进行排序
def sorted_by_count(x): ##定义函数返回第二列
return x[1]
print(sorted(info,key=sorted_by_count)) ##按数量排序由小到大
def sorted_by_price(x):
return x[2]
print(sorted(info,key=sorted_by_price)) ##按价格排序,由小到大
def sorted_by_count_price(x):
return x[1],x[2]
print(sorted(info,key=sorted_by_count_price)) ##先按数量由小到大,数量相等,再根据价格
例题:
(2018-携程-春招题)题目需求:
给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
输入:
第一行是数组长度, 后续每一行是数组的一条记录;
4
0
7
0
2
输出:
调整后数组的内容;
7
2
0
0
n = int(input()) ##此处的input是输入列表长度
li = [int(input()) for i in range(n)] ##此处n是表循环几次,即列表的长度,此处input是输入列表元素
def move(x):
if x == 0:
return 2 ##把0元素转换成返回值2
else:
return 1 ##非0元素转换成返回值1
print(sorted(li,key=move)) ##把0转换为2,非0转换成1,因为sorted函数是由小到大排序,由小到大排序时就可以得到结果
5、匿名函数
匿名函数的关键字为lambda
冒号前面的是形参, 冒号后面的是返回值
#求x+y
from functools import reduce
print(reduce(lambda x,y:x+y,[1,2,3,4,5]))
#求平方
print(list(map(lambda x:x**2,range(5))))
#求100以内偶数
print(list(filter(lambda x:x%2==0,range(100))))
例题:有一个整数列表(10个元素),要求调整元素顺序,把所有的奇数放在前面,偶数放在后面
import random
s1 = [ random.randint(1,10) for i in range(10)]
# def move(x):
# if x%2==0:
# return 2
# else:
# return 1
# print(sorted(s1,key=move))
print(sorted(s1,key=lambda x:1 if x%2==0 else 0)) ##返回值是1,反之即else返回值是0,然后根据0,1排序
例子:利用map和reduce编写一个str2float函数,把字符串’123.456’转换成浮点数123.456
from functools import reduce
def str2float(s):
ch = {str(x):x for x in range(10)} ##'0' 0 '1' 1 '2' 2
L= s.split('.') ##将字符串分割开
n1 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],L[0])) ##整数部分,L[0]表示分割的第一部分,即整数部分
#map的作用:‘0’ ==>0, ‘1’ ==>1 '2' ==>2
#'123' ==> [1,2,3] 1*10+2=12 12*10+3 =123,小数部分同理
n2 = reduce(lambda x,y:x*10+y,map(lambda x:ch[x],L[1])) ##小数部分,L[1]表示分割的第二部分,即小数部分
n2 *=0.1**len(L[1]) ##小数部分乘0.1的len(L[1])次方加整数
return n1 + n2
num = str2float('123.456')
print(num)
例子,回文数是指从左向右读和从右向左读都是一样的数,例如12321,909。请利用filter()筛选出回文数
from functools import reduce
def huiwenshu(n):
l = list(str(n)) ##数字变成一个列表
l.reverse() ##反转
#数学计算,回文数
num =reduce(lambda x,y:int(x) *10 + int(y),l)
return num ==n
output = filter(huiwenshu,range(1,1000))
print('1~1000: ',list(output))