列表生成式:會將所有的結果全部計算出來,把結果存放到內存中,如果列表中數據比較多,就會占用過多的內存空間,可能會導致MemoryError內存錯誤或者導致程序在運行時出現卡頓的情況
列表生成器:會創建一個列表生成器對象,不會一次性的把所有結果都計算出來,如果需要獲取數據,可以使用next()函數來獲取,但是需要注意,一旦next()函數獲取不到數據,會導致出現StopIteration異常錯誤,可以使用for循環遍歷列表生成器,獲取所有數據
需要視情況而定,如果數據量比較大,推薦使用生成器
python2.7中就是range(生成式) 和 xrange(生成器)的區別
列表生成式是快速生成一個列表的一些公式
在列表中存放0~100的數:
普通的列表生成:
numbers=[] for x in range(0,101): numbers.append(x) print(numbers)
用列表生成式生成列表:[要放入列表的數據 簡單的表達式1 表達式2]
#x for x in range(0,101) for循環遍歷出來的值,放入列表中 numbers=[x for x in range(0,101)] print(numbers)
列表中存放0~100的偶數:
普通方法生成列表:
for x in range(0,101): if x%2==0: numbers.append(x) print(numbers)
用列表生成式生成列表:
#for循環遍歷0~101的數字,如果數字對2取余==0,表示是偶數,x放在列表中 numbers=[x for x in range(0,101)if x%2==0] print(numbers)
找出列表list1=['asd','adf','dafg','acbo']帶有a的字符
普通寫法:
rs_list=[] for s in list1: if 'a' in s: rs_list.append(s) print(rs_list)
列表生成式:
list2=[x for x in list1 if 'a' in x]
列表生成式支持雙層for循環
list3=[x*y for x in range(0,10) for y in range(20)] print(list3)
生成器構造實例
# 使用類似列表生成式的方式構造生成器g1 = (2*n + 1 for n in range(3, 6))# 使用包含yield的函數構造生成器def my_range(start, end): for n in range(start, end): yield 2*n + 1g2 = my_range(3, 6)print(type(g1))print(type(g2))
輸出結果:
<class 'generator'>
<class 'generator'>
生成器的調用方式
實例1:使用next()方法遍歷生成器
print(next(g1))print(next(g1))print(next(g1))print(next(g1))
輸出結果:
7
9
11
Traceback (most recent call last):
新聞熱點
疑難解答