偷学Python第二十四天:Python的匿名函数、内置高阶函数的使用

人生苦短我用Python

偷学Python第二十四天:Python的匿名函数、内置函数的使用

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。——苏轼

目标:可以用Python做一些简单的数据分析。
在这里插入图片描述

坚持完成自己的目标!勿忘初心~

今日学习目标

学习匿名函数、内置函数、递归函数

今日学习内容

匿名函数

如果我们需要定义一个特别简单的函数,例如

def add(a, b):
    s = a + b
    return s

这就出现问题了,这么优雅的Python怎么可以出现这种难看的代码呢,有没有办法可以将其简化为1行代码呢?这么优雅的Python肯定有办法将其简化的方法啊!这要用到匿名函数了。

python中使用 lambda关键字来创建匿名函数

语法格式

lambda [参数1 [,参数2,..参数n]]:表达式

lambda 参数列表:return [表达式] 变量

由于lambda返回的是函数对象(构建的是一个函数对象),所以需要定义一个变量去接收

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/23
"""
news_add = lambda a, b: a + b
# 上面的那个等于
def news_add_old(a, b):
    return a + b

x = news_add_old(5, 10)
y = news_add(5, 10)  # 调用匿名函数
print(x, y)  # 15 15

结合内置函数使用

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/23
"""

list1 = [{"a": 10, "b": 20}, {"a": 20, "b": 20}, {"a": 50, "b": 20}, {"a": 6, "b": 20}, {"a": 9, "b": 20}]


# 那个列表中的a最大
max_value = max(list1, key=lambda x: x["a"])
print(max_value)

# 如果用普通的函数写就多了几行
def func(di):
    return di["a"]
max_value = max(list1, key=func)  # 这里不能加()不然就表示调用了
print(max_value)

将匿名函数当做参数

def func(a, b, fun):
    s = fun(a, b)
    return s

z = func(5, 10, lambda a, b: a + b)
print(z)  # 15

lambda可以省去定义函数的过程,让代码更加精简,而且不用考虑命名问题,但是在PEP8规范里面是不推荐用lambda这种方式的

Python的内置函数

map()

map()会根据提供的函数对指定序列做映射

语法格式

map(function, iterable, ...)

第一个参数function以参数序列中的每一个元素调用function函数,

第二个参数iterable一个或多个序列

返回包含每次 function 函数返回值的新列表。

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/23
"""
list1 = [1, 2, 4, 5, 56, 12, 5, 2, 34]


# 生成一个函数
def func(lt):  # 将偶数返回,奇数+1返回
    if lt % 2 == 0:
        return lt
    else:
        return lt + 1


list2 = map(func, list1)  # 千万不能加()
# 使用lambda关键字
list3 = map(lambda i: i if i % 2 == 0 else i + 1, list1)
print(list(list3))  # [2, 2, 4, 6, 56, 12, 6, 2, 34]
print(list(list2))  # [2, 2, 4, 6, 56, 12, 6, 2, 34]

reduce() 函数

reduce() 函数在Python2x的时候是系统内置的函数,到Python3x就已经归入functools库里面了

reduce() 函数会对参数序列中元素进行累积。

函数将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 function 函数运算,最后得到一个结果。

语法格式

reduce(function, iterable[, initializer])

function – 函数,有两个参数

iterable – 可迭代对象

initializer – 可选,初始参数

返回函数计算结果。

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/23
"""
from functools import reduce

list1 = [1, 2, 3, 4, 5, 6, 7]
value = reduce(lambda x, y: x + y, list1)
print(value)  # 28 = 1+2+3+4+5+6+7

执行流程

会将计算结果存储到x,每次累计。initializer就是设置x的初始值

filter() 函数

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

语法结构

filter(function, iterable)

function – 判断函数。

iterable – 可迭代对象。

返回一个可迭代对象

sorted() 函数

sorted() 函数对所有可迭代的对象进行排序操作,返回的是一个新的 list.

语法结构

sorted(iterable, cmp=None, key=None, reverse=False)

iterable – 可迭代对象。

cmp – 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。

key – 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。

reverse – 排序规则,reverse = True 降序 , reverse = False 升序(默认)。

返回重新排序的列表。

示例代码

"""
-*- coding:uft-8 -*-
author: 小甜
time:2020/5/23
"""
students = [
    {'name': 'tom', 'age': 20},
    {'name': 'lucy', 'age': 15},
    {'name': 'lily', 'age': 13},
    {'name': 'mark', 'age': 21},
    {'name': 'jack', 'age': 13},
    {'name': 'steven', 'age': 18},
]

# 找出所有年龄大于18岁学生
result = filter(lambda x: x['age'] > 18, students)
print(list(result))  # [{'name': 'tom', 'age': 20}, {'name': 'mark', 'age': 21}]

# 按照年龄从小到大排序
students = sorted(students, key=lambda x: x['age'], reverse=True)  # 利用key

print(students)
'''
[{'name': 'mark', 'age': 21}, {'name': 'tom', 'age': 20}, 
{'name': 'steven', 'age': 18}, {'name': 'lucy', 'age': 15}, 
{'name': 'lily', 'age': 13}, {'name': 'jack', 'age': 13}]
'''

今日学习总结

明日学习计划

Python对文件的操作

甜甜有话说

Python的函数今天算是进本收尾了,继续加油~,到下周就可以把Python的基础给收尾了。第一阶段马上完成了,开心

座右铭:不要在该奋斗的年纪选择安逸!!

加油

猜你喜欢

转载自blog.csdn.net/weixin_46163658/article/details/106306059