本文概述
- Python元组
- 元组与列表
- 常见的元组操作
- 元组函数
- 奖励:分配多个值
- 恭喜!
在本教程中, 你将详细了解Python元组:
- 你将学习如何初始化元组。通过示例, 你还将看到元组的不变性。
- 你还将发现元组与Python列表的不同之处。
- 然后, 你将看到各种元组操作, 例如切片, 乘法, 串联等。
- 了解元组的一些内置函数会很有帮助, 你将在本节中看到一些重要的函数。
- 最后, 你将看到也可以一次将多个值分配给元组。 :target:before { content:"
"
;
display:block;
height:150px;
margin:-150px 0 0;
} h3 {font-weight:normal;
margin-top:.5em} h4 { font-weight:lighter }
文章图片
确保检查出srcmini的Data Science的Data Types课程, 在这里你可以巩固和实践对数据结构的知识, 例如列表, 字典, 集合等等!另外, 也请查看此Python数据结构教程, 在这里你可以了解有关Python使用的不同数据结构的更多信息。
Python元组 如前所述, 你可以使用此Python数据结构存储不可变(或不变)且有序的一系列项目。
元组用()括号而不是列表的[]括号初始化。这意味着, 要创建一个, 只需执行以下操作:
cake = ('c', 'a', 'k', 'e')
print(type(cake))
<
class 'tuple'>
请记住, type()是一个内置函数, 可让你检查传递给它的参数的数据类型。
元组可以同时具有同构值和异类值。但是, 请记住, 一旦声明了这些值, 就无法更改它们:
mixed_type = ('C', 0, 0, 'K', 'I', 'E')for i in mixed_type:
print(i, ":", type(i))
C : <
class 'str'>
0 : <
class 'int'>
0 : <
class 'int'>
K : <
class 'str'>
I : <
class 'str'>
E : <
class 'str'>
# Try to change 0 to 'O'
mixed_type[1] = 'O'
---------------------------------------------------------------------------TypeErrorTraceback (most recent call last)<
ipython-input-16-dec29c289a95>
in <
module>
()
---->
1 mixed_type[1] = 'O' # Trying to change 0 to 'O'TypeError: 'tuple' object does not support item assignment
你收到此最后一条错误消息, 因为你无法更改元组中的值。
这是创建元组的另一种方法:
numbers_tuple = 1, 2, 3, 4, 5
print(type(numbers_tuple))
<
class 'tuple'>
元组与列表 你可能已经注意到, 元组与列表非常相似。实际上, 你可以说它们是不可变的列表, 这意味着一旦创建一个元组, 你将无法删除或更改其中存储的项目的值。你也不能添加新值。看一下这个:
numbers_tuple = (1, 2, 3, 4, 5)
numbers_list = [1, 2, 3, 4, 5]# Append a number to the tuple
numbers_tuple.append(6)
---------------------------------------------------------------------------AttributeErrorTraceback (most recent call last)<
ipython-input-26-e47776d745ce>
in <
module>
()
3
4 # Append a number to the tuple
---->
5 numbers_tuple.append(6)AttributeError: 'tuple' object has no attribute 'append'
这引发了错误, 因为你不能从元组中删除或追加到元组, 但是可以使用列表。
# Append numbers to the list
numbers_list.append(6)
numbers_list.append(7)
numbers_list.append(8)# Remove a number from the list
numbers_list.remove(7)
print(numbers_list)
[1, 2, 3, 4, 5, 6, 8]
但是, 如果元组是不可变的, 为什么还要使用它们呢?
好吧, 它们不仅提供对数据值的” 只读” 访问, 而且还比列表快。考虑以下代码:
import timeit
timeit.timeit('x=(1, 2, 3, 4, 5, 6, 7, 8, 9)', number=100000)
0.0018976779974764213
timeit.timeit('x=[1, 2, 3, 4, 5, 6, 7, 8, 9]', number=100000)
0.019868606992531568
对于元组, 不可变真正意味着什么?
根据Python的官方文档, 不可变是” 具有固定值的对象” , 但是” 值” 是一个模糊的术语, 元组的正确术语是” id” 。 ” id” 是对象在内存中的位置标识。
让我们更深入地看一下:
# Tuple 'n_tuple' with a list as one of its item.
n_tuple = (1, 1, [3, 4])#Items with same value have the same id.
id(n_tuple[0]) == id(n_tuple[1])
True
#Items with different value have different id.
id(n_tuple[0]) == id(n_tuple[2])
False
id(n_tuple[0])
4297148528
id(n_tuple[2])
4359711048
n_tuple.append(5)
---------------------------------------------------------------------------AttributeErrorTraceback (most recent call last)<
ipython-input-40-3cd258e024ff>
in <
module>
()
---->
1 n_tuple.append(5)AttributeError: 'tuple' object has no attribute 'append'
我们无法将项目追加到元组, 这就是为什么你在上面看到错误的原因。这就是为什么将元组称为不可变的原因。但是, 你始终可以这样做:
n_tuple[2].append(5)
n_tuple
(1, 1, [3, 4, 5])
因此, 允许你实际变异原始元组。那么, 元组又如何被称为不可变的呢?
这是因为, 即使你将5附加到元组中, 该列表的ID仍然保持不变。
id(n_tuple[2])
4359711048
总结到目前为止所学的内容:
一些元组(仅包含不可变对象:字符串等)是不可变的, 而其他一些元组(包含一个或多个可变对象:列表等)是可变的。但是, 这对于Pythonista来说通常是值得商bat的话题, 你将需要更多的背景知识来完全理解它。同样, 这是一篇更深入的文章。现在, 让我们说元组通常是不可变的。
- 由于元素的不可变属性, 因此无法将其添加到元组。元组没有append()或extend()方法,
- 你也不能从元组中删除元素, 这也是由于它们的不可变性。元组没有remove()或pop()方法,
- 你可以在元组中找到元素, 因为这不会更改元组。
- 你还可以使用in运算符检查元组中是否存在元素。
如果你想了解更多有关Python列表的信息, 请务必阅读本教程!
常见的元组操作 Python为你提供了多种操作元组的方法。让我们用示例检查一些重要的例子。
元组切片
元组中的第一个值索引为0。与Python列表一样, 你可以将索引值与方括号[]结合使用以访问元组中的项目:
numbers = (0, 1, 2, 3, 4, 5)
numbers[0]
0
你还可以对元组使用负索引:
numbers[-1]
5
使用索引获取单个项目时, 切片可让你获取项目的子集。输入要提取的范围时, 这称为范围切片。范围切片的一般格式为:
[Start index (included):Stop index (excluded):Increment]
这里Increment是一个可选参数, 默认情况下, 增量为1。
# Item at index 4 is excluded
numbers[1:4]
(1, 2, 3)
# This provides all the items in the tuple
numbers[:]
(0, 1, 2, 3, 4, 5)
# Increment = 2
numbers[::2]
(0, 2, 4)
提示:你还可以使用负增量值反转元组。
numbers[::-1]
(5, 4, 3, 2, 1, 0)
元组加法
你可以合并元组以形成新的元组。加法运算仅执行与元组的串联。
x = (1, 2, 3, 4)
y = (5, 6, 7, 8)# Combining two tuples to form a new tuple
z = x + y print(z)
(1, 2, 3, 4, 5, 6, 7, 8)
y = [5, 6, 7, 8]
z = x + y
print(z)
---------------------------------------------------------------------------TypeErrorTraceback (most recent call last)<
ipython-input-55-d352c6414a4c>
in <
module>
()
1 y = [5, 6, 7, 8]
---->
2 z = x + y
3 print(z)TypeError: can only concatenate tuple (not "list") to tuple
你只能添加或合并相同的数据类型。因此, 将元组和列表组合在一起会给你带来错误。
元组乘法
乘法运算仅导致元组的重复。
x = (1, 2, 3, 4)
z = x*2
print(z)
(1, 2, 3, 4, 1, 2, 3, 4)
元组函数 与Python列表不同, 元组由于其不可变的性质而没有诸如append(), remove(), extend(), insert()和pop()之类的方法。但是, 还有许多其他内置方法可用于元组:
count()和len()
count()返回项目在元组中出现的次数。
a = [1, 2, 3, 4, 5, 5]
a.count(5)
2
使用len()函数, 你可以返回元组的长度:
a = (1, 2, 3, 4, 5)
print(len(a))
5
任何()
你可以使用any()发现元组的任何元素是否是可迭代的。在这种情况下, 你将返回True, 否则将返回False。
a = (1, )
print(any(a))
True
注意上面的元组声明中的。如果在元组中初始化单个项目时未指定逗号, 则Python会假定你错误地添加了额外的一对括号(这是无害的), 但数据类型不是元组。因此, 在声明元组中的单个项目时, 请记住添加逗号。
现在, 回到any()函数:在布尔上下文中, 项目的值无关紧要。空元组为假, 任何具有至少一项的元组为真。
b = ()
print(any(b))
False
当你在程序中的某个位置调用元组并且要确保已填充该元组时, 此功能可能会很有用。
元组()
使用tuple()将数据类型转换为元组。例如, 在下面的代码块中, 你将Python列表转换为元组。
a_list = [1, 2, 3, 4, 5]
b_tuple = tuple(a_list)
print(type(b_tuple))
<
class 'tuple'>
min()和max()
虽然max()返回元组中的最大元素, 但是你可以使用min()返回元组中的最小元素。考虑以下示例:
print(max(a))
print(min(a))
5
A
你也可以将其用于包含字符串数据类型的元组。
# The string 'Apple' is automatically converted into a sequence of characters.
a = ('Apple')
print(max(a))
p
和()
使用此功能, 你可以返回元组中各项的总和。这只能与数值一起使用。
sum(a)
28
sorted()
要返回具有按排序顺序排列的元素的元组, 请使用sorted(), 如以下示例所示:
a = (6, 7, 4, 2, 1, 5, 3)
sorted(a)
[1, 2, 3, 4, 5, 6, 7]
值得注意的是, 返回类型是列表而不是元组。原始元组” a” 中的序列未更改, 并且” a” 的数据类型仍然保留为元组。
奖励:分配多个值 元组可以做的很酷的事情是使用它们一次分配多个值。看一下这个:
a = (1, 2, 3)
(one, two, three) = a
print(one)
1
a是三个元素的元组, 而(one, two, 3)是三个变量的元组。将(1、2、3)分配给元组, 将a的每个值分别分配给每个变量:1、2和3。当你必须为存储在元组中的序列分配一个值范围时, 这会很方便。
恭喜! 你已经完成了本元组教程的结尾!在此过程中, 你了解了更多有关Python元组的信息, 如何初始化它们, 可以对它们进行操作的最常用操作以及最常用的方法, 以便你可以从中获取更多的见解。 Python数据结构。另外, 你了解到还可以一次将多个值分配给元组。
推荐阅读
- 40+ Python统计数据科学资源
- Scipy教程(向量和数组(线性代数))
- Python列表深入理解教程
- Python Excel教程(权威指南)
- Python迭代器使用教程
- 跟我一起使用android Studio打包react-native项目的APK
- 关于appium中的TouchAction的用法
- MappedByteBuffer
- #Leetcode# 448. Find All Numbers Disappeared in an Array