1.高阶函数
- 实参是一个函数
- 函数的返回值是一个函数
2.map() 映射函数
map函数一次性接收两个参数,一个函数,一个为序列;作用是将接收的函数作用到所接收序列中的每一个元素
# 对一个序列[-1,3,-4,-5]的每一个元素求绝对值
import random
print(list(map(abs,[-1,3,-4,-5])))
# 对每个元素求阶乘
def f(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(li)
print(list(map(f,li)))
3. reduce() 迭代函数
reduce()同样是接收两个参数,一个为函数,一个为序列;作用是把这个函数作用在序列上;
但函数每次从序列上接收两个元素,进行操作并将结果再返回给序列,这样依次迭代累积计算,最终得到一个结果
需要注意的是:reduce() 在python2中是内置函数,可以直接使用;但在python3中,需要导入相应模块才能使用
from funtools import reduce
"""
reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
reduce(f,[x1,x2,x3,x4]) = f(f(x1,x2),x3),x4)
python2中:reduce是内置函数
python3:from functools import reduce
"""
from functools import reduce
def multi(x,y):
return x*y
print(reduce(multi,range(1,10)))
def add(x,y):
return x+y
print(reduce(add,range(1,101)))
4. lambda 匿名函数
简单的函数定义可以省去格式上的繁琐,定义为匿名函数;
函数中冒号之前的为形参,冒号之后的为返回值
from functools import reduce
def add(x,y):
return x+y
print(reduce(add,range(10)))
print(reduce(lambda x,y:x+y,range(10)))
# def mypow(x):
# return x **2
print(list(map(lambda x:x**2,range(5))))
# def isood(num):
# return num%2 ==0
# print(isood(11))
print(list(filter(lambda x:x%2==0,range(100))))
5. filter()过滤函数
与map() 函数类似;filter() 接收函数和序列两个参数,将函数作用于序列中的每个元素,但返回值为bool值,True或者False;
根据其返回值决定保留还是舍弃该元素,从而达到过滤的效果
def isodd(num):
if num % 2 ==0:
return True
else:
return False
print(list(filter(isodd,range(100))))
6.练习
例:将一个字符串转换成整型’1234’–>1234
from functools import reduce
def str2int(s):
def char2int(ch):
c = {str(x):x for x in range(10)}
#print(c)
return c[ch]
def fun(n1,n2):
return n1 * 10 + n2
return reduce(fun,map(char2int,s))
num = str2int('12343')
print(type(num),num)
例2:有一个整数列表(10个元素),要求调整元素的顺序
把奇数放在前面 偶数放在后面
import random
li=[random.randint(1,50)for i in range(15)]
print(li)
l=sorted(li,key=lambda x:3 if x%2==0 else 2)
print(l)