元组的范围和可迭代对象

267 阅读6分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第2天,点击查看活动详情

元组的范围和可迭代对象

如上节所述,函数范围生成一个类型为 range 的对象。与字符串和元组一样,类型范围的对象是不可变的。元组上的所有操作也可用于范围,串联和重复除外。例如,范围(10)[2:6][2] 的计算结果为 4。当使用 == 运算符比较 range 类型的对象时,如果两个范围表示相同的整数序列,则返回 True。例如,范围(0, 7, 2)==范围 (0, 8, 2) 的计算结果为 True。但是,range(0, 7, 2) == 范围 (6, -1, -2) 的计算结果为 False,因为尽管这两个范围包含相同的整数,但它们以不同的顺序出现。

与元组类型的对象不同,类型范围的对象所占用的空间量与其长度不成比例。由于范围完全由其起始值、停止值和步长值定义,因此可以将其存储在少量空间中。

范围最常见的用途是 for 循环,但范围类型的对象可以在任何可以使用整数序列的地方使用。在 Python 3 中,范围是可迭代对象的特殊情况。所有可迭代类型都有一个方法,34

iter_that返回迭代器类型的对象。然后,可以在 for 循环中使用迭代器来返回一系列对象,一次返回一个对象。例如,元组是可迭代的,并且 for 语句

对于 (1, 'a', 2, (3, 4)中的埃勒姆):

创建一个迭代器,该迭代器将一次返回一个元组的元素。Python有许多内置的可迭代类型,包括字符串,列表和字典。

许多有用的内置函数在可迭代对象上运行。其中比较有用的是总和,最小值和最大值。函数求和可以应用于数字的可迭代对象。它返回元素的总和。这函数 max 和 min 可以应用于元素上有明确定义的排序的可迭代对象。

练习:编写一个计算结果为数字元组平均值的表达式。使用函数求和。.

列表和可变性

与元组一样,列表是值的有序序列,其中每个值都由索引标识。用于表示列表类型的文本的语法类似于用于元组的语法;不同之处在于我们使用方括号而不是括号。空列表写为 [],单例列表在右括号之前没有那个(哦,很容易忘记)逗号。

由于列表是可迭代的,我们可以使用 for 语句来迭代列表中的元素。所以,举个例子,代码

image.png

产生输出:

image.png

我们还可以索引列表和切片列表,就像我们对元组一样。例如,代码

image.png

打印

image.png

将方括号用于三种不同的目的(列表类型的文字、索引到可迭代对象和切片可迭代对象)可能会导致视觉混淆。例如,计算结果为 3 的表达式 [1,2,3,4][1:3][1]以三种方式使用方括号。这在实践中很少成为问题,因为大多数时候列表都是增量构建的,而不是写成文字。

列表与元组的不同之处在于一个非常重要的方面:列表是可变的。相反,元组和字符串是不可变的。许多运算符可用于创建不可变类型的对象,变量可以绑定到这些类型的对象。但是,不可变类型的对象在创建后无法对其进行修改。另一方面,可变类型的对象可以在创建后进行修改。

改变对象和将对象分配给变量之间的区别起初可能看起来很微妙。然而,如果你不断重复这个咒语,“在Python中,变量只是一个名字,即一个可以附加到物体上的标签”,它会给你带来清晰度。也许以下几组示例也会有所帮助。

image.png

执行时,解释器创建两个新列表并将适当的变量绑定到它们,如 Eigure 5-1 所示。

image.png

作业语句

image.png

也创建新的列表并将变量绑定到它们。这些列表的元素本身就是列表。三份打印声明

image.png

生成输出

image.png

看起来好像单列式和单式 1 绑定到同一个值。但外表可能是欺骗性的。如图 5-2 所示,统一和 Univs1 绑定到完全不同的值。

image.png

Univs 和 univs1 绑定到不同的对象可以使用内置的 Python 函数 ID 进行验证,该 ID 返回对象的唯一整数标识符。此函数允许我们通过比较它们的 id1 来测试对象相等性。测试对象相等性的一种更简单的方法是使用 is 运算符。当我们运行代码时

image.png

它打印

image.png

(如果运行此代码,则不要期望看到相同的唯一标识符。Python的语义没有说明与每个对象关联的标识符;它只要求没有两个对象具有相同的标识符。

请注意,在图 5-2 中,univs 的元素不是 Techs 和 Ivys 绑定到的列表的副本,而是列表本身。univs1 的元素是包含与 Univs 中的列表相同的元素的列表,但它们不是相同的列表。我们可以通过运行代码来看到这一点

image.png

哪些打印

image.png

为什么对价值和对象平等之间的区别大惊小怪?这很重要,因为列表是可变的。考虑代码技术.append(“RPI”)

列表的追加方法具有副作用。它不是创建一个新列表,而是通过添加一个新元素(本示例中的字符串“RPI”)来改变现有列表 Techs。图 5-3 描述了执行追加后的计算状态。

image.png

univs 绑定到的对象仍包含相同的两个列表,但其中一个列表的内容已更改。因此,打印语句

image.png

现在生成输出

image.png

我们在这里所拥有的称为别名。同一列表对象有两个不同的路径。一条路径通过变量 Techs,另一条路径通过 Univs 绑定到的列表对象的第一个元素。我们可以通过任一路径使对象发生突变,并且突变的影响将通过两条路径可见。这可能很方便,但也可能是危险的。无意的混叠会导致编程错误,这些错误通常很难跟踪。例如,您认为打印的内容

image.png