中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python3 元組tuple入門基礎

發布時間:2020-08-25 09:11:45 來源:腳本之家 閱讀:147 作者:mdxy-dxy 欄目:開發技術

Python 的元組與列表類似,不同之處在于元組的元素不能修改。

元組使用小括號,列表使用方括號。

元組創建很簡單,只需要在括號中添加元素,并使用逗號隔開即可。

實例(Python 3.0+)

>>>tup1 = ('Baidu', 'jb51', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5 )
>>> tup3 = "a", "b", "c", "d" # 不需要括號也可以
>>> type(tup3)
<class 'tuple'>

創建空元組

tup1 = ()

元組中只包含一個元素時,需要在元素后面添加逗號,否則括號會被當作運算符使用:

實例(Python 3.0+)

>>>tup1 = (50)
>>> type(tup1)  # 不加逗號,類型為整型
<class 'int'>
 
>>> tup1 = (50,)
>>> type(tup1)  # 加上逗號,類型為元組
<class 'tuple'>

元組與字符串類似,下標索引從0開始,可以進行截取,組合等。

訪問元組

元組可以使用下標索引來訪問元組中的值,如下實例:

實例(Python 3.0+)

#!/usr/bin/python3
 
tup1 = ('Baidu', 'jb51', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print ("tup1[0]: ", tup1[0])
print ("tup2[1:5]: ", tup2[1:5])

以上實例輸出結果:

tup1[0]: Baidu
tup2[1:5]: (2, 3, 4, 5)

修改元組

元組中的元素值是不允許修改的,但我們可以對元組進行連接組合,如下實例:

實例(Python 3.0+)

#!/usr/bin/python3
 
tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元組元素操作是非法的。
# tup1[0] = 100
 
# 創建一個新的元組
tup3 = tup1 + tup2
print (tup3)

以上實例輸出結果:

(12, 34.56, 'abc', 'xyz')

刪除元組

元組中的元素值是不允許刪除的,但我們可以使用del語句來刪除整個元組,如下實例:

實例(Python 3.0+)

#!/usr/bin/python3
 
tup = ('Baidu', 'Jb51', 1997, 2000)
 
print (tup)
del tup
print ("刪除后的元組 tup : ")
print (tup)

以上實例元組被刪除后,輸出變量會有異常信息,輸出如下所示:

刪除后的元組 tup :
Traceback (most recent call last):
File "test.py", line 8, in <module>
print (tup)
NameError: name 'tup' is not defined

元組運算符

與字符串一樣,元組之間可以使用 + 號和 * 號進行運算。這就意味著他們可以組合和復制,運算后會生成一個新的元組。

Python 表達式 結果 描述
len((1, 2, 3)) 3 計算元素個數
(1, 2, 3) + (4, 5, 6) (1, 2, 3, 4, 5, 6) 連接
('Hi!',) * 4 ('Hi!', 'Hi!', 'Hi!', 'Hi!') 復制
3 in (1, 2, 3) True 元素是否存在
for x in (1, 2, 3): print (x,) 1 2 3 迭代

元組索引,截取

因為元組也是一個序列,所以我們可以訪問元組中的指定位置的元素,也可以截取索引中的一段元素,如下所示:

元組:

L = ('Baidu', 'Taobao', 'jb51')

Python 表達式 結果 描述
L[2] 'jb51' 讀取第三個元素
L[-2] 'Taobao' 反向讀取,讀取倒數第二個元素
L[1:] ('Taobao', 'jb51') 截取元素,從第二個開始后的所有元素。

運行實例如下:

>>> L = ('Baidu', 'Taobao', 'Jb51')
>>> L[2]
'Jb51'
>>> L[-2]
'Taobao'
>>> L[1:]
('Taobao', 'Jb51')

元組內置函數

Python元組包含了以下內置函數

序號 方法及描述 實例
1 len(tuple)
計算元組元素個數。
>>> tuple1 = ('Baidu', 'Jb51', 'Taobao')
>>> len(tuple1)
3
>>> 
2 max(tuple)
返回元組中元素最大值。
>>> tuple2 = ('5', '4', '8')
>>> max(tuple2)
'8'
>>> 
3 min(tuple)
返回元組中元素最小值。
>>> tuple2 = ('5', '4', '8')
>>> min(tuple2)
'4'
>>> 
4 tuple(iterable)
將可迭代系列轉換為元組。
>>> list1= ['Baidu', 'Taobao', 'Jb51', 'Baidu']
>>> tuple1=tuple(list1)
>>> tuple1
('Baidu', 'Taobao', 'Jb51', 'Baidu')

關于元組是不可變的

所謂元組的不可變指的是元組所指向的內存中的內容不可變。

>>> tup = ('r', 'u', 'n', 'o', 'o', 'b')
>>> tup[0] = 'g'  # 不支持修改元素
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup)  # 查看內存地址
4440687904
>>> tup = (1,2,3)
>>> id(tup)
4441088800 # 內存地址不一樣了

