65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (5投票s)

2020年6月15日

CPOL

4分钟阅读

viewsIcon

13953

downloadIcon

148

现在您已经了解了 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 = 1b = 2c = 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 中的列表和元组,并学习了索引、解构和循环。在下一篇文章中,我们将讨论生成器和类。

© . All rights reserved.