2 3 元組不僅僅是不可變的列表

2022-05-21 17:48:11 字數 4484 閱讀 4872

元祖拆包:

元組拆包可以應用到任何可迭代物件上,唯一的硬性要求是,被可迭代物件中的元素數量必須要跟接受這些元素的元組的空檔數一致。除非我們用 * 來表示忽略多餘的元素。

最好辨認的元組拆包形式就是平行賦值,也就是說把乙個可迭代物件裡 的元素,一併賦值到由對應的變數組成的元組中:

>>> lax_coordinates = (33.9425, -118.408056) 

>>> latitude, longitude = lax_coordinates #

元組拆包

>>>latitude

33.9425

>>>longitude

-118.408056

另外乙個很優雅的寫法當屬不使用中間變數交換兩個變數的值:

>>> b, a = a, b

還可以用 * 運算子把乙個可迭代物件拆開作為函式的引數:

>>> divmod(20, 8) 

(2, 4)

>>> t = (20, 8)

>>> divmod(*t)

(2, 4)

在進行拆包的時候,我們不總是對元組裡所有的資料都感興趣,_ 佔位符能幫助處理這種情況,下面這段**展示了它的用法:

>>> import

os >>> _, filename = os.path.split('

/home/luciano/.ssh/idrsa.pub')

>>>filename

'idrsa.pub

'

用*來處理剩下的元素:

在 python 中,函式用 *args 來獲取不確定數量的引數算是一種經典寫法了。

於是 python 3 裡,這個概念被擴充套件到了平行賦值中:

>>> a, b, *rest = range(5) 

>>>a, b, rest

(0, 1, [2, 3, 4])

>>> a, b, *rest = range(3)

>>>a, b, rest

(0, 1, [2])

>>> a, b, *rest = range(2)

>>>a, b, rest

(0, 1, )

在平行賦值中,* 字首只能用在乙個變數名前面,但是這個變數可以出現在賦值表示式的任意位置:

>>> a, *body, c, d = range(5) 

>>>a, body, c, d

(0, [1, 2], 3, 4)

>>> *head, b, c, d = range(5)

>>>head, b, c, d

([0, 1], 2, 3, 4)

巢狀元組拆包:

metro_areas =[

('tokyo

', '

jp', 36.933, (35.689722, 139.691667)),

('delhi ncr

', '

in', 21.935, (28.613889, 77.208889)),

]for name, cc, pop, (latitude, longitude) in

metro_areas:

print(name, latitude, longitude)

具名元組 :

collections.namedtuple 是乙個工廠函式,它可以用來構建乙個帶欄位名的元組和乙個有名字的類——這個帶名字的類對除錯程式有很大幫助。

>>> 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

'

❶ 建立乙個具名元組需要兩個引數,乙個是類名,另乙個是類的各個欄位的名字。後者可以是由數個字串組成的可迭代物件,或者是由空格分隔開的欄位名組成的字串。

❷ 存放在對應欄位裡的資料要以一串引數的形式傳入到建構函式中 (注意,元組的建構函式卻只接受單一的可迭代物件)。

❸ 你可以通過欄位名或者位置來獲取乙個欄位的資訊。

除了從普通元組那裡繼承來的屬性之外,具名元組還有一些自己專有的屬性:_fields 類屬性、類方法 _make(iterable) 和例項方法 _asdict()。 

>>>city._fields  ➊ ('

name

', '

country

', '

population

', '

coordinates')

>>> latlong = namedtuple('

latlong

', '

lat long')

>>> delhi_data = ('

delhi ncr

', '

in', 21.935, latlong(28.613889, 77.208889)) >>> delhi =city._make(delhi_data) ➋

>>>delhi._asdict() ➌

ordereddict([(

'name

', '

delhi ncr

'), ('

country

', '

in'), ('

population

', 21.935), ('

coordinates

', latlong(lat=28.613889, long=77.208889))])

>>> for key, value in

delhi._asdict().items():

>>> print(key + ':'

, value)

name: delhi ncr

country: in

population: 21.935coordinates: latlong(lat=28.613889, long=77.208889)

❶ _fields 屬性是乙個包含這個類所有欄位名稱的元組。

❷ 用 _make() 通過接受乙個可迭代物件來生成這個類的乙個例項,它 的作用跟 city(*delhi_data) 是一樣的。

❸ _asdict() 把具名元組以 collections.ordereddict 的形式返回,並不是返回dict,只是可以利用它來把元組裡的資訊友好地呈現出來。

元祖的排序:

python中的列表是可變物件,對可變物件可以排序,比如說:l.sort()或者sorted(l),但在元祖資料結構中,因為元祖是不可變物件,不會提供列表中的這些方法,乙個方法就是先將元祖轉變為列表,對轉變後的列表list排序後,再轉變回元祖tuple:

>>> t = (11, 33, 22, 44)     #

元祖物件

>>> l = list(t) #

轉變為列表物件

>>> l.sort() #

用sort()函式對列表進行排序

>>> l #

排序後的順序

[11, 22, 33, 44]

>>> t = tuple(l) #

再將列表轉換回元祖

>>>t

(11, 22, 33, 44)

第二個方法就是借助sorted()方法,它適用於所有的可迭代序列,但返回的是乙個列表list,所以排序後還是要手動轉換成元祖tuple:

>>> t = (1,2,3)

>>> t = sorted(t, reverse=true)

>>> print

(t)>>> t =tuple(t)

>>> print

(t)[3, 2, 1]

(3, 2, 1)

bw mod 與 mod bw 不僅僅是版本的更新

一直說apache的限速用 bw mod 不經意發現現在的名稱已經變成了 mod bw 比以前更為規範了。同時發現的問題還有,按以前的配置,mod bw無效了,限速不限了。究其原因,是版本更新,功能的變化。具體來講是 2 現在所講的 mod bw 具體版本為 mod bw 0.83 版本的變化中模組...

SEO有效的手段不僅僅是外鏈

如今的排行計畫中,外鏈是最重要的要素,這點不可否認。許多小站,乃至可以說只需求標題修改下,外鏈做做,就可以很快的到達效果。可是,若是關於大點的 或者是負責任些的優化人員,都會從實質上來改動 的使用者體會。而外鏈,其實僅僅其間的一部分罷了。搜尋引擎優化專案的計畫需求做什麼?體系的剖析,哪種seo戰略合...

雲辦公的免費試用不僅僅是免費

雲上辦公訊 許多雲辦公產品在一開始的時候,都會採用免費試用的戰略,時間在幾天至幾個月不等。而在使用者在免費使用期間,自然不單單是補貼資源,更重要的是從客戶那獲得產品最直接的反饋。當客戶第一次試用的時候,需要獲得以下資訊 1.了解客戶從這個產品中最想要獲得的是什麼,而實際獲得的又是什麼 2.盡可能的讓...