高阶函数Higher-order function
- 高阶函数的定义
高阶函数:一个函数可以接受另一个函数作为参数
实参是一个函数名,函数名就是指向函数的变量
返回值是一个函数,函数的参数能接受变量
函数本身也可以赋值给变量,变量可以指向函数
a= abs 变量a指向abs函数
a(-1) 通过a调用abs函数
参数数量和类型不对,会报错
abs(1,2)/abs(‘a’)
传递的参数包括函数名
def fun(x,y,f):
return f(x),f(y)
print(fun(-10,24,abs))
- 内置高阶函数map
map()函数:接收两个参数,一个是函数,一个是序列
map将传入的函数依次作用到序列的每个元素,并把结果作为新的序列返回
序列[-1,2,-3,4]的每个元素求绝对值
print(list(map(abs,[-1,2,-3,4])))
对于序列的每个元素求阶乘(10个2-9之间的随机数)
li = [random.randint(2,9) for i in range(10)] 随机取数
print(li)
import random
def f(x): 定义阶乘函数
res = 1
for i in range(1,x+1):
res *= i
return res
print(list(map(f,li))) 调用函数到随机取数中
转化为整型并以列表形式输出
s = '1 3 5 7 9'
print(s.split())
print(list(map(int,s.split()))) 将int函数作用于s.split()
- 内置高阶函数reduce
reduce:把一个函数作用在一个序列上,这个函数必须接收两个参数,reduce会把结果继续和序列的下一个元素做累积计算
reduce(f,[a,b,c,d]) = f(f(f(a,b),c),d)
求阶乘
from functools import reduce 调用reduce函数
def multi(x,y): 定义两个参数
return x*y
print(reduce(multi,range(1,5)))
- 内置高阶函数 filter(用于过滤序列)
filter过滤函数:接收一个函数和一个序列
filter函数把传入的函数依次作用于每个元素,然后根据返回值是True还是False来决定保留或者丢弃该元素
0-100的偶数
def isodd(num): 定义一个函数(取偶数)
if num % 2 == 0:
return True
else:
return False
print(list(filter(isodd,range(101)))) 将取偶数函数作用于1-100范围
把序列中的空字符删掉
def not_empty(s):
return s and s.strip()
print(list(filter(not_empty,['A','','B',None,'c',' ',0])))
- 内置高阶函数sorted(排序算法)
默认sort方法和sorted函数均由小到大排序
li = [2,1,3,4]
li.sort(reverse=True) reverse=True降序,reverse=Flase升序
print(li)
a = sorted(li)
print(a)
接收一个key函数来实现自定义的排序
li = [1, -2, 3, 4]
print(sorted(li))
print(sorted(li,key=abs)) 接收key函数,绝对值排序
s = ['a', 'Z', 'A', 'c'] 字符排序默认按照ASCII的大小排序,大写会在小写前
print(sorted(s))
print(sorted(s,key=str.upper)) 接收key函数,让字母忽略大小写
info = [
('x3',200,32),
('x2',40,12),
('x1',40,2),
('x4',1000,23),
('x5',40,5),
]
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项保持不变;
在原始数组上进行移动操作, 勿创建新的数组;
输入:40702
输出:47200
n = ''.join(input().split())
li = [int(i) for i in n]
def move(x):
if x == 0:
return 3
else:
return 2
print(sorted(li,key=move))