Python元组权威开发教程

本文概述

  • Python元组
  • 元组与列表
  • 常见的元组操作
  • 元组函数
  • 奖励:分配多个值
  • 恭喜!
【Python元组权威开发教程】与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 }
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'

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

    推荐阅读