Comprehension 是什么?Python 的资料建构式/推导式(Comprehensions)是一种简洁且具表达力的方式来建立列表、集合、字典或生成器。这些语法结构通常包含条件逻辑,让我们能够在一行内完成资料筛选、转换和构建。
如果还不了解列表 字典 集合 请先看下面的文章 了解基本概念:Python {dictionaries 字典} Dict Comprehension
Python 列表 [list] List Comprehension 快速生成列表
Python {Sets 集合}和推导式 (Comprehension)
资料资料建构式/推导式的种类与比较
列表建构式 | [x for x in iterable if condition] | 产生列表,适合需多次访问的数据 |
集合建构式 | {x for x in iterable if condition} | 产生集合,去除重复值 |
字典建构式 | {k: v for k, v in iterable if cond} | 产生字典,适合键值对映射数据 |
生成器建构式 | (x for x in iterable if condition) | 产生生成器,适合大量数据惰性求值 |
语法符号 | [ ] | { } | { } | ( ) |
输出资料类型 | list | set | dict | generator |
元素是否唯一 | 否 | 是 | 是(依键来唯一) | 否 |
条件筛选 | 支援 | 支援 | 支援 | 支援 |
记忆体效率 | 中等 | 中等 | 中等 | 高 |
一般&快速资料建构式语法
一般资料建构式语法
x =[1,2,3,4]
squared_x = []
for item in x:
squared_x.append(item * 2)
print(squared_x) #[2, 4, 6, 8]
快速资料建构式语法
squared_x = [item**2 for item in x]
快速资料建构式/Comprehension
列表(List Comprehension)
列表推导式是一种在单行中创建列表的语法。适合用来创建列表,语法清晰,速度通常比传统的 for 迴圈快。语法:new_list = [expression for item in iterable if condition]
- expression: 要添加到新列表中的元素。(运算式)
- item: 迭代变量。
- iterable: 可迭代对象,如列表、元组、字符串等。
- condition: 可选的过滤条件。
# 创建一个包含0到9的平方数的列表
# 范例:产生平方数列表
squares = [x**2 for x in range(10)]
# 结果: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
# 创建一个包含所有偶数的列表
even_numbers = [x for x in range(20) if x % 2 == 0]
print(even_numbers)
#[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
# 创建一个包含所有大写字母的列表
upper_letters = [letter.upper() for letter in \'hello world\']
print(upper_letters )
#[\'H\', \'E\', \'L\', \'L\', \'O\', \' \', \'W\', \'O\', \'R\', \'L\', \'D\']
字典(Dict Comprehension)
使用大括号 {},并且需指定键:值对,适合用来生成基于某逻辑的字典。语法:new_dict = {key: value(operation) for item in iterable if condition}
- key: 字典的键。
- value: 字典的值。
- operation 运算式
- item: 迭代变量。
- iterable: 可迭代对象。
- condition: 可选的过滤条件。
# 范例:将数字及其平方作为键值对
square_dict = {x: x**2 for x in range(10)}
# 结果: {0: 0, 1: 1, 2: 4, 3: 9, 4: 16, 5: 25, 6: 36, 7: 49, 8: 64, 9: 81}
# 创建一个计算水果名称长度的字典
fruit_lengths = {fruit: len(fruit) for fruit in [\'apple\', \'banana\', \'cherry\']}
print(fruit_lengths)
{\'apple\': 5, \'banana\': 6, \'cherry\': 6}
集合建构式 (Set Comprehension)
使用花括号 {} 包裹,适合用来去除重复元素并生成集合。new_ser={operation for variable in original_set if condition}
范例:找出一个英文句子中所有不重复的元音字母
sentence = "This is a sample sentence to demonstrate set comprehension."
vowels = {char for char in sentence if char in \'aeiouAEIOU\'}
print(vowels)#{\'a\', \'e\', \'i\', \'o\', \'u\'}
解释:sentence = "This is a sample sentence to demonstrate set comprehension.": 定义一个包含英文句子的字串。{char for char in sentence if char in \'aeiouAEIOU\'}: 这是集合建构式:char for char in sentence: 迭代 sentence 中的每个字元,并将每个字元赋值给变数 char。if char in \'aeiouAEIOU\': 判断 char 是否为元音字母(不分大小写)。vowels: 将符合条件的字元放入一个集合中。集合会自动去除重复元素,因此最后 vowels 中只会包含不重复的元音字母。
执行结果:这个范例展示了集合建构式的一些特点:
- 筛选元素: 透过 if 条件,可以筛选出符合特定条件的元素。
- 去除重复: 集合会自动去除重复元素,因此非常适合用来找出唯一元素。
- 简洁高效: 相较于传统的 for 迴圈,集合建构式更为简洁且高效。
另一个范例:从一个数字列表中找出所有大于 5 的奇数
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
odd_numbers_greater_than_5 = {num for num in numbers if num > 5 and num % 2 != 0}
print(odd_numbers_greater_than_5)#{7, 9}
生成器建构式 (Generator Expression)
生成器是一种特殊的迭代器。它不像列表一次将所有元素存储在内存中,而是在每次迭代时计算并返回下一个值。这使得生成器非常适合处理大型资料集,因为它可以避免一次性将所有资料载入到记忆体中,从而节省记忆体。
使用小括号 () 包裹,返回一个生成器。生成器不会一次性将所有结果存入记忆体,而是每次迭代时生成一个值,非常适合处理大量数据。
# 范例:建立一个生成平方数的生成器
square_gen = (x**2 for x in range(10))
# <generator object <genexpr> at 0x78937779db60>
#
为什么会看到这个输出? <generator object at 0x78937779db60>当你直接打印一个生成器对象时,Python 会显示它的类型(generator object)和记忆体地址。这告诉你,这是一个生成器,但它并不会显示生成器中的元素
generator object: 表示这是一个生成器对象。<genexpr>: 表示这个生成器是通过生成器表达式(generator expression)创建的。0x78937779db60: 是一个十六进位数字,代表这个生成器对象在记忆体中的具体位置。这个地址会随着每次程式执行而改变。