1.8推导式
列表推導式
列表推導式,生成器表達式以及其他推導式,首先我們先看一下這樣的代碼,給出一個列表,通過循環,想列表中添加1~10:
li = []
for i in range(10):li.append(i)
print(li)
列表推導式的常?語法:
[結果 for 變量 in 可迭代對象]
ls = [i for i in range(10)]
print(ls)
列表推導式是通過?行來構建你要的列表, 列表推導式看起來代碼簡單. 但是出現錯誤之后很難排查.
lst = ['python%s' % i for i in range(1,19)]
print(lst)
篩選模式
語法:
[結果 for 變量 in 可迭代對象 if 條件]
lst = [i for i in range(100) if i %2 == 0]
print(lst)
生成器推導式
生成器表達式和列表推導式的語法基本上一樣的,只是把[]換成()
gen = (i for i in range(10))
print(gen)
# 結果: <generator object <genexpr> at 0x0000026046CAEBF8>
打印的結果就是一個生成器,我們可以使用for循環來循環這個生成器
gen = ("第%s次" % i for i in range(10))
for i in gen:print(i)
生成器表達式也可以進行篩選
# 獲取1-100內能被3整除的數
gen = (i for i in range(1,100) if i % 3 == 0)
for num in gen:print(num)
# 100以內能被3整除的數的平?
gen = (i * i for i in range(100) if i % 3 == 0)
for num in gen:print(num)
# 尋找名字中帶有兩個e的人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
# 不用推導式和表達式
result = []
for first in names:for name in first:if name.count("e") >= 2:result.append(name)
print(result)
# 推導式
gen = (name for first in names for name in first if name.count('e') >= 2)
for i in gen:print(i)
可以把生成器里面的值通過某些方法變成一個容器
li = []
gen = (i for i in range(1, 100) if i % 3 == 0)
for num in gen:# print(num)li.append(num)
print(li)
生成器表達式和列表推導式的區別:
1.列表推導式比較耗內存,一次性加載.生成器表達式幾乎不占用內存.使用的時候才分配和使用內存
2.得到的值不一樣,列表推導式得到的是一個列表.生成器表達式獲取的是一個生成器
實例:
def func():print(111)yield 222
g = func() # 生成器g
g1 = (i for i in g) # 生成器g1. 但是g1的數據來源于g
g2 = (i for i in g1) # 生成器g2. 來源g1
# list的底層有for循環,for就是一直執行__next__() 所以可以將生成器放到list中
print(list(g)) # 獲取g中的數據. 這時func()才會被執行. 打印111.獲取到222. g完畢.
print(list(g1)) # 獲取g1中的數據. g1的數據來源是g. 但是g已經取完了. g1 也就沒有數據了
print(list(g2)) # 和g1同理理
print(next(g))
print(next(g1))
print(next(g2)) # 可以用next來驗證 其實list就是將內容迭代了轉換成了列表
每次對生成器調用 next() 時,它會從上次離開位置恢復執行(它會記住上次執行語句時的所有數據值)。
字典推導式
根據名字應該也能猜到,推到出來的是字典
lst1 = ['jay','jj','meet']
lst2 = ['周杰倫','林俊杰','郭寶元']
dic = {lst1[i]:lst2[i] for i in range(len(lst1))}
print(dic)
升級版:
{key:value for key value in d.iterms()}
集合推導式
集合推導式可以幫我們直接生成一個集合,集合的特點;無序,不重復 所以集合推導式自帶去重功能
lst = [1,2,3,-1,-3,-7,9]
s = {abs(i) for i in lst}
print(s)
總結:
推導式有, 列表推導式, 字典推導式, 集合推導式, 沒有元組推導式
生成器表達式: (結果 for 變量 in 可迭代對象 if 條件篩選)
生成器表達式可以直接獲取到?成器對象. ?成器對象可以直接進行for循環. ?成器具有惰性機制.
集合推導式和字典推導式很是類似,記住一個小技巧能夠快速區分那個是字典那個是集合
字典推導式前面的結果是有個冒號,而集合的前面結果就是單純的結果
總結
- 上一篇: with上下文管理
- 下一篇: windows阿里云服务器配置