從以上實例可以看出,重新賦值的元組 tup,綁定到新的對象了,不是修改了原來的對象。

下面是其他網友的補充

tuple和list非常類似,但是tuple一旦初始化就不能修改,比如同樣是列出同學的名字:

代碼如下:

>>> classmates = ('Michael', 'Bob', 'Tracy')

現在,classmates這個tuple不能變了,它也沒有append(),insert()這樣的方法。其他獲取元素的方法和list是一樣的,你可以正常地使用classmates[0],classmates[-1],但不能賦值成另外的元素。不可變的tuple有什么意義?因為tuple不可變,所以代碼更安全。如果可能,能用tuple代替list就盡量用tuple。tuple的陷阱:當你定義一個tuple時,在定義的時候,tuple的元素就必須被確定下來,比如:

代碼如下:

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

如果要定義一個空的tuple,可以寫成():

代碼如下:

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

但是,要定義一個只有1個元素的tuple,如果你這么定義:

代碼如下:

>>> t = (1)
>>> t
1

定義的不是tuple,是1這個數!這是因為括號()既可以表示tuple,又可以表示數學公式中的小括號,這就產生了歧義,因此,Python規定,這種情況下,按小括號進行計算,計算結果自然是1。

所以,只有1個元素的tuple定義時必須加一個逗號 ,來消除歧義:

代碼如下:

>>> t = (1,)
>>> t
(1,)

Python在顯示只有1個元素的tuple時,也會加一個逗號,,以免你誤解成數學計算意義上的括號。

在來看一個"可變的"tuple:

代碼如下:

>>> t = ('a', 'b', ['A', 'B'])
>>> t[2][0] = 'X'
>>> t[2][1] = 'Y'
>>> t
('a', 'b', ['X', 'Y'])

這個tuple定義的時候有3個元素,分別是'a','b'和一個list。不是說tuple一旦定義后就不可變了嗎?怎么后來又變了?

別急,我們先看看定義的時候tuple包含的3個元素:當我們把list的元素'A'和'B'修改為'X'和'Y'后,tuple變為:表面上看,tuple的元素確實變了,但其實變的不是tuple的元素,而是list的元素。tuple一開始指向的list并沒有改成別的list,所以,tuple所謂的"不變"是說,tuple的每個元素,指向永遠不變。即指向'a',就不能改成指向'b',指向一個list,就不能改成指向其他對象,但指向的這個list本身是可變的!理解了"指向不變"后,要創建一個內容也不變的tuple怎么做?那就必須保證tuple的每一個元素本身也不能變。

tuple元素不可變有一種特殊情況,當元素是可變對象時。對象內部屬性是可以修改的!tuple的不可變限制只是在一個緯度上:元素的類型。實現理解,tuple的元素所保存的內容(數值或內存地址)是不允許修改的,但地址映射的對象自身是可以修改的。

>>> a = (1,[3,2])
>>> a[1][0] = 1
>>> a
(1, [1, 2])
>>> a[1].append(3)
>>> a
(1, [1, 2, 3])
>>> del a[1][2]
>>> a
(1, [1, 2])
>>> del a[1]
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'tuple' object doesn't support item deletion
>>> del a[1][1]
>>> del a[1][0]
>>> a
(1, [])
>>>

