一、高阶函数
高阶函数: 实参可以是一个函数; 返回值可以是一个函数;
一般函数返回值都为一个数值,例如:
def a(a,b,c): return 1 print(a(1,2,3))
函数定义:
def 函数名(形参): def add(a, b,c):
函数体
return 返回值 return 1
调用函数;
函数名(实参) add(1,2,3)
print(函数名(实参) )
1、内置高阶函数
Python中map()、filter()、reduce()这三个都是应用于序列的内置函数1)map函数理解
map(func, seq1[, seq2,…])
第一个参数接受一个函数名,后面的参数接受一个或多个可迭代的序列,返回的是一个集合。
Python函数编程中的map()函数是将func作用于seq中的每一个元素,并将所有的调用的结果作为一个list返回。如果func为None,作用同zip()。
例:
from collections import Iterable def func(x): return x**2 f = map(func, [0,1,2,3,4]) for i in f: print(i)
map函数将列表中的元素逐个作用于func函数,并且返回的是一个可迭代的生成器;
如果你还不能理解map函数,下面有一个练习;
例2:需求: 用户接收一串数字; '1 3 5 7 8', 将该字符串中的所有数字转化为整形,并以列表格式输出;
s = '1 3 5 7 8' a =list(map(int, s.split())) print(a)
或者我们用列表生成式一行搞定;
print([int(i) for i in s.split()])
每次给目标函数传入一个参数,直到列表中的所有参数全部传完。
2)reduce函数
注意:reduce: python2.x有, python3.x取消
reduce在python3.x不是内置高阶函数, 而是需要导入from functools import reduce;
例:
>>> def add (x,y): ... return x+y ... >>> reduce(add,[1,2,3,4,5,6]) 21
在python3中我们导入from functools import reduce,
from functools import reduce def add(x,y): return x+y print(reduce(add, range(1,7)))
强调一点range算的是1~6的和,reduce一次传入两个参数,上面这段程序则是((((1+2)+3)+4)+5)+6 =21
例2、需求: 用户输入数字n; 求n的阶乘; 5!= 1*2*3*4*5
from functools import reduce def func(x,y): return x*y print(reduce(func, range(1,6)))
3)filter高阶函数: filter(func, iterable)
理解:Python内建filter函数用于过滤序列。和map类似,filter也接收一个函数和一个序列。和map不同的是,把传入filter的函数依次作用于每个元素,然后根据返回值是
True
还是False
决定保留还是丢弃该元素。
func: 只有一个形参, 函数的返回值只能是True或者False;
例:
def isodd(num): if num %2 == 0: return True else: return False print(list(filter(isodd, range(10))))
用来过滤0~9的偶数,去除奇数;
二 、高阶函数
1、sorted高阶函数
sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
排序: 由大到小
print(sorted([23,565,46,78]))
排序: 由小到大, reverse=True, 代表排序后进行反转;
print(sorted([23,565,46,78], reverse=True))
例:客户希望看到所有商品按照价格由底到高依次排列:
info = [ ['001', 'apple', 1000, 2], ['002', 'xiaomi', 100, 2000], ['003', 'Oppo', 200, 1900], ['004', 'computer', 900, 5000] ] def sorted_by_count(item): return item[2] print(sorted(info, key=sorted_by_count))
需求二:需要按照商品的价格进行排序, 最终显示价格最高的商品名称和商品数量;
info = [ ['001', 'apple', 1000, 2], ['002', 'xiaomi', 100, 2000], ['003', 'Oppo', 200, 1900], ['004', 'computer', 900, 5000] ] def sorted_by_price(item): return item[2] sorted_by_price_info = sorted(info, key=sorted_by_price) print(sorted_by_price_info[-1][1], sorted_by_price_info[-1][2])
这里的sorted_by_price_info[-1][1]:是排序后的最后一个列表的第2个元素;
3)、sorted函数应用_携程笔试_移动数组中的0
题目要求:给定一个整形数组, 将数组中所有的0移动到末尾, 非0项保持不变;在原始数组上进行移动操作, 勿创建新的数组;
# 输入:
第一行是数组长度, 后续每一行是数组的一条记录;
4
0
7
0
2
# 输出:
调整后数组的内容;
7
2
0
0
n = int(input("数组长度:")) li = [int(input()) for i in range(n)] def move_zero(item): if item == 0: return 1 else: return 0 for i in sorted(li, key=move_zero): print(i)
生成式:
n = int(input("数组长度:")) li = [int(input()) for i in range(n)] for i in sorted(li, key=lambda x: 1 if x is 0 else 0): print(i)
三、lambda匿名函数
lambda 函数是一种快速定义单行的最小函数,可以用在任何需要函数的地方
1)格式:
1. 匿名函数的关键字为 lambda, 冒号前面是形式参数, 冒号后面是返回值;
2. 匿名函数的形式参数可以是: 必选, 默认, 可变, 关键字参数
1、无参数
例1:
f = lambda : "hello" print(f())
2、有参函数
例2:
f1 = lambda x, y=2: x**y print(f1(2)) print(f1(2,3))
例3:
f2 = lambda *args: sum(args) print(f2(1,2,3,4,5))这里的*args 可以接受多个数值,并且把这些数值封装为一个元组;
例4:
f3 = lambda **kwargs: kwargs print(f3(a=1, b=2))
**kwargs接受数据的形式为字典,传入的参数也必须为字典形式;
例5:
f4 = lambda x,y=2,*args,**kwargs: (x,y,args,kwargs) print(f4(2,3,4,5,a=1,b=2))
传入多个数值,系统会一一对应存放在相应的形参中,再进行后面的运算(各司其职);
例6:求和函数
----->传统方法:
from functools import reduce def add(x, y): return x + y print(reduce(add,range(101)))
我们这里使用的python3所以需要导入reduce模块(一次可以传入2个参数);
------>高级方法:lamda匿名函数求和
from functools import reduce print(reduce(lambda x, y: x + y, range(101)))
例7:匿名函数求平方?
def mypow(x): return x ** 2 print(list(map(lambda x: x ** 2, range(5))))这里也有map函数的使用:一次只传入一个参数;
def mypow(x)为传统方法,定义一个函数再给一个返回值
例8:求一串数例的偶数
----->传统方法:
def is_odd(num): return num % 2 == 0 print(list(filter(is_odd,range(10))))
------->匿名函数:
print(list(filter(lambda x: x % 2 == 0, range(10))))
filter返回的是一个生成器,我们可以把他放在列表里,或者for循环看到结果;
如下图: