Contents

[Python]Conditional expressions和Generator expressions

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))  # []  ← 已耗盡,無法重複使用

參考資料