推導式
格式
variable = [out_exp_res for out_exp in input_list if out_exp ==2]
# out_exp_res:列表生成元素表達式,可以是有返回值的函數
# for out_exp in input_list: 迭代input_list將out_exp傳入out_exp_res
# if out_exp == 2:根據條件過濾
列表推導式
- 例一:30以內所有能被3整除的數
print([i for i in range(0,31) if i%3 == 0])
- 例二:30以內所有能被3整除的數的平方
print([i*i for i in range(30) if i % 3 == 0])
例三:找到嵌套列表中名字含有兩個‘e’的所有名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
print([name for lst in names for name in lst if name.count('e') >= 2])
練習題
例1: 過濾掉長度小於3的字符串列表,並將剩下的轉換成大寫字母
例2: 求(x,y)其中x是0-5之間的偶數,y是0-5之間的奇數組成的元祖列表
例3: 求M中3,6,9組成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
1.[name.upper() for name in names if len(name)>3] 2.[(x,y) for x in range(5) if x%2==0 for y in range(5) if y %2==1] 3. [row[2] for row in M]
生成器表達式
1.把列表推導式中的[]換成()得到的就是生成器表達式
2.列表解析與生成器表達式都是一種便利的編程方式,只不過生成器表達式更節省內存
3.Python不但使用迭代器協議,讓for循環變得更加通用。大部分內置函數也是使用迭代器協議訪問對象的。
例如:sum函數是Python的內置函數,該函數使用迭代器協議訪問對象,而生成器實現了迭代器協議,所以,我們可以直接這樣計算一系列值的和。
sum(x ** 2 for x in range(4))