使用元组连接操作* ,元组有一个元素(42,) 作为右操作数,这个元素的重复次数作为左操作数。例如,表达式(42,) * n 为n=5 创建元组(42, 42, 42, 42, 42) 。
在你深入了解详细的解决方案之前,让我们先玩一玩交互式代码外壳!
练习:用n=20 占位元素-1 来初始化元组,然后运行代码。
问题的提出
接下来,你将了解更正式的问题,并深入到一步步的解决方案中。
问题:给定一个整数n 。如何初始化一个带有n 占位元素的元组(例如:42)?
# n=0 --> ()
# n=1 --> (42,)
# n=5 --> (42, 42, 42, 42, 42)
例子1 - 元组串联
使用元组连接操作* ,元组的右操作数是一个元素(42,) ,左操作数是这个元素的重复次数。例如,表达式(42,) * n 为n=5 创建元组(42, 42, 42, 42, 42) 。
n = 5
t = (42,) * n
print(t)
# (42, 42, 42, 42, 42)
注意,你不能改变元组的值,一旦创建,因为与列表不同,元组是不可变的。例如,试图覆盖第三个元组的值将产生一个TypeError: 'tuple' object does not support item assignment 。
>>> x = (42,) * 5
>>> x[0] = 'Alice'
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
x[0] = 'Alice'
TypeError: 'tuple' object does not support item assignment
例 2 - N-Ary 元组串联
你也可以使用一个泛化的 单元元组连接--我称它为 N-ary 元组串联- 来创建一个大小为n 的元组。例如,给定一个大小为3的元组t ,你可以像这样通过与整数3相乘来创建一个大小为9的元组。t * 3.
这里有一个例子:
simple_tuple = ('Alice', 42, 3.14)
complex_tuple = simple_tuple * 3
print(complex_tuple)
# ('Alice', 42, 3.14, 'Alice', 42, 3.14, 'Alice', 42, 3.14)
例子3--来自列表的元组
这种方法很简单。首先,创建一个大小为n的列表。 [tuple()](https://blog.finxter.com/python-tuple/)函数来创建一个大小为n 的 tuple。
n = 100
# 1. Create list of size n
lst = [42] * n
# 2. Change value in (mutable) list
lst[2] = 'Alice'
# 3. Create tuple from list AFTER modification
t = tuple(lst)
# 4. Print tuple
print(t)
# (42, 42, 'Alice', 42, 42, ...)
例子 4 - 生成器表达式 (列表的理解)
你可以将一个生成器表达式传入 Python 的内置 [tuple()](https://blog.finxter.com/python-tuple/)函数来动态地创建一个元素的元组,给定另一个可迭代的元素。例如,表达式tuple(i**2 for i in range(10)) 创建了一个有十个平方数的元组。
这里是用于复制和粘贴的代码片段。
x = tuple(i**2 for i in range(10))
print(x)
# (0, 1, 4, 9, 16, 25, 36, 49, 64, 81)