字符串是一種特殊的tuple,支持部分tuple的運算符

>>> a = '12345'
>>> a[2]
'3'
>>> a[3:]
'45'
>>> type(a)
<class 'str'>
>>> a*2
'1234512345'
>>> 6 in a
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
TypeError: 'in <string>' requires string as left operand, not int
>>> a
'12345'
>>> for x in a: print(x)
... 
1
2
3
4
5

Python元組的升級版本 -- namedtuple(具名元組)

因為元組的局限性:不能為元組內部的數據進行命名,所以往往我們并不知道一個元組所要表達的意義,所以在這里引入了 collections.namedtuple 這個工廠函數,來構造一個帶字段名的元組。具名元組的實例和普通元組消耗的內存一樣多,因為字段名都被存在對應的類里面。這個類跟普通的對象實例比起來也要小一些,因為 Python 不會用 __dict__ 來存放這些實例的屬性。

namedtuple 對象的定義如以下格式:

collections.namedtuple(typename, field_names, verbose=False, rename=False)
返回一個具名元組子類 typename,其中參數的意義如下:

 typename:元組名稱
 field_names: 元組中元素的名稱
 rename: 如果元素名稱中含有 python 的關鍵字,則必須設置為 rename=True
 verbose: 默認就好

下面來看看聲明一個具名元組及其實例化的方法:

import collections

# 兩種方法來給 namedtuple 定義方法名
#User = collections.namedtuple('User', ['name', 'age', 'id'])
User = collections.namedtuple('User', 'name age id')
user = User('tester', '22', '464643123')

print(user)

collections.namedtuple('User', 'name age id') 創建一個具名元組,需要兩個參數,一個是類名,另一個是類的各個字段名。后者可以是有多個字符串組成的可迭代對象,或者是有空格分隔開的字段名組成的字符串(比如本示例)。具名元組可以通過字段名或者位置來獲取一個字段的信息。

輸出結果:

User(name='tester', age='22', id='464643123')

具名元組的特有屬性:

類屬性 _fields:包含這個類所有字段名的元組 類方法 _make(iterable):接受一個可迭代對象來生產這個類的實例 實例方法 _asdict():把具名元組以 collections.OrdereDict 的形式返回,可以利用它來把元組里的信息友好的展示出來

from collections import namedtuple

# 定義一個namedtuple類型User,并包含name,sex和age屬性。
User = namedtuple('User', ['name', 'sex', 'age'])

# 創建一個User對象
user = User(name='Runoob', sex='male', age=12)

# 獲取所有字段名
print( user._fields )

# 也可以通過一個list來創建一個User對象,這里注意需要使用"_make"方法
user = User._make(['Runoob', 'male', 12])

print( user )
# User(name='user1', sex='male', age=12)

# 獲取用戶的屬性
print( user.name )
print( user.sex )
print( user.age )

# 修改對象屬性,注意要使用"_replace"方法
user = user._replace(age=22)
print( user )
# User(name='user1', sex='male', age=21)

# 將User對象轉換成字典,注意要使用"_asdict"
print( user._asdict() )
# OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])

以上實例輸出結果為:

('name', 'sex', 'age')
User(name='Runoob', sex='male', age=12)
Runoob
male
12
User(name='Runoob', sex='male', age=22)
OrderedDict([('name', 'Runoob'), ('sex', 'male'), ('age', 22)])

元組的一些特殊需求實現

1、定義元組后,根據不同的情形增加新的元組內容

t1=(1,2,3)
for i in range(1,5):
 t2=(i,)
 t1=t1+t2
print(t1)

輸出為:

(1, 2, 3, 1, 2, 3, 4)

2、修改元組內的特定位置的值

t1=(1,2,3)
for i in range(1,5):
 t2=(i,)
 t1=t1+t2
print(t1)

l1=list(t1)
print(l1)

l1[0]=9
print(l1)

t1=tuple(l1)
print(t1)

輸出為:

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

