【Python使用】嘿马python基础入门全体系教程第10篇:高阶函数,1. 匿名函数,1.3.3 lambda的参数形式【附
🏆🏆🏆教程全知识点简介:1.Python函数高级特性包括匿名函数(lambda语法格式、与普通函数区别、应用场景、参数形式)。2. 文件操作涵盖文件打开关闭、文件读写(write写数据、readlines读数据)。3. 面向对象编程包括类和对象(类定义、对象创建、类对象关系)、类构成、self关键字、对象属性操作、构造方法__init__、字符串方法__str__、多继承、子类重写、多态概念及应用、类属性和实例属性、静态方法和类方法。4. 异常处理涵盖异常传递(try嵌套、函数嵌套调用)、自定义异常抛出。5. 模块系统包括Python模块概念、import导入机制、学生管理系统应用。6. 计算机基础涉及计算机组成、硬件系统、程序处理机制、编程语言概念、Python介绍、解释器作用。7. Python语法基础包括注释分类、输出(格式化输出、转义字符、结束符)、输入语法、数据类型转换、运算符(算数运算符)。8. 控制流程涵盖判断语句(if语句、if-else、if-elif-else、三目运算、if嵌套)、循环语句(while循环、for循环、break和continue)。9. 数据容器包括字符串操作(rfind、partition、splitlines、isalpha、isdigit)、列表(列表格式、相关操作、循环遍历、嵌套)、元组、字典(键值访问)、公共方法、容器类型转换、推导式(列表推导式、多for循环)。10. 函数进阶涵盖函数返回值、函数文档说明、函数嵌套调用、变量作用域(局部变量、全局变量、global关键字)、拆包和变量交换、引用概念、可变不可变类型、函数使用注意事项
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/453468 中查看
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/453468 中查看
📚📚👉👉👉本站这篇博客: https://bbs.huaweicloud.com/blogs/455829 中查看
✨ 本教程项目亮点
🧠 知识体系完整:覆盖从基础原理、核心方法到高阶应用的全流程内容
💻 全技术链覆盖:完整前后端技术栈,涵盖开发必备技能
🚀 从零到实战:适合 0 基础入门到提升,循序渐进掌握核心能力
📚 丰富文档与代码示例:涵盖多种场景,可运行、可复用
🛠 工作与学习双参考:不仅适合系统化学习,更可作为日常开发中的查阅手册
🧩 模块化知识结构:按知识点分章节,便于快速定位和复习
📈 长期可用的技术积累:不止一次学习,而是能伴随工作与项目长期参考
🎯🎯🎯全教程总章节

🚀🚀🚀本篇主要内容
1. 匿名函数
大家来思考一个问题:
def my_add(a, b):
return a + b
my_add()
my_add 函数需要2行定义, 能不能简化一下定义方式, 一行搞定! 当然可以, 可以把这种函数写成一个 匿名函数.
- 匿名函数的概念
- 匿名函数语法格式
- 匿名函数和普通函数的区别
- 匿名函数的使用场景
1.1 语法格式
定义的函数没有名字,这样的函数叫做匿名函数.
先看下匿名函数的语法结构:
lambda [形参1], [形参2], ... : [单行表达式] 或 [函数调用]
使用匿名函数, 上面的函数 就可以定义为单行的函数.
# 不带参数
my_fun = lambda : 10 + 20
# 带参数
my_add = lambda a, b: a + b
my_add()
注意:
- lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。
- lambda表达式能接收任何数量的参数但只能返回一个表达式的值。
1.2 和普通函数的区别
[email-validator 文档]
def my_function(start, end):
my_sum = 0
while start <= end:
my_sum += start
start += 1
return my_sum
- 匿名函数中不能使用 while 循环、for 循环, 只能编写单行的表达式,或函数调用, 普通函数都可以.
- 匿名函数中返回结果不需要使用 return, 表达式的运行结果就是返回结果, 普通函数返回结果必须 return.
- 匿名函数中也可以不返回结果. 例如:
lambda : print('hello world')
1.3 应用场景
1.3.1 定义简单的单行函数
def my_function(a, b):
return a + b
使用 lambda 定义格式如下:
my_function = lambda a, b: a + b
[PyQt5 文档]
1.3.2 作为函数的参数进行传递(重点、难点, 扩展点)
1.3.2.1 为什么函数要作为另外函数的参数?
def my_function1():
a = 100
b = 200
result = a + b
print('result:', result)
def my_function2():
a = 100
b = 200
result = a - b
print('result:', result)
def my_function3():
a = 100
b = 200
result = a * b
print('result:', result)
上面函数定义的缺点是:
- 函数名要定义多个, 使用起来不方便. 需要记忆, 那个函数完成什么事情.
- 上面函数只定义了三种计算方式: a + b、a -b、a * b, 如果用户希望 a 和 b 进行除法运算, 那么显然还需要再写函数.
解决目标: 1、提高函数的通用性 2、减少代码量
可以通过传递给 my_function 一个函数来完成.
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 当做函数来调用
result = func(a, b)
print('result:', result)
def caculate_rule(a, b):
return a / b
my_function(caculate_rule)

