真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

python中的三元表達(dá)式,列表解析和生成器表達(dá)式-創(chuàng)新互聯(lián)

三元表達(dá)式

python中的 3元表達(dá)式是對(duì) if...else... 語句的一種簡寫~;這個(gè)在很多時(shí)候都非常有用,而且可以使代碼簡單且易于維護(hù)。

創(chuàng)新互聯(lián)是專業(yè)的龍海網(wǎng)站建設(shè)公司,龍海接單;提供成都網(wǎng)站建設(shè)、網(wǎng)站制作,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行龍海網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
x = 3
y = 4

if x > y:
    res = x
else:
    res = y

上述代碼若使用 3元表達(dá)式,if...else...語句可以簡寫成一行

x = 4
y = 3
res = x if x > y else y

上述例子中,3元表達(dá)式最左邊的 x 和最右邊的 y 可以寫成任意的表達(dá)式

x = 4
y = 3
res = 'aaa' if x > y else 'bbb'

列表解析

-- 類表解析示例

列表解析(list comprehension),一般會(huì)配合 for 循環(huán),以比較優(yōu)雅的方式生成列表,大大減少代碼量,且增強(qiáng)了代碼的可讀性~

s = []
for i in 'hello':
    s.append(i.upper()) 
print(s)

輸出結(jié)果:
['H', 'E', 'L', 'L', 'O']

上述代碼若使用列表解析,可使用如下代碼替換,輸出結(jié)果一致:

s = [i.upper() for i in 'hello']
print(s)

說明:for 循環(huán)得到的每一個(gè)元素返回給 for 前面的 i 變量,然后執(zhí)行 upper 函數(shù),將執(zhí)行結(jié)果以列表的形式返回~。相比于 for 循環(huán),列表解析的語法由 c語言實(shí)現(xiàn),性能會(huì)有所提升~

-- 添加條件判斷

列表解析中,for 循環(huán)后面亦可添加 條件語句,篩選出滿足條件的元素:

lst = [1,2,60,67,34,78,98,70,89]
print([i for i in lst if i > 50])

輸出結(jié)果:
[60, 67, 78, 98, 70, 89]

總結(jié)一下列表解析的語法:

[expression for item1 in iterable1 if condition1
                    for item2 in iterable2 if condition2
                    .....
                    for itemN in iterableN if conditionN
        ]

絕大多數(shù)的情況,列表解析僅使用一層循環(huán),即:

[expression for item in iterable if condition]

-- 結(jié)合三元表達(dá)式

上面已經(jīng)給出列表解析的語法,for 循環(huán)前面的 expression 可以是一個(gè)變量,也可以是一個(gè)表達(dá)式,看如下示例,列表中的×××(int)原樣取出,若是浮點(diǎn)類型(float),則進(jìn)行四舍五入后取出:

a = [1,2,3.2,1.3,5.9]
res = [i if isinstance(i, int) else int(round(i)) for i in a]

res : [1, 2, 3, 1, 6]

這里 for 循環(huán)前的 expression 是一個(gè)三元表達(dá)式,判斷語句在三元表達(dá)式中實(shí)現(xiàn)~

-- 全0列表

for 循環(huán)前的 expression 也可以是一個(gè) 常量,例如要獲取一個(gè)固定長度的,且都是某個(gè)值的列表:

lst = [0 for i in range(10)]    # 長度為10,全為0 的列表

lst : [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

-- 復(fù)雜的列表解析

列表解析多層 for 循環(huán)示例,讀取列表中每個(gè)單詞的字母,并生成一個(gè)新的列表:

lst = ['hello', 'kitty']
res = [l for word in lst for l in word]

res : ['h', 'e', 'l', 'l', 'o', 'k', 'i', 't', 't', 'y']

如上示例可能一下子難以理解,根據(jù)列表解析的語法:

[expression for item1 in iterable1 if condition1
                    for item2 in iterable2 if condition2
                    .....
                    for itemN in iterableN if conditionN
        ]

類似于

res=[]
for item1 in iterable1:
    if condition1:
        for item2 in iterable2:
             if condition2:
                ......
                for itemN in iterableN:
                     if conditionN:
                            res.append(expression)

如上示例使用 for 循環(huán)表示:

res = []
for word in lst:
    for l in word:
        res.append(l)

print(res)

輸出結(jié)果:
['h', 'e', 'l', 'l', 'o', 'k', 'i', 't', 't', 'y']

列表解析并沒有降低代碼的可讀性,且縮小了代碼量、提升了性能,但是若其中出現(xiàn)多層 for 循環(huán)嵌套,可能會(huì)降低代碼的可讀性,不易于理解~

生成器表達(dá)式

列表解析會(huì)一次性生成所有的數(shù)據(jù)到內(nèi)存中,然后生成列表對(duì)象,這樣不適用于迭代大量的數(shù)據(jù)。 而生成器表達(dá)式正好解決了這個(gè)問題~
生成器表達(dá)式的語法與列表解析的語法類似,即外面的中括號(hào) 換成括號(hào)即可:

語法:
(expression for item1 in iterable1 if condition1
                    for item2 in iterable2 if condition2
                    .....
                    for itemN in iterableN if conditionN
       )

示例:
>>> g = (i for i in range(100))
>>> g
 at 0x00000288D8C9A308>

若使用生成器表達(dá)式,所有的數(shù)據(jù)不會(huì)一次性全部加載到內(nèi)存中,而是按照從前向后的順序,用到一個(gè)加載一個(gè)。當(dāng)數(shù)據(jù)量比較大時(shí),更節(jié)省內(nèi)存~

import time

start_time = time.time()
g = (i for i in range(100000000))
stop_time = time.time()
print('run time is %s' % (stop_time - start_time))

print(next(g))
print(next(g))
print(next(g))

輸出結(jié)果:
run time is 0.0        # 得到生成器 g 的用時(shí)~
0
1
2

同樣的數(shù)據(jù)量使用列表解析,會(huì)消耗相當(dāng)長的時(shí)間,若是再加幾個(gè)0,程序可能就會(huì)卡住:

import time

start_time = time.time()
lst = [i for i in range(100000000)]
stop_time = time.time()
print('run time is %s' % (stop_time - start_time))

lst_iter = lst.__iter__()
print(next(lst_iter))
print(next(lst_iter))
print(next(lst_iter))

輸出結(jié)果:
run time is 5.407538890838623     # 生成列表的時(shí)長
0
1
2

當(dāng)然生成器表達(dá)式也有缺點(diǎn),由于生成器表達(dá)式返回的是一個(gè)生成器,所以若要迭代所有的元素,只能從前往后挨個(gè)迭代;而列表解析返回的是列表,可以根據(jù)索引立即返回指定位置的元素~

gen = (i for i in range(100))
# print(gen[10])             # 錯(cuò)誤

lst = [i for i in range(100)]
print(lst[10])                  # 沒有問題

.................^_^

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。


當(dāng)前文章:python中的三元表達(dá)式,列表解析和生成器表達(dá)式-創(chuàng)新互聯(lián)
網(wǎng)站地址:http://weahome.cn/article/cdhshd.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部