高阶函数 & 三元表达式
总结 📋
高阶函数是Python函数式编程的重要组成部分,主要包括:
- Lambda表达式:创建简洁的匿名函数
- 三元表达式:简化条件判断
- map():对序列元素应用函数
- filter():过滤序列元素
- reduce():累积处理序列元素
- sorted():排序序列元素,并返回新序列
- any():检查序列元素是否有一个满足条件
- all():检查序列元素是否都满足条件
- zip():将多个序列打包成一个元组序列
- enumerate():为可迭代对象添加索引计数器
高阶函数(闭包) 🎯
高阶函数(闭包)是指接受函数作为参数或者返回函数的函数。在Python中,函数是一等公民,可以像变量一样传递和操作。
# 函数作为参数传递
def apply_operation(func, x, y):
return func(x, y)
def add(a, b):
return a + b
# 使用高阶函数
result = apply_operation(add, 5, 3) # 8
闭包的函数寻找作用域,是从函数定义的时候寻找的
Lambda 表达式 ⚡
Lambda表达式是创建匿名函数的简洁方式,特别适用于简单的单行函数。
语法格式
lambda 参数: 表达式
基本用法
# 普通函数
def square(x):
return x ** 2
# 等价的lambda表达式
square_lambda = lambda x: x ** 2
print(square(5)) # 25
print(square_lambda(5)) # 25
# 多个参数
add = lambda x, y: x + y
# 带默认参数
greet = lambda name, greeting="Hello": f"{greeting}, {name}!"
注意:Lambda表达式只能包含表达式,不能包含语句(如print、赋值等)
三元表达式 🔀
三元表达式(条件表达式)是if-else语句的简化形式,用于根据条件返回不同的值。
语法格式
条件为真时返回的结果 if 条件判断 else 条件为假时的返回结果
基本用法
# 传统if-else
age = 18
if age >= 18:
status = "成年人"
else:
status = "未成年人"
# 三元表达式
status = "成年人" if age >= 18 else "未成年人"
print(status) # 成年人
建议:三元表达式适用于简单的条件判断,复杂逻辑建议使用传统if-else语句
内置高阶函数 🛠️
map()
将指定函数应用到可迭代对象的每个元素上,返回一个map对象(迭代器)。
语法格式
map(function, iterable, ...)
基本用法
# 将列表中每个数字平方
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))
print(squared) # [1, 4, 9, 16, 25]
多个可迭代对象
# 两个列表对应元素相加
list1 = [1, 2, 3, 4]
list2 = [10, 20, 30, 40]
result = list(map(lambda x, y: x + y, list1, list2))
print(result) # [11, 22, 33, 44]
# 等价于
result = [x + y for x, y in zip(list1, list2)]
filter() 🔍
filter()函数用于过滤序列,返回满足条件(必须返回布尔值)的元素组成的迭代器。
语法格式
filter(function, iterable)
基本用法
# 过滤偶数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # [2, 4, 6, 8, 10]
# 过滤空字符串
words = ['hello', '', 'world', '', 'python']
non_empty = list(filter(None, words)) # None会过滤掉假值
print(non_empty) # ['hello', 'world', 'python']
reduce() 🔄
reduce()函数对序列中的元素累积应用函数,将序列减少为单个值。
注意:从Python 3开始,reduce()被移到了
functools
模块中
导入和语法
from functools import reduce
reduce(function, iterable[, initializer])
基本用法
from functools import reduce
# 计算列表元素的乘积
numbers = [1, 2, 3, 4, 5]
product = reduce(lambda acc, item: acc * item, numbers)
print(product) # 120
带初始值
# 带初始值的累加
numbers = [1, 2, 3, 4, 5]
sum_with_initial = reduce(lambda acc, item: acc + item, numbers, 10)
print(sum_with_initial) # 25 (10 + 1 + 2 + 3 + 4 + 5)
sorted()
sorted()函数返回一个新的已排序列表,不修改原列表。
语法格式
sorted(iterable, key=None, reverse=False)
基本用法
# 基本排序
numbers = [3, 1, 4, 1, 5, 9, 2, 6]
sorted_numbers = sorted(numbers)
print(sorted_numbers) # [1, 1, 2, 3, 4, 5, 6, 9]
# 自定义排序规则
words = ['banana', 'pie', 'Washington', 'book']
# 按长度排序
sorted_by_length = sorted(words, key=len)
print(sorted_by_length) # ['pie', 'book', 'banana', 'Washington']
# 按字母顺序(忽略大小写)
sorted_case_insensitive = sorted(words, key=str.lower)
print(sorted_case_insensitive) # ['banana', 'book', 'pie', 'Washington']
any() 和 all() ✅
any() 和 all() 用于检查可迭代对象中元素的真值。
# any() - 任意一个为True就返回True
numbers = [0, 0, 1, 0]
print(any(numbers)) # True
# all() - 所有元素都为True才返回True
numbers = [1, 1, 1, 1]
print(all(numbers)) # True
# 实际应用
scores = [85, 92, 78, 96, 88]
# 检查是否有人不及格
has_failed = any(score < 60 for score in scores)
print(has_failed) # False
# 检查是否所有人都及格
all_passed = all(score >= 60 for score in scores)
print(all_passed) # True
zip() 🤐
zip()函数将多个可迭代对象打包成元组。
# 基本用法
names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
cities = ['New York', 'London', 'Tokyo']
combined = list(zip(names, ages, cities))
print(combined)
# [('Alice', 25, 'New York'), ('Bob', 30, 'London'), ('Charlie', 35, 'Tokyo')]
# 解包
for name, age, city in zip(names, ages, cities):
print(f"{name} is {age} years old and lives in {city}")
enumerate() 📝
enumerate()函数为可迭代对象添加索引计数器。
# 基本用法
fruits = ['apple', 'banana', 'orange']
for index, fruit in enumerate(fruits):
print(f"{index}: {fruit}")
# 0: apple
# 1: banana
# 2: orange
# 指定起始值
for index, fruit in enumerate(fruits, start=1):
print(f"{index}: {fruit}")
# 1: apple
# 2: banana
# 3: orange