推导式
-
什么是推导式
- 是一种独特的数据处理方式,从一个数据序列构建另一个新的数据序列的结构体。
- 是一种强大且简洁的语法,适用于生成列表、字典、集合和生成器。
- 使用推导式时,需要注意可读性,尽量保持表达式简洁,以免影响代码的可读性和可维护性。
- Python 支持多种推导式
- 列表 (list) 推导式
- 字典 (dict) 推导式
- 集合 (set) 推导式
- 元组 (tuple) 推导式
-
列表推导式(List Comprehensions)
-
核心作用
- 快速创建列表,替代传统 for 循环,具有简洁高效的特点。
- 用于从一个现有的列表创建一个新列表,使用一行代码即可实现循环或条件逻辑,生成新的 List 列表。
-
基础语法:expression for item in iterable
-
例:生成 1 - 10 的平方列表
pythonsquares = [x**2 for x in range(1, 11)] print(squares) # [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
-
-
条件过滤语法:new_list = expression for item in iterable if condition
-
等价于
pythonnew_list = [] for item in iterable: if condition: new_list.append(expression)
-
-
参数说明
- iterable 参数:一个现有的列表,可以迭代的对象,比如列表、元组、字符串等。
- condition 参数
- 可选条件表达式,用于过滤 iterable 中的元素。
- iterable 列表中只有满足该条件的元素,才会被作为 item 参与 expression 表达式计算。
- item 参数
- 如果没有 condition 参数,那 item 就是 iterable 列表中的每一个元素。
- 如果有 condition 参数,那么 item 就是 iterable 列表中符合 condition 条件的元素。
- expression 参数:item 参与计算的表达式,其中有 item 变量。
-
例:筛选偶数
scss```python evens = [x for x in range(10) if x % 2 == 0] print(evens) # [0, 2, 4, 5, 6, 7, 8] ```这里
range(20)生成一个包含 0 到 19 的可迭代对象,if x % 2 == 0作为条件,筛选出其中能被 2 整除(即偶数 )的元素x,并将这些元素组成新列表evens -
例:数值转换
pythonnums = [1, -2, 3, 0] abs_nums = [x if x >= 0 else -x for x in nums] print(abs_nums) # [1, 2, 3, 0]对于列表
nums中的每个元素x,判断其是否大于等于 0。若x >= 0,则新列表abs_nums中对应元素就是x本身;若x < 0,则新列表中对应元素为-x(即x的绝对值 ),最终得到包含原列表元素绝对值的新列表abs_nums
-
-
字典推导式
- 语法结构详解:{ 键表达式:值表达式 for 循环变量 in 可迭代对象 if 条件 }
- 注意
- 键必须唯一且不可变
- 值可以是任意类型
- 例:
-
键值转换
pythonoriginal = {'a': 1, 'b': 2, 'c': 3} reversed_dict = {v: k for k, v in original.items()} print(reversed_dict) # {1: 'a', 2: 'b', 3: 'c'} -
复杂数据重组
pythonstudents = [ {'name': 'Steven Wong','math': 80}, {'name': 'Coco','math': 90}, {'name': 'John','math': 100} ] # 创建学科分数字典 math_scores = {stu['name']: stu['math'] for stu in students} print(math_scores) # {'Steven Wong':80, 'Coco':90, 'John':100}
-
-
集合推导式
-
语法结构详解:{表达式 for 循环变量 in 可迭代对象 if 条件 }
-
注意
- 自动去重
- 元素无序
- 元素必须可哈希
-
案例:
pythonnums = [1, 2, 2, 3, 3, 3] squared_set = {num ** 2 for num in nums} print(squared_set) # {1, 4, 9}
-
迭代器
-
什么是迭代器
- 访问集合元素的一种方式,可以记住遍历的位置的对象,和 Java 里面的集合的迭代器 Iterator 一样。
- 核心是通过某种方式(通常使用循环)访问集合元素的过程。
- 作用
- 在处理大数据集时,迭代器可以节省内存。
- 迭代器提供了一种统一的遍历方式,适用于各种数据结构。
-
迭代器对象和可迭代对象
-
可迭代对象:实现了
__iter__()方法的对象。 -
迭代器对象:实现了
__iter__()和__next__()方法的对象称为迭代器对象。 -
通过定义可以知道,迭代器对象一定是可迭代对象。
-
简单解释两个方法
__iter__():要返回一个迭代器对象,可以使用iter()函数触发。__next__():用于从迭代器中返回下一个值,如果没有可返回值,抛出StopIteration异常,用next()函数来触发它。
-
常见可迭代对象:列表、元组、字符串、字典、集合、文件对象、生成器
-
验证可迭代对象
python# isinstance(object, classinfo) 判断一个对象是否为指定类型或指定类型的子类 # 使用元组传递多个类型,如果对象是其中任意一个类型的实例,则返回 'True'。 from collections.abc import Iterable print(isinstance("abc", Iterable)) # True print(isinstance(123, Iterable)) # False print(isinstance([1,2,3], Iterable)) # True print(isinstance(123, (int, str))) # 输出: True
-
-
迭代器对象遍历(记录当前迭代位置,只能向前不能后退)
-
使用常规 for 语句进行遍历
pythonlist = [1, 2, 3, 4, 5] it = iter(list) # 创建迭代器对象
-
-
生成器
- 使用了
yield的函数被称为生成器(generator),是一种特殊的迭代器,使用yield关键字来返回值。 yield是一个关键字,用于定义生成器函数,是一种特殊的函数,在迭代过程中逐步产生值,而不是一次性返回所有结果。- 生成器函数在每次调用
next()时执行,直到遇到yield语句。
- 使用了
Lambda 函数
-
什么是 Lambda 函数
-
定义:Lambda 函数是匿名的小型函数,用于简化简单函数的定义。
-
语法:lambda 参数:表达式
-
无名称:无需 def 关键字定义。
-
单行表达式:只能包含一个表达式,不能有代码块或复杂逻辑;可以设置多个参数,参数使用逗号隔开
python# 加法函数 add = lambda a, b: a + b print(add(1, 2)) # 3 # 平方函数 square = lambda x: x**2 print(square(2)) # 4 # 作为函数参数传递 def operate(func, a, b): return func(a, b) result = operate(lambda x, y: x * y, 2, 3) print(result) # 6
-
-
Lambda 与普通函数的对比
| 特性 | Lambda 函数 | 普通函数(def) |
|---|---|---|
| 名称 | 匿名 | 需命名 |
| 代码量 | 单行 | 可多行 |
| 适用场景 | 简单逻辑(如表达式计算) | 复杂逻辑(如循环、条件嵌套) |
| 返回值 | 自动返回表达式结果 | 需显式 return |
- Lambda + map/filter 与列表推导式对比
| 场景 | Lambda + map/filter | 列表推导式 |
|---|---|---|
| 简单转换 / 过滤 | 可读性较低 | 更简洁直观 |
| 函数作为参数传递 | 必须使用 Lambda | 无法直接替代 |
| 性能 | 相近(但生成器更节省内存) | 相近 |
-
例:筛选偶数并平方
ininumbers = [1, 2, 3, 4, 5] # Lambda + map/filter result1 = list(map(lambda x: x**2, filter(lambda x: x%2==0, numbers))) # 列表推导式 result2 = [x**2 for x in numbers if x%2 == 0] print(result1, result2) # [4, 16] [4, 16]
#高阶函数
-
什么是高阶函数
- 满足以下任一条件的函数
- 接收函数作为参数
- 返回函数作为结果
- 优势
- 代码简洁:通过组合函数减少重复代码。
- 功能灵活:动态指定处理逻辑
- 组合应用
- lambda 函数通常与内置高阶函数如 map ()、filter () 和 reduce () 一起使用,在集合上执行操作
- 满足以下任一条件的函数
-
常用高阶函数详解
-
map(func, iterable)
-
功能:对可迭代对象的每个元素应用 func,返回迭代器。
-
例:将列表元素平方
pythonnumbers = [1, 2, 3, 4, 5] squared = map(lambda x: x**2, numbers) print(list(squared)) # [1, 4, 9, 16, 25]对比列表推导式
pythonsquared = [x**2 for x in numbers]
-
-
filter(func, iterable)
-
功能:筛选满足 func 条件为 True 的元素,返回迭代器。
-
示例:过滤偶数
pythoneven = filter(lambda x: x % 2 == 0, numbers) print(list(even)) # [2, 4]对比生成器表达式
pythoneven = (x for x in numbers if x % 2 == 0) # 惰性计算,节省内存
-
-
字典合并(使用 reduce)
pythonfrom functools import reduce dicts = [{"a": 1}, {"b": 2}, {"a": 3, "c": 4}] merged = reduce(lambda d1, d2: {**d1, **d2}, dicts) print(merged) # {'a':3, 'b':2, 'c':4}
-