python基礎(十七):三元表達式、列表生成式、生成器生成式

一、三元表達式

三元表達式是python爲我們提供的一種簡化代碼的解決方案,語法如下

res = 條件成立時返回的值 if 條件 else 條件不成立時返回的值

二、列表生成式

(1)列表生成式語法

列表生成式是python爲我們提供的一種簡化代碼的解決方案,用來快速生成列表,語法如下:

list1 = [value for item in iterable if condition]
# for循環,滿足conditon條件的,就會把value append到本列表中。看過我前面博客的都應該知道iterable代表一個可迭代對象。

不僅僅有列表生成式,與列表生成方法類似的還有字典生成式、集合生成式、

(2)列表生成式案例
list1 = ['lxx','hxx','uxx','huahua']
list2 = [ i.upper() for i in list1 if i.endswith('xx') ]
print(list2) # 執行結果:['LXX', 'HXX', 'UXX']
(3)字典生成式案例
keys = ['華晨宇','吳晉丞','愛根','dsb']
dic0 = [ key:None for key in keys if key != 'dsb' ]
print(dic0) # 執行結果:{'華晨宇': None, '吳晉丞': None, '愛根': None}

tuple1 = (['華晨宇',30],['吳晉丞',20],['愛根',28],['dsb',10])
dic1 = { k:v for k,v in list1 if k != 'dsb' }
print(dic1) # 執行結果:{'華晨宇': 30, '吳晉丞': 20, '愛根': 28}
(4)集合生成式案例
keys = ['華晨宇','吳晉丞','愛根','dsb']
set1 = { key for key in keys } # 默認識別成字典,因爲沒有k,因此識別成集合
print(set1,type(set1)) # 執行結果:{'吳晉丞', '愛根', 'dsb', '華晨宇'} <class 'set'>

三、生成器生成式

創建一個生成器對象有兩種方式,一種是調用帶yield關鍵字的函數,另一種就是生成器生成式,與列表生成式的語法格式相同,只需要將[]換成(),即:
注意:有人可能會認爲這不是元組生成式吧,其實不然,元組、字符串是不可變類型,沒有append方法,因此不可變類型沒有生成式

語法:

g =(expression for item in iterable if condition)

對比列表生成式返回的是一個列表,生成器生成式返回的是一個生成器對象

>>> [x**2 for x in range(3)] #這裏是x的平方
[0, 1, 4]
>>> g=(x*x for x in range(3)) #x乘x
>>> g
<generator object <genexpr> at 0x101be0ba0>

對比列表生成式一下產生全部值來說,生成器生成式的優點自然是節省內存(調用一次才產生一個值在內存中)

>>> next(g)
0
>>> next(g)
1
>>> next(g)
4
>>> next(g) #拋出異常StopIteration

如果我們要讀取一個大文件的字節數,應該基於生成器生成式的方式完成:

with open('db.txt','rb') as f: #也可以改成t模式,計算字符數
    nums=(len(line.strip()) for line in f) # 去掉每行的空格,再計算字節數
    total_size=sum(nums) # 依次執行next(nums),然後累加到一起得到結果=
    print(total_size) 

注意:sum函數,傳的必須是一個可迭代對象,比如字典、列表、元組、集合。文件對象不行,因爲文件對象裏面的內容要麼是字符要麼是字節,不是數字,上面也是用了len函數轉變成了對數字的求和。無論是那個可迭代對象,都要求求和的內容只能是數字,不能是字符串,即是'1'都不行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章