Python 元组、列表、解构和循环






4.25/5 (5投票s)
现在您已经了解了 Python 的基础知识,我们可以深入探讨列表和元组这两种数据结构,看看如何使用它们。
引言
这是我们帮助您学习 Python 及其在机器学习 (ML) 和人工智能 (AI) 中应用的系列文章的第二部分。
现在您已经了解了 Python 的基础知识,这些基础知识已在第一部分中进行了讨论,我们可以深入探讨列表和元组这两种数据结构,看看如何使用它们。
列表
列表是项目的集合。列表是可变的:您可以更改其元素及其大小。因此,它们类似于 C# 中的 List<T>
、Java 中的 ArrayList<T>
以及 JavaScript 中的数组。
您可以这样赋值一个列表,然后通过其零基索引访问其元素
foo = [1, 2, True, "mixing types is fine"]
print(foo[0]) # 1
foo[0] = 3
print(foo[0]) # 3
append
方法在列表末尾添加一个元素。insert
方法将元素放置在您指定的索引处
foo = [1, 2, 3]
foo.append(4)
print(foo) # [1, 2, 3, 4]
foo.insert(0, 0.5)
print(foo) # [0.5, 1, 2, 3, 4]
要删除指定索引处的元素,请使用 del
关键字
del foo[2]
print(foo) # [0.5, 1, 3, 4]
元组
元组是另一种类型的项目集合。元组类似于列表,但它们是不可变的。元组可以这样赋值
foo = 1, 2, True, "you can mix types, like in lists"
您经常会看到格式为 (1, 2, "a")
的元组,并带有括号。元组值周围的括号用于提高可读性,或者在上下文需要时使用。例如,1, 2 + 3, 4
的含义与 (1, 2) + (3, 4)
不同!第一个表达式返回一个元组 (1, 5, 4)
,而第二个表达式返回 (1, 2, 3, 4)
。
从元组中获取值与从列表中获取值的方式相同,即 foo[index],
其中 index
表示元素的零基索引。如果您尝试更改元组的一个元素,您会发现元组是不可变的
foo[0] = 3 # will raise a TypeError
这对列表来说是可以的,但对元组不行。
元组也没有 append、remove 以及其他一些方法。
您也可以从函数返回元组,这是一种常见的做法
def your_function():
return 1, 2
这将返回一个元组 (1, 2)
。
如果您想要一个只有一个元素的元组,请在该元素后面加上一个逗号
foo = 1,
负索引和切片
Python 的索引比我目前演示的要强大得多。它们提供了一些 C#、Java 等语言所没有的功能。一个例子是负索引,其中 -1 指的是最后一个元素,-2 指的是倒数第二个元素,依此类推。
my_list = [1, 2, 3]
print(my_list[-1]) # 3
这在列表和元组上都适用。
此外,您可以通过指定切片中起始元素、结束元素或起始和结束元素的索引来获取列表或元组的 *切片*。这将生成一个包含元素子集的新列表或元组。以下是一些示例来说明
my_list = [0, 1, 2, 3, 4, 5]
print(my_list[1:2]) # [1, 2]
print(my_list[2:]) # [2, 3, 4, 5]
print(my_list[:2]) # [0, 1]
print(my_list[0:4:2]) # [0, 2]
print(my_list[-3:-1]) # [3, 4]
print(my_list[::-1]) # [5, 4, 3, 2, 1, 0]
切片表示法是 [start:stop:step]
。如果 start
为空,则默认为 0。如果 end
为空,则表示列表的末尾。:step
表示法是可选的。因此,::-1
表示“从 0 到列表末尾,步长为 -1”,从而返回反转的列表。
切片永远不会引发 IndexError
。当超出范围时,它们只会返回一个空列表。
解构
想象一下,您有一个已知元素数量的元组(或列表),比如三个。假设您更愿意拥有三个独立的变量,每个变量对应一个元组元素。
Python 提供了一种称为解构(或解包)的功能,可以在一行中拆分一个集合
my_tuple = 1, 2, 3
a, b, c = my_tuple
现在 a = 1
、b = 2
和 c = 3
。
这同样适用于列表
my_list = [1, 2, 3]
a, b, c = my_list
在处理返回元组的函数时,这一点非常有用,而且 Python 生态系统中有很多这样的函数,在处理与 AI 相关的库时也同样有用。
循环
您可能熟悉三种循环:for、foreach 和 while。Python 只提供 while 和 foreach 循环(它使用 for
关键字来实现!)。不过不用担心。正如我们稍后将看到的,创建一个行为与 for 循环完全相同的循环非常容易。
这是一个遍历列表的 Python 循环
fruits = ["Apple", "Banana", "Pear"]
for fruit in fruits:
print(fruit)
您也可以遍历元组
fruits = "Apple", "Banana", "Pear"
for fruit in fruits:
print(fruit)
通常,您可以在每个 *迭代器* 上使用 for 循环。迭代器以及如何创建自己的迭代器将在后续文章中更深入地讨论。
如果您想要一个 C 风格的 for 循环而不是 foreach 循环,您可以遍历 range
函数的结果,该函数返回一个范围内的迭代器
for i in range(10):
print(i)
最后打印的数字将是 9。这等同于以下 C 代码片段
for (int i = 0; i < 10; i++) {
Console.WriteLine(i);
}
range
函数提供的功能不止是简单地从零计数到给定的数字。您可以使用 range(x, 10)
指定不同的起始数字,其中 x
将是第一个数组元素。您可以使用第三个参数指定步长,例如 range(0, 10, 2)
。
创建从高到低计数的范围如下:range(10, 0, -1)
。第一个元素将是 10,最后一个元素将是 1。事实上,range(0, 10)
*不是* range(10, 0, -1)
的反向,因为第二个参数不会包含在范围内。
Python 中的 while 循环看起来与您已经了解的很相似
while condition:
# code
Python 还提供了 break 和 continue 语句,它们的功能与 C#、Java、JavaScript 以及许多其他语言中的相同。
while True:
if input() == "hello":
break
结论
在本模块中,我们了解了 Python 中的列表和元组,并学习了索引、解构和循环。在下一篇文章中,我们将讨论生成器和类。