1.3.2.2. 匿名函数做为函数参数
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 当做函数来调用
result = func(a, b)
print('result:', result)
def caculate_rule1(a, b):
return a / b
def caculate_rule2(a, b):
return a // b
def caculate_rule3(a, b):
return a % b
my_function(caculate_rule1)
my_function(caculate_rule2)
my_function(caculate_rule3)
为了调用 my_function 函数要写很多规则, 整个文件中可能就有很多定义的函数代码, 问题是:
- 这些函数只会用一次
- 这些函数也比较简单
就没有必要 py 文件中出现这么多无用的代码. 如何改进:
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 当做函数来调用
result = func(a, b)
print('result:', result)
my_function(lambda a, b: a / b)
my_function(lambda a, b: a // b)
my_function(lambda a, b: a % b)
[Python 开发者指南]
1.3.2.3. 总结
- 函数可以做为参数传递给另外一个函数, 可以使得函数的实现更加通用.
- 匿名函数也可以作为参数传递给另外一个函数, 对于只需要用到一次函数, 可以通过匿名函数减少代码量.
1.3.3 lambda的参数形式
1.3.3.1.无参数
fn1 = lambda: 100
print(fn1())
1.3.3.2.一个参数
fn1 = lambda a: a
print(fn1('hello world'))
[httpx 文档]
1.3.3.3.默认参数
[openpyxl 文档]
fn1 = lambda a, b, c=100: a + b + c
print(fn1(10, 20))
1.3.3.4.可变参数:*args
fn1 = lambda *args: args
print(fn1(10, 20, 30))
注意:这里的可变参数传入到lambda之后,返回值为元组。
1.3.3.5.可变参数:**kwargs
fn1 = lambda **kwargs: kwargs
print(fn1(name='python', age=20))
1.3.4. lambda的应用
1.3.4.1. 带判断的lambda
fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500))
1.3.4.2. 列表数据按字典key的值排序
students = [
{'name': 'TOM', 'age': 20},
{'name': 'ROSE', 'age': 19},
{'name': 'Jack', 'age': 22}
]
# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)
# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)
# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)
高阶函数
把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。
1. 体验高阶函数
在Python中,abs()函数可以完成对数字求绝对值计算。
abs(-10) # 10
round()函数可以完成对数字的四舍五入计算。
round(1.2) # 1
round(1.9) # 2
需求:任意两个数字,按照指定要求整理数字后再进行求和计算。
- 方法1
def add_num(a, b):
return abs(a) + abs(b)
result = add_num(-1, 2)
print(result) # 3
- 方法2
def sum_num(a, b, f):
return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result) # 3
注意:两种方法对比之后,发现,方法2的代码会更加简洁,函数灵活性更高。
函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。
4.2 内置高阶函数
1. map 用法
map(function, list) 会根据提供的函数对指定序列做映射.
第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表.
计算每一个元素的平方值:
my_list = [1, 2, 3, 4, 5]
def f(x):
return x ** 2
result = map(f, my_list)
print(type(result), result, list(result))
输出结果:
<class 'map'> <map object at 0x000000C9729591D0> [1, 4, 9, 16, 25]
示例解释:
图片无法加载
首字母大写:
my_list = ['smith', 'edward', 'john', 'obama', 'tom']
def f(x):
return x[0].upper() + x[1:]
result = map(f, my_list)
print(list(result))
输出结果:
['Smith', 'Edward', 'John', 'Obama', 'Tom']
2. reduce 用法
reduce(function, list) 函数会对参数序列中元素进行累计.
函数将一个数据集合中的所有数据进行下列操作:
- 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作.
- 得到的结果继续和序列的下一个元素做累积计算, 最终得到一个结果.
[Learn Python the Hard Way]
计算列表中的累加和:
import functools
my_list = [1, 2, 3, 4, 5]
def f(x1, x2):
return x1 + x2
result = functools.reduce(f, my_list)
print(result)
输出结果:
15
示例解释:
图片无法加载
3. filter 用法
filter() 函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象, 如果要转换为列表, 可以使用 list() 来转换.
该接收两个参数, 第一个为函数, 第二个为序列, 序列的每个元素作为参数传递给函数进行判断, 然后返回 True 或 False, 最后将返回 True 的元素放到新列表中.
过滤列表中的偶数:
my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def f(x):
return x % 2 == 0
result = filter(f, my_list)
print(list(result))
输出结果:
[2, 4, 6, 8, 10]
示例解释:
图片无法加载
过滤列表中首字母为大写的单词:
my_list = ['edward', 'Smith', 'Obama', 'john', 'tom']
def f(x):
return x[0].isupper()
result = filter(f, my_list)
print(list(result))
输出结果:
['Smith', 'Obama']
文件操作介绍
<1>什么是文件1>
示例如下:
