鍍金池/ 教程/ Python/ 元組
標(biāo)準(zhǔn)庫 (4)
如何成為 Python 高手
標(biāo)準(zhǔn)庫 (6)
標(biāo)準(zhǔn)庫 (3)
類(2)
Pandas 使用 (2)
xml
用 tornado 做網(wǎng)站 (5)
文件(1)
練習(xí)
列表(3)
從小工到專家
除法
錯誤和異常 (2)
函數(shù)(1)
用 tornado 做網(wǎng)站 (7)
為做網(wǎng)站而準(zhǔn)備
函數(shù)練習(xí)
標(biāo)準(zhǔn)庫 (8)
Pandas 使用 (1)
回顧 list 和 str
字典(1)
用 tornado 做網(wǎng)站 (3)
字符串(1)
函數(shù)(2)
寫一個簡單的程序
將數(shù)據(jù)存入文件
語句(5)
SQLite 數(shù)據(jù)庫
集成開發(fā)環(huán)境(IDE)
集合(1)
類(1)
用 tornado 做網(wǎng)站 (6)
用 tornado 做網(wǎng)站 (2)
自省
語句(4)
錯誤和異常 (1)
用 tornado 做網(wǎng)站 (4)
集合(2)
列表(1)
標(biāo)準(zhǔn)庫 (1)
生成器
mysql 數(shù)據(jù)庫 (1)
第三方庫
實(shí)戰(zhàn)
運(yùn)算符
類(3)
字典(2)
語句(1)
數(shù)和四則運(yùn)算
語句(2)
文件(2)
MySQL 數(shù)據(jù)庫 (2)
電子表格
迭代器
mongodb 數(shù)據(jù)庫 (1)
特殊方法 (2)
特殊方法 (1)
字符編碼
編寫模塊
用 tornado 做網(wǎng)站 (1)
標(biāo)準(zhǔn)庫 (5)
函數(shù)(4)
類(5)
字符串(2)
關(guān)于 Python 的故事
函數(shù)(3)
字符串(4)
處理股票數(shù)據(jù)
常用數(shù)學(xué)函數(shù)和運(yùn)算優(yōu)先級
字符串(3)
為計(jì)算做準(zhǔn)備
多態(tài)和封裝
類(4)
迭代
語句(3)
錯誤和異常 (3)
分析 Hello
Python 安裝
標(biāo)準(zhǔn)庫 (2)
列表(2)
元組

元組

定義

先看一個例子:

>>># 變量引用 str
>>> s = "abc"
>>> s
'abc'

>>>#如果這樣寫,就會是...
>>> t = 123,'abc',["come","here"]
>>> t
(123, 'abc', ['come', 'here'])

上面例子中看到的變量 t,并沒有報(bào)錯,也沒有“最后一個有效”,而是將對象做為一個新的數(shù)據(jù)類型:tuple(元組),賦值給了變量 t。

元組是用圓括號括起來的,其中的元素之間用逗號隔開。(都是英文半角)

元組中的元素類型是任意的 Python 數(shù)據(jù)。

這種類型,可以歪著想,所謂“元”組,就是用“圓”括號啦。

其實(shí),你不應(yīng)該對元組陌生,還記得前面講述字符串的格式化輸出時,有這樣一種方式:

print "I love %s, and I am a %s" % ('python', 'programmer') I love Python, and I am a programmer

這里的圓括號,就是一個元組。

顯然,tuple 是一種序列類型的數(shù)據(jù),這點(diǎn)上跟 list/str 類似。它的特點(diǎn)就是其中的元素不能更改,這點(diǎn)上跟 list 不同,倒是跟 str 類似;它的元素又可以是任何類型的數(shù)據(jù),這點(diǎn)上跟 list 相同,但不同于 str。

>>> t = 1,"23",[123,"abc"],("python","learn")   #元素多樣性,近 list
>>> t
(1, '23', [123, 'abc'], ('python', 'learn'))

>>> t[0] = 8                                   #不能原地修改,近 str
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment

>>> t.append("no")  
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'tuple' object has no attribute 'append'
    >>> 

從上面的簡單比較似乎可以認(rèn)為,tuple 就是一個融合了部分 list 和部分 str 屬性的雜交產(chǎn)物。此言有理。

索引和切片

因?yàn)榍懊嬗辛岁P(guān)于列表和字符串的知識,它們都是序列類型,元組也是。因此,元組的基本操作就和它們是一樣的。

例如:

>>> t
(1, '23', [123, 'abc'], ('python', 'learn'))
>>> t[2]
[123, 'abc']
>>> t[1:]
('23', [123, 'abc'], ('python', 'learn'))

>>> t[2][0]     #還能這樣呀,哦對了,list 中也能這樣
123
>>> t[3][1]
'learn'

關(guān)于序列的基本操作在 tuple 上的表現(xiàn),就不一一展示了??垂倏梢匀ピ囋?。

但是這里要特別提醒,如果一個元組中只有一個元素的時候,應(yīng)該在該元素后面加一個半角的英文逗號。

>>> a = (3)
>>> type(a)
<type 'int'>

>>> b = (3,)
>>> type(b)
<type 'tuple'>

以上面的例子說明,如果不加那個逗號,就不是元組,加了才是。這也是為了避免讓 Python 誤解你要表達(dá)的內(nèi)容。

順便補(bǔ)充:如果要想看一個對象是什么類型,可以使用 type()函數(shù),然后就返回該對象的類型。

所有在 list 中可以修改 list 的方法,在 tuple 中,都失效。

分別用 list()和 tuple()能夠?qū)崿F(xiàn)兩者的轉(zhuǎn)化:

>>> t         
(1, '23', [123, 'abc'], ('python', 'learn'))
>>> tls = list(t)                           #tuple-->list
>>> tls
[1, '23', [123, 'abc'], ('python', 'learn')]

>>> t_tuple = tuple(tls)                    #list-->tuple
>>> t_tuple
(1, '23', [123, 'abc'], ('python', 'learn'))

tuple 用在哪里?

既然它是 list 和 str 的雜合,它有什么用途呢?不是用 list 和 str 都可以了嗎?

在很多時候,的確是用 list 和 str 都可以了。但是,看官不要忘記,我們用計(jì)算機(jī)語言解決的問題不都是簡單問題,就如同我們的自然語言一樣,雖然有的詞匯看似可有可無,用別的也能替換之,但是我們依然需要在某些情況下使用它們.

一般認(rèn)為,tuple 有這類特點(diǎn),并且也是它使用的情景:

  • Tuple 比 list 操作速度快。如果您定義了一個值的常量集,并且唯一要用它做的是不斷地遍歷它,請使用 tuple 代替 list。
  • 如果對不需要修改的數(shù)據(jù)進(jìn)行 “寫保護(hù)”,可以使代碼更安全。使用 tuple 而不是 list 如同擁有一個隱含的 assert 語句,說明這一數(shù)據(jù)是常量。如果必須要改變這些值,則需要執(zhí)行 tuple 到 list 的轉(zhuǎn)換 (需要使用一個特殊的函數(shù))。
  • Tuples 可以在 dictionary(字典,后面要講述) 中被用做 key,但是 list 不行。Dictionary key 必須是不可變的。Tuple 本身是不可改變的,但是如果您有一個 list 的 tuple,那就認(rèn)為是可變的了,用做 dictionary key 就是不安全的。只有字符串、整數(shù)或其它對 dictionary 安全的 tuple 才可以用作 dictionary key。
  • Tuples 可以用在字符串格式化中。

總目錄   |   上節(jié):回顧 list 和 str   |   下節(jié):字典(1)

如果你認(rèn)為有必要打賞我,請通過支付寶:qiwsir@126.com,不勝感激。