一、高阶函数
- 实参是一个函数
- 函数的返回值也是一个函数
函数本身也是可以赋值给变量的 变量可以指向函数
示例:
def fun(x,y,f):
return f(x),f(y)
print(fun(-10,34,abs)) #函数abs的作用是求变量的绝对值
输出结果为:
(10, 34)
二、内置高阶函数map
map():接收两个参数 一个是函数 一个是序列
map将传入的函数依次作用到序列的每个元素 并且把结果作为新的序列返回
示例:
1 对一个序列[-1,3,-4,-5]的每一个元素求绝对值
print(list(map(abs,[-1,3,-4,-5])))
输出结果:
[1, 3, 4, 5]
2 序列的每个元素求阶乘
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)))
输出结果:
[5, 5, 6, 3, 4, 5, 6, 4, 4, 3]
[120, 120, 720, 6, 24, 120, 720, 24, 24, 6]
三、内置高阶函数reduce
reduce():把一个函数作用在一个序列上,这个函数必须接收两个参数
reduce把结果继续和序列的下一个元素做累积计算
作用方式:
reduce(f,[1,2,3,4]) = f(f(f(1,2),3),4)
python2中reduce是内置函数
python3.x中需要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)))
输出结果:
362880
5050
四、高阶函数练习
将一个字符串转换成整型
‘12345’—12345
‘0’:0
‘1’:1
‘2’:2
…
‘9’:9
解答:
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('24312412')
print(type(num), num)
输出结果为:
<class 'int'> 24312412
五、内置高阶函数filter
filter过滤函数和map()类似,也接收一个函数和一个序列
但是和map()不同的是 filter()把传入的函数依次作用于序列的每个元素 然后根据返回值是True或者False决定保留还是丢弃该元素,True保留,False丢弃
示例:
def isodd(num):
if num % 2 == 0:
return True
else:
return False
print(list(filter(isodd,range(10))))
输出结果:
[0, 2, 4, 6, 8]
六、匿名函数
匿名函数的关键字 lambda
冒号前面是 形参, 冒号后面是返回值
示例:
from functools import reduce
print(reduce(lambda x,y:x+y,range(10)))
print(list(map(lambda x:x**2,range(5))))
def isood(num):
return num%2 ==0
print(list(filter(lambda x:x%2==0,range(10))))
输出结果:
45
[0, 1, 4, 9, 16]
[0, 2, 4, 6, 8]
七、内置函数sort
1 sorted()函数
对所有可迭代的对象进行排序操作
sort与 sorted区别:
sort是应用在list上的方法, sorted可以对所有可选代的对象进行排序操作
list的sort方法返回的是对已经存在的列表进行操作,而内建函数sorted方法返回的是一个新的list,而不是在原
来的基础上进行的操作
2 sorted语法
sorted(iterable, key=None, reverse=False)
参数说明
iterable-可迭代对象.
key-主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可选代对象中的一个元素来进行排序.
reverse-排序规则, reverse=True降序, reverse= False升序(默认)
示例:
li = [4, 5, 6, 7, 2, 1, 3, 8, 9, 10]
# 不想改变原来的列表内容
li1 = li[:]
li1.sort()
print(li1)
print(li)
li2 = sorted(li)
print(li2)
print(li)
输出结果:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #使用sort在原列表上排序,li1发生了变化
[4, 5, 6, 7, 2, 1, 3, 8, 9, 10] #li没有发生变化
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] #使用sorted函数创建一个新列表,在新列表上排序
[4, 5, 6, 7, 2, 1, 3, 8, 9, 10] #li没有发生变化
示例:
li3 = [4, -5, -6, 7, 2, -1, 3, -8, 9, -10]
li4 = sorted(li3, key=abs)
print(li4)
输出结果:
[-1, 2, 3, 4, -5, -6, 7, -8, 9, -10] #按绝对值排序
示例:
s = ['daas', 'dasas', 'FEDFerw', 'fsadER']
print(sorted(s))
print(sorted(s, key=str.lower))
print(sorted(s, key=str.upper))
输出结果:
['FEDFerw', 'daas', 'dasas', 'fsadER']
['daas', 'dasas', 'FEDFerw', 'fsadER']
['daas', 'dasas', 'FEDFerw', 'fsadER']
示例:
info = [
# 商品名称 商品数量 商品价格
('apple1', 200, 100),
('apple2', 40, 32),
('apple3', 20, 10),
('apple4', 20, 15),
]
# 按照商品数量进行排序
def sorted_by_count(x):
return x[1]
# 按照商品价格进行排序
def sorted_by_price(x):
return x[2]
# 先按照商品数量进行排序 如果商品数量一致
# 则按照商品价格进行排序
def sorted_by_count_price(x):
return x[1], x[2]
print(sorted(info, key=sorted_by_count))
print(sorted(info, key=sorted_by_count_price))
输出结果:
[('apple3', 20, 10), ('apple4', 20, 15), ('apple2', 40, 32), ('apple1', 200, 100)]
[('apple3', 20, 10), ('apple4', 20, 15), ('apple2', 40, 32), ('apple1', 200, 100)]