1. 程式人生 > >Python學著玩(1)-元組

Python學著玩(1)-元組

python元組使用()宣告,與列表的[]所區分

例如

tuple= (1, 2) #宣告元組
list= [1, 2] #宣告列表

說到這裡我突然想到一個事情,像元組列表這些字面量的宣告無非就是語法糖,但是為什麼在一些靜態語言中卻看不到這樣的設計呢?
例如 kotlin宣告一個list

 val list=listOf(1,2,3) #宣告一個列表

後來想了想,應該還是因為動態語言和靜態語言對效率上的要求不同導致他們的語法設計理念有差異。

就像kotlin的listof,雖然返回的是一個list介面,但是深入原始碼裡發現他返回是一個arrayList,即底層為array的list,而如果在某些情況下覺得底層為連結串列的list效率更高,那麼就可以構造這樣的list。

但是python這類動態語言,似乎就隱藏了實際的底層實現差異,不太在乎效率的問題。而更關注於功能的實現,我們並不知道他字面量返回的資料結構底層是由什麼實現的,也不用去關心。

當然兩者都可以做到同樣的事情,python也能構造以連結串列為底層的list來使用,只是方便與否的問題,使用python時,我相信大多數人都會傾向於使用有字面量語法糖的那幾個資料結構,而不是仔細的思考什麼資料結構在當前任務下效率最高。

而在靜態語言下,似乎對選取哪個資料結構更高的思考會更多。

接下來繼續對python元組本身的討論

元組拆包

這玩意沒啥好說的,就是語法糖,包了一組資料,然後可以快速的在複合資料和單個數據之間轉化,也可以變相實現函式多返回值,還是很方便的。
最近很多新語言也有了,不過名詞一直沒法統一很蛋疼。

>>> lax_coordinates = (33.9425, -118.408056) #宣告元組
>>> latitude, longitude = lax_coordinates # 元組拆包

恩。。因為元組就是一個語法糖,所以有時候元組本身作為中間變數也可以省掉,
就可以完成如下的轉換

#有中間變數的情況
tmp=(a,b)
b,a=tmp
#省略中間變數的情況
b, a = a, b

元組* 運算子

把元組展開成連續的引數,和js的apply類似吧

#正常情況下
divmod(20, 8)

#使用元組的情況下
#先宣告一個元組
t = (20, 8) #使用*運算子展開 divmod(*t)

用*來處理剩下的元素

a, b, *rest = range(5) #結果分別是0, 1, [2, 3, 4]

可以看到僅僅是一些語法糖就可以讓生活變得更加美好~
還有一些

巢狀元組拆包

接受表示式的元組可以是巢狀式的,例如 (a, b, (c, d))。只要這個
接受元組的巢狀結構符合表示式本身的巢狀結構,Python 就可以作出正
確的對應

metro_areas = [
('Tokyo','JP',36.933,(35.689722,139.691667)), 
('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
('Sao Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]
for name, cc, pop, (latitude, longitude) in metro_areas: #
if longitude <= 0: #
print(fmt.format(name, latitude, longitude))
輸出結果
Mexico City | 19.4333 | -99.1333
New York-Newark | 40.8086 | -74.0204
Sao Paul | -23.5478 | -46.6358

具名元組

具名元組就是快速構成一個類,然後通過這個類來生成元組,從而就可以對元組有一些限制,還可以用一些語法特性例如命名引數來更好的構建元組。

>>> from collections import namedtuple
>>> City = namedtuple('City', 'name country population coordinates')
>>> tokyo = City('Tokyo', 'JP', 36.933, (35.689722, 139.691667))
>>> tokyo
City(name='Tokyo', country='JP', population=36.933, coordinates=(35.689722,
139.691667))
>>> tokyo.population
36.933
>>> tokyo.coordinates
(35.689722, 139.691667)
>>> tokyo[1]
'JP'

元組的不可變性

這個應該每本入門書第一個提的元組特性就是這個了吧,我就不重複了,總之最重要的就是沒有可變的物件副作用,傳入函式後不用怕被錯誤更改。