143 lines
4.6 KiB
Python
143 lines
4.6 KiB
Python
# 导式是Python中一种简洁、高效的创建数据结构的方法,可以用更少的代码生成列表、字典、集合等。推导式让代码更加简洁、可读性更强,同时性能通常比传统循环更好
|
|
# 推导式的优势
|
|
# 优势 描述 示例
|
|
# 代码简洁 用一行表达式完成循环与条件判断 [x**2 for x in range(5)]
|
|
# 可读性强 结构清晰,表达意图明确 比传统for循环更直观
|
|
# 性能优越 通常比循环+append更快 底层优化实现
|
|
# 功能丰富 支持条件过滤、嵌套循环等 复杂数据处理
|
|
# 2.2.推导式类型
|
|
# 类型 语法 结果类型 示例
|
|
# 列表推导式 [expr for item in iterable] list [x**2 for x in range(5)]
|
|
# 字典推导式 {key: value for item in iterable} dict {x: x**2 for x in range(5)}
|
|
# 集合推导式 {expr for item in iterable} set {x**2 for x in range(5)}
|
|
# 生成器表达式 (expr for item in iterable) generator (x**2 for x in range(5))
|
|
|
|
# 基本语法
|
|
# [表达式 for 变量 in 可迭代对象 (可选的if条件)]
|
|
# 组成部分:
|
|
# 表达式:对每个元素进行处理的代码
|
|
# for 变量 in 可迭代对象:遍历数据源
|
|
# if 条件:可选的过滤条件
|
|
|
|
# 列表推导式
|
|
squares = [x**2 for x in range(5)]
|
|
print(squares) # [0, 1, 4, 9, 16]
|
|
|
|
# 带条件
|
|
# 只包含偶数的平方
|
|
even_squares = [x**2 for x in range(10) if x % 2 == 0]
|
|
print(even_squares) # [0, 4, 16, 36, 64]
|
|
|
|
# 多个条件
|
|
numbers = [x for x in range(20) if x % 2 == 0 if x % 3 == 0]
|
|
print(numbers) # [0, 6, 12, 18]
|
|
|
|
# 条件表达式(三元运算符)
|
|
results = [x if x % 2 == 0 else "odd" for x in range(5)]
|
|
print(results) # [0, 'odd', 2, 'odd', 4]
|
|
|
|
# 嵌套循环
|
|
# 二维列表展开
|
|
matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
|
|
flattened = [num for row in matrix for num in row]
|
|
print(flattened) # [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
|
|
# 等价于:
|
|
flattened = []
|
|
for row in matrix:
|
|
for num in row:
|
|
flattened.append(num)
|
|
|
|
# 创建乘法表
|
|
multiplication_table = [[i * j for j in range(1, 6)] for i in range(1, 6)]
|
|
print(multiplication_table)
|
|
# [[1, 2, 3, 4, 5],
|
|
# [2, 4, 6, 8, 10],
|
|
# [3, 6, 9, 12, 15],
|
|
# [4, 8, 12, 16, 20],
|
|
# [5, 10, 15, 20, 25]]
|
|
|
|
|
|
# 字典推导式
|
|
# {键表达式: 值表达式 for 变量 in 可迭代对象 (可选的if条件)}
|
|
# 最基础的字典推导式
|
|
d = {x: x**2 for x in range(5)}
|
|
print(d) # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}
|
|
|
|
# 带条件的字典推导式
|
|
d = {x: x**2 for x in range(5) if x % 2 == 0}
|
|
print(d) # {0: 0, 2: 4, 4: 16}
|
|
|
|
|
|
# 集合推导式
|
|
# {表达式 for 变量 in 可迭代对象 (可选的if条件)}
|
|
# 创建唯一平方数的集合
|
|
squares_set = {x**2 for x in range(-5, 6)}
|
|
print(squares_set) # {0, 1, 4, 9, 16, 25}
|
|
|
|
# 从列表去重
|
|
words = ["hello", "world", "hello", "python", "world"]
|
|
unique_words = {word for word in words}
|
|
print(unique_words) # {'hello', 'world', 'python'}
|
|
|
|
# 带条件的集合推导式
|
|
even_squares = {x**2 for x in range(10) if x % 2 == 0}
|
|
print(even_squares) # {0, 64, 4, 36, 16}
|
|
|
|
# 生成器表达式
|
|
# (表达式 for 变量 in 可迭代对象 (可选的if条件))
|
|
# 生成器表达式
|
|
squares_gen = (x**2 for x in range(5))
|
|
print(squares_gen) # <generator object <genexpr> at 0x...>
|
|
|
|
# 转换为列表
|
|
print(list(squares_gen)) # [0, 1, 4, 9, 16]
|
|
|
|
# 带条件的生成器表达式
|
|
even_squares_gen = (x**2 for x in range(10) if x % 2 == 0)
|
|
print(list(even_squares_gen)) # [0, 4, 16, 36, 64]
|
|
|
|
|
|
# 多层嵌套推导式
|
|
# 三维嵌套列表展平
|
|
three_d = [[[1, 2], [3, 4]], [[5, 6], [7, 8]]]
|
|
flattened_3d = [num for matrix in three_d for row in matrix for num in row]
|
|
print(flattened_3d) # [1, 2, 3, 4, 5, 6, 7, 8]
|
|
|
|
# 使用字典推导式创建嵌套字典
|
|
nested_dict = {
|
|
f"group_{i}": {f"item_{j}": i * j for j in range(1, 4)} for i in range(1, 4)
|
|
}
|
|
print(nested_dict)
|
|
# {'group_1': {'item_1': 1, 'item_2': 2, 'item_3': 3},
|
|
# 'group_2': {'item_1': 2, 'item_2': 4, 'item_3': 6},
|
|
# 'group_3': {'item_1': 3, 'item_2': 6, 'item_3': 9}}
|
|
|
|
# 复杂条件逻辑
|
|
# 复杂条件筛选
|
|
numbers = range(20)
|
|
complex_filter = [
|
|
x for x in numbers if (x % 2 == 0 and x < 10) or (x % 3 == 0 and x > 10)
|
|
]
|
|
print(complex_filter) # [0, 2, 4, 6, 8, 12, 15, 18]
|
|
|
|
|
|
# 使用函数进行复杂判断
|
|
def is_prime(n):
|
|
if n < 2:
|
|
return False
|
|
for i in range(2, int(n**0.5) + 1):
|
|
if n % i == 0:
|
|
return False
|
|
return True
|
|
|
|
|
|
# 筛选素数
|
|
primes = [x for x in range(2, 30) if is_prime(x)]
|
|
print(primes) # [2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
|
|
|
|
|
|
numbers = [1, 2, 4]
|
|
abc = list(map(lambda x: x * 2, numbers))
|
|
print(abc)
|