Python_day06--高阶函数-map、reduce、filter、sorted、lambda

一、高阶函数

高阶函数: 实参可以是一个函数; 返回值可以是一个函数;

一般函数返回值都为一个数值,例如:

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. 匿名函数的形式参数可以是: 必选, 默认, 可变, 关键字参数

2)匿名函数优点:
  - 使用Python写一些脚本时,使用lambda可以省去定义函数的过程,让代码更加精简。
  -对于一些抽象的,不会被别的地方再重复使用的函数,有时候函数起个名字也是个难题,使用lambda不需要考虑命名的问题
  - 使用lambda在某些时候然后代码更容易理解
 
搭配reduce的应用
  reduce(fun,list)
    reduce依次把list中的数字赋值给fun进行计算
    注意fun必须是连个数字间的运算,list必须是整型数字

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循环看到结果;

如下图:




猜你喜欢

转载自blog.csdn.net/biu_biu_0329/article/details/80281627