元組所指向的內存實際上保存的是元組內數據的內存地址集合(即 t[0], t[1]...t[n] 的內存地址),且元組一旦建立,這個集合就不能增加修改刪除,一旦集合內的地址發生改變,必須重新分配元組空間保存新的地址集(元組類似 C 語言里的指針數組,只不過這個數組不能被修改)。

測試下面代碼:

print("連接前:")
t1=(1,2,"3")
t2=("4",5,["d1","d2"])
print("t1=",t1)
print("t2=",t2)
print("t1:",id(t1))
print("t2:",id(t2))
print("t1[0]:",id(t1[0]))
print("t1[1]:",id(t1[1]))
print("t1[2]:",id(t1[2]))
print("t2[0]:",id(t2[0]))
print("t2[1]:",id(t2[1]))
print("t2[2]:",id(t2[2]))
print("連接后:")
t1= t1+t2
print("t1(t1+t2):",id(t1))
print("t1[0]:",id(t1[0]))
print("t1[1]:",id(t1[1]))
print("t1[2]:",id(t1[2]))
print("t1[3]:",id(t1[3]))
print("t1[4]:",id(t1[4]))
print("t1[5]:",id(t1[5]))
t1[5].append("d3")
print("t1[5]增加d3:")
print("t1[5]=",t1[5])
print("t1[5]:",id(t1[5]))
print("t2=",t2)

輸出:

連接前:
t1= (1, 2, '3')
t2= ('4', 5, ['d1', 'd2'])
t1: 1719219799168
t2: 1719219799528
t1[0]: 1378249760
t1[1]: 1378249792
t1[2]: 1719200188208
t2[0]: 1719199042336
t2[1]: 1378249888
t2[2]: 1719219441608
連接后:
t1(t1+t2): 1719222365256
t1[0]: 1378249760
t1[1]: 1378249792
t1[2]: 1719200188208
t1[3]: 1719199042336
t1[4]: 1378249888
t1[5]: 1719219441608
t1[5]增加d3:
t1[5]= ['d1', 'd2', 'd3']
t1[5]: 1719219441608
t2= ('4', 5, ['d1', 'd2', 'd3'])

測試結論:元組 t1 跟 t2 連接并賦值 t1 后,t1 地址發生變化(因地址集合變化),t1[0], t1[1], t1[2], t2[0], t2[1], t2[2] 地址不變且保存在連接后的 t1,元組內數據根據自身類型確定是否可修改值(t1[0]..t1[4] 分別為不可修改的數據類型,t1[5] 為可修改的列表),連接后 t1[5] 跟 t2[2] 地址一樣,t1[5] 變化將會導致 t2[2] 變化。

通過間接方法修改元組:

tuple1 = (1,2,4,5)
tuple2 = tuple1[:2] + (3,) + tuple1[2:]
print(tuple2)

輸出結果為:

(1, 2, 3, 4, 5)

關于如何修改元組的幾個脫褲子放屁的方法:

# 方法一,賦值修改法
tup = (4,5,6,7,8) 
tup = ('誰', '說', '元', '組', '不', '能', '改')
print(tup)
#輸出: ('誰', '說', '元', '組', '不', '能', '改')


#方法二、中間變量法
tup = (4, 6, 7,8, 9, 10 ,0)
tup = list(tup)
list2 = ['誰', '說', '元', '組', '不', '能', '改']
for i in range(7):
 tup[i] = list2[i]
print(tup)
#輸出: ['誰', '說', '元', '組', '不', '能', '改']

這篇文章就介紹到這了,希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

偃师市| 贺兰县| 金溪县| 绥化市| 会泽县| 巨鹿县| 无为县| 驻马店市| 阜南县| 哈密市| 买车| 原阳县| 商丘市| 瑞昌市| 堆龙德庆县| 思南县| 万州区| 晋江市| 确山县| 襄樊市| 梅州市| 开阳县| 南木林县| 南通市| 周宁县| 樟树市| 含山县| 南乐县| 吕梁市| 马公市| 天峨县| 潮州市| 天镇县| 隆回县| 崇州市| 磐安县| 深水埗区| 揭东县| 恭城| 建瓯市| 永登县|