轉(zhuǎn)自:?https://www.cnblogs.com/rivendare/p/9493698.html
列表解析式
可以根據(jù)已有列表,高效創(chuàng)建新列表的方式。列表解析是Python迭代機(jī)制的一種應(yīng)用,它常用于實(shí)現(xiàn)創(chuàng)建新的列表,返回的是一個(gè)列表,因此用在[]中。
列表解析式因編譯器進(jìn)行優(yōu)化,提高了效率,減少出錯(cuò),增加可讀性
語(yǔ)法
- [ 返回值 for 元素 in 可迭代對(duì)象 if條件 ]
- 使用中括號(hào)[ ],內(nèi)部是for循環(huán),if條件語(yǔ)句可選
- 返回一個(gè)新列表
?示例1:
生成一個(gè)列表,元素0-9,對(duì)每一個(gè)元素自增1后求平方返回新列表
#常規(guī)寫法
new = []
for i in range(10):
new.append((i+1)**2)
print(new)
#使用列表解析式方法
new = [(i+1)**2 for i in range(10)]
print(new)
?輸出結(jié)果相同:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
?
示例2:
獲取10以內(nèi)的偶數(shù)
list = [i for i in range(10) if i % 2 == 0]
print(list)
輸出結(jié)果為:
[0, 2, 4, 6, 8]
示例3:
20以內(nèi),即能被2整除又能被3整除的數(shù)
#以下兩種方法都可以
list1 = [i for i in range(20) if i % 2 == 0 if i % 3 == 0] #方法一
list2 = [i for i in range(20) if i % 2 == 0 and i % 3 == 0] #方法二
?
列表解析式進(jìn)階
- [返回值 for i in 可迭代對(duì)象A for j in 可迭代對(duì)象B]
- 等價(jià)于:
list = []
for i in iterableA:
for j in iterableB:
list.append(expr)
示例1:
list1 = [(x,y) for x in "abc" for y in range(3)]
list2 = [[x,y] for x in "abc" for y in range(3)]
list3 = [{x:y} for x in "abc" for y in range(3)]
print(list1)
print(list2)
print(list3)
輸出:
[('a', 0), ('a', 1), ('a', 2), ('b', 0), ('b', 1), ('b', 2), ('c', 0), ('c', 1), ('c', 2)]
[['a', 0], ['a', 1], ['a', 2], ['b', 0], ['b', 1], ['b', 2], ['c', 0], ['c', 1], ['c', 2]]
[{'a': 0}, {'a': 1}, {'a': 2}, {'b': 0}, {'b': 1}, {'b': 2}, {'c': 0}, {'c': 1}, {'c': 2}]
?示例2:
#以下三種輸出一樣,但推薦使用第一種方法,效率更高
list1 = [(i,j) for i in range(7) if i>4 for j in range(20,25) if j >23]
list2 = [(i,j) for i in range(7) for j in range(20,25) if i>4 if j >23]
list3 = [(i,j) for i in range(7) for j in range(20,25) if i>4 and j >23]
print(list1)
print(list2)
print(list3)
輸出:
[(5, 24), (6, 24)]
[(5, 24), (6, 24)]
[(5, 24), (6, 24)]
?
復(fù)雜示例:
1.返回1-10的平方列表
2.有一個(gè)列表list = [1,4,9,16,2,5,10,15],生成一個(gè)新列表。要去新列表元素是lst相鄰2項(xiàng)的和
3.用列表解析式方法打印九九乘法表:
list = [1, 4, 9, 16, 2, 5, 10, 15]
list1 = [i**2 for i in range(1,11)]
list2 = [list[i] + list[i+1] for i in range(len(list)-1)]
print(list1)
print(list2)
[print('{}*{}={:<3}'.format(j, i, j * i), end='\n' if i == j else '') for i in range(1, 10) for j in range(1, i + 1)]
?
生成器表達(dá)式
生成器和列表解析式的區(qū)別
- 生成器表達(dá)式是按需計(jì)算(或稱惰性求值,延遲計(jì)算)需要的時(shí)候才計(jì)算
- 列表解析式是立即返回值
語(yǔ)法
- (返回值 for 元素 in 可迭代對(duì)象 if 條件)
- 將列表解析式的中括號(hào)換成小括號(hào)
- 返回一個(gè)生成器
生成器
- 可迭代對(duì)象
- 迭代器
生成器表達(dá)式示例:
g = ("{:04}".format(i) for i in range(1,6))
next(g)
for x in g:
print(x)
print("-----------------------")
for x in g :
print(x)
?
- 生成器進(jìn)行延遲計(jì)算
- 返回迭代器,可進(jìn)行迭代
- 對(duì)迭代器g使用next()方法,會(huì)將g撥動(dòng)一下
- 從前到后走完一遍后,不能回頭
?
生成器和列表解析式的對(duì)比
計(jì)算方式
- 生成器表達(dá)式延遲計(jì)算,列表解析式立即計(jì)算
內(nèi)存占用
- 單從返回值本身來說,生成器表達(dá)式省內(nèi)存,列表解析式返回新列表
- 生成器沒有數(shù)據(jù),內(nèi)存占用極小,但是使用的時(shí)候,雖然一個(gè)個(gè)返回?cái)?shù)據(jù),但是合起來占用內(nèi)存相當(dāng)
- 列表解析式構(gòu)造新的列表需要占用內(nèi)存
計(jì)算速度
- 單看計(jì)算時(shí)間,生成器表達(dá)式耗時(shí)非常短,列表解析式耗時(shí)長(zhǎng)
- 但是生成器本身并沒有返回任何值,只是返回了生成對(duì)象
- 列表解析式構(gòu)造并返回一個(gè)新列表
?
集合解析式
語(yǔ)法
- {返回值 for 元素 in 可迭代對(duì)象 if 條件}
- 列表解析式的中括號(hào)[ ]換成大括號(hào){ }
- 立即返回一個(gè)集合
示例:
a = {(x,x+1) for x in range(10)}
print(a)
輸出:
{(0, 1), (1, 2), (7, 8), (6, 7), (5, 6), (4, 5), (8, 9), (9, 10), (2, 3), (3, 4)}
?注意,集合解析式中不能出現(xiàn)列表等不可hash的元素,否則編譯器報(bào)錯(cuò)
?
字典解析式
語(yǔ)法
- {返回值 for 元素 in 可迭代對(duì)象 if 條件}
- 列表解析式的中括號(hào)[ ]換成大括號(hào){ }
- 使用key:value形式
- 立即返回一個(gè)字典
?
示例:
a = {x:(x,x+1) for x in range(5)}
b = {x:[x,x+1] for x in range(5)}
c = {(x,):[x,x+1] for x in range(5)}
print(a)
print(b)
print(c)
輸出:
{0: (0, 1), 1: (1, 2), 2: (2, 3), 3: (3, 4), 4: (4, 5)}
{0: [0, 1], 1: [1, 2], 2: [2, 3], 3: [3, 4], 4: [4, 5]}
{(2,): [2, 3], (0,): [0, 1], (3,): [3, 4], (1,): [1, 2], (4,): [4, 5]}
注意,字典解析式中的key不能出現(xiàn)列表等不可hash的元素,否則編譯器報(bào)錯(cuò)
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
