天天看點

三元表達式,清單解析和生成器表達式

三元表達式

在以前,在諸如比較兩個數大小的時候,通常的寫法都是下面的樣子

if x > y:
    print("the max is x")
else:
    print("the max is y")           

三元表達式的文法為:

True if expression else False           

現在可以個體三元表達式來完成這種比較簡單的判斷

res = x if x > y else y
print(res)           

清單解析

清單解析的文法格式為

[ i操作 for i in 清單 if 表達式1 and 表達式2]           
  • 其中if判斷語句是可選語句,可以對清單的元素進行操作

現在有這樣一個需求,把一個數字清單中的每個值都取平方,把一個清單中的每個字元串都轉換為大寫形式

可以這樣寫

l1 = range(1, 10, 2)
l2 = []
for i in l1:
    l2.append(i**2)

l3 = ['python', 'linux', 'javascript', 'mysql']
l4 = []
for j in l3:
    j = j.upper()
    l4.append(j)

print(l2)
print(l4)           

那有沒有簡單的方式呢,可以使用清單解析,上面的例子則可以修改為

l1 = range(1, 10, 2)
l2 = [i**2 for i in l1]

l3 = ['python', 'linux', 'javascript', 'mysql']
l4 = [j.upper() for j in l3]

print(l2)
print(l4)           

生成器表達式

清單解析得到的結果仍然是一個清單,清單解析的優點是:取值友善

缺點:很占系統資源,如果清單的長度較小時使用清單解析會很友善,但是如果清單的長度很大的時候,使用清單解析會占用很多的記憶體資源,此時可以使用生成器表達式來節省記憶體資源

來看下面的例子

res = ( i**2 for i in range(100))
print(res)           

得到的結果為

<generator object <genexpr> at 0x0000000002DA1AF0>           

在上面的例子裡,把清單解析表達式中的中括号換成小括号,那麼表達式執行結果就變成了一個生成器

我們知道,生成器的本質就是疊代器,是以上面的表達式執行的結果生成器,可以使用for 循環來取值

res = ( i**2 for i in range(100))

for i in res:
    print(i)