Python 提供了簡潔的語法,讓條件判斷和序列生成可以用一行完成。這篇筆記整理 Conditional Expressions(條件表達式)和 Generator Expressions(生成器表達式)兩個重要的語法特性。
Conditional Expressions(條件表達式)
Python 的條件表達式類似其他語言的三元運算子(ternary operator),語法為:
1
|
值_當True if 條件 else 值_當False
|
範例
1
2
3
4
5
6
7
8
9
10
11
12
|
# 基本用法
x = 10
result = "正數" if x > 0 else "非正數"
print(result) # 正數
# 用在函式呼叫中
print("True" if True else "False") # True
# 用在 list 中
numbers = [1, -2, 3, -4]
signs = ["正" if n > 0 else "負" for n in numbers]
print(signs) # ['正', '負', '正', '負']
|
與其他語言比較
1
2
|
// PHP 的三元運算子
$result = $x > 0 ? "正數" : "非正數";
|
1
2
|
// JavaScript 的三元運算子
const result = x > 0 ? "正數" : "非正數";
|
1
2
|
# Python 的條件表達式(語序不同:先寫 True 的結果)
result = "正數" if x > 0 else "非正數"
|
Python 的語序更接近英文自然語言:「結果 如果 條件 否則 另一結果」。
Generator Expressions(生成器表達式)
生成器表達式語法與 List Comprehension 相似,但使用小括號 () 而非中括號 []:
1
2
3
4
5
|
# List Comprehension(中括號,立即建立整個清單)
squares_list = [x**2 for x in range(10)]
# Generator Expression(小括號,惰性計算)
squares_gen = (x**2 for x in range(10))
|
加入條件篩選
1
2
3
4
5
6
|
# 取得 0~19 中所有偶數
evens = (x for x in range(20) if x % 2 == 0)
# 迭代取值
for n in evens:
print(n) # 0, 2, 4, 6, ..., 18
|
List Comprehension vs Generator Expression
| 特性 |
List Comprehension |
Generator Expression |
| 語法 |
[expr for x in iter] |
(expr for x in iter) |
| 回傳型別 |
list |
generator |
| 記憶體使用 |
立即建立全部元素 |
惰性計算,逐一產生 |
| 可重複迭代 |
是 |
否(只能迭代一次) |
| 適合場景 |
需要多次使用結果 |
大量資料、一次性處理 |
實際使用場景
1
2
3
4
5
6
7
8
9
10
11
12
|
# 讀取大型檔案時使用 generator,不會一次載入全部行
def read_large_file(file_path):
with open(file_path) as f:
return (line.strip() for line in f if line.strip())
# 配合 sum()、any()、all() 等函式
numbers = range(1, 1000001)
total = sum(x**2 for x in numbers) # 不需先建立 list
# 找出第一個符合條件的元素(搭配 next())
first_even = next(x for x in range(100) if x % 2 == 0)
print(first_even) # 0
|
注意:Generator 只能迭代一次
1
2
3
|
gen = (x for x in range(5))
print(list(gen)) # [0, 1, 2, 3, 4]
print(list(gen)) # [] ← 已耗盡,無法重複使用
|
參考資料