个性化阅读
专注于IT技术分析

Python元组权威开发教程

本文概述

与Python列表类似, 元组是另一种标准数据类型, 它允许你将值存储在序列中。在你可能想与某人共享数据但又不允许他们操纵数据的情况下, 它们可能很有用。但是, 他们可以使用数据值, 但共享的原始数据不会反映任何更改。

在本教程中, 你将详细了解Python元组:

  • 你将学习如何初始化元组。通过示例, 你还将看到元组的不变性。
  • 你还将发现元组与Python列表的不同之处。
  • 然后, 你将看到各种元组操作, 例如切片, 乘法, 串联等。
  • 了解元组的一些内置函数会很有帮助, 你将在本节中看到一些重要的函数。
  • 最后, 你将看到也可以一次将多个值分配给元组。

python元组教程

确保检查出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'
---------------------------------------------------------------------------

TypeError                                 Traceback (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)
---------------------------------------------------------------------------

AttributeError                            Traceback (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)
---------------------------------------------------------------------------

AttributeError                            Traceback (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)
---------------------------------------------------------------------------

TypeError                                 Traceback (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数据结构。另外, 你了解到还可以一次将多个值分配给元组。

赞(0)
未经允许不得转载:srcmini » Python元组权威开发教程

评论 抢沙发

评论前必须登录!