Python元組推導式

2020-07-16 10:04:49
元組推導式可以利用 range 區間、元組、列表、字典和集合等資料型別,快速生成一個滿足指定需求的元組。

元組推導式的語法格式如下:

(表示式 for 疊代變數 in 可疊代物件 [if 條件表示式] )

其中,用 [] 括起來的部分,可以使用,也可以省略。

通過和列表推導式做對比,你會發現,除了元組推導式是用 () 圓括號將各部分括起來,而列表推導式用的是 [],其它完全相同。不僅如此,元組推導式和列表推導式的用法也完全相同。

例如,我們可以使用下面的程式碼生成一個包含數位 1~9 的元組:
a = (x for x in range(1,10))
print(a)
執行結果為:

<generator object <genexpr> at 0x0000020BAD136620>


從上面的執行結果可以看出,使用元組推導式生成的結果並不是一個元組,而是一個生成器物件(後續會介紹),這一點和列表推導式是不同的。

如果我們想要使用元組推導式獲得新元組或新元組中的元素,有以下三種方式:
  1. 使用 tuple() 函數,可以直接將生成器物件轉換成元組,例如:
    a = (x for x in range(1,10))
    print(tuple(a))
    執行結果為:
    (1, 2, 3, 4, 5, 6, 7, 8, 9)
  2. 直接使用 for 迴圈遍歷生成器物件,可以獲得各個元素,例如:
    a = (x for x in range(1,10))
    for i in a:
        print(i,end=' ')
    print(tuple(a))
    執行結果為:

    1 2 3 4 5 6 7 8 9 ()

  3. 使用 __next__() 方法遍歷生成器物件,也可以獲得各個元素,例如:
    a = (x for x in range(3))
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    a = tuple(a)
    print("轉換後的元組:",a)
    執行結果為:

    0
    1
    2
    轉換後的元組: ()


注意,無論是使用 for 迴圈遍歷生成器物件,還是使用 __next__() 方法遍歷生成器物件,遍歷後原生成器物件將不復存在,這就是遍歷後轉換原生成器物件卻得到空元組的原因。