196 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			196 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | ||
| title: The Tuples
 | ||
| localeTitle: 元组
 | ||
| ---
 | ||
| ## 元组
 | ||
| 
 | ||
| 元组是一系列Python对象。元组是不可变的,这意味着它们在创建后不能被修改,这与列表不同。
 | ||
| 
 | ||
| **创建:**
 | ||
| 
 | ||
| 使用一对圆括号`()`创建一个空`tuple` :
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> empty_tuple = () 
 | ||
|     >>> print(empty_tuple) 
 | ||
|     () 
 | ||
|     >>> type(empty_tuple) 
 | ||
|     <class 'tuple'> 
 | ||
|     >>> len(empty_tuple) 
 | ||
|     0 
 | ||
| ```
 | ||
| 
 | ||
| 通过用逗号分隔元素来创建带元素的`tuple` (围绕圆括号, `()` ,可选,但有例外):
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> tuple_1 = 1, 2, 3       # Create tuple without round brackets. 
 | ||
|     >>> print(tuple_1) 
 | ||
|     (1, 2, 3) 
 | ||
|     >>> type(tuple_1) 
 | ||
|     <class 'tuple'> 
 | ||
|     >>> len(tuple_1) 
 | ||
|     3 
 | ||
|     >>> tuple_2 = (1, 2, 3)     # Create tuple with round brackets. 
 | ||
|     >>> print(tuple_2) 
 | ||
|     (1, 2, 3) 
 | ||
|     >>> tuple_3 = 1, 2, 3,      # Trailing comma is optional. 
 | ||
|     >>> print(tuple_3) 
 | ||
|     (1, 2, 3) 
 | ||
|     >>> tuple_4 = (1, 2, 3,)    # Trailing comma in round brackets is also optional. 
 | ||
|     >>> print(tuple_4) 
 | ||
|     (1, 2, 3) 
 | ||
| ```
 | ||
| 
 | ||
| 具有单个元素的`tuple`必须具有尾随逗号(带或不带圆括号):
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> not_tuple = (2)    # No trailing comma makes this not a tuple. 
 | ||
|     >>> print(not_tuple) 
 | ||
|     2 
 | ||
|     >>> type(not_tuple) 
 | ||
|     <class 'int'> 
 | ||
|     >>> a_tuple = (2,)     # Single element tuple. Requires trailing comma. 
 | ||
|     >>> print(a_tuple) 
 | ||
|     (2,) 
 | ||
|     >>> type(a_tuple) 
 | ||
|     <class 'tuple'> 
 | ||
|     >>> len(a_tuple) 
 | ||
|     1 
 | ||
|     >>> also_tuple = 2,    # Round brackets omitted. Requires trailing comma. 
 | ||
|     >>> print(also_tuple) 
 | ||
|     (2,) 
 | ||
|     >>> type(also_tuple) 
 | ||
|     <class 'tuple'> 
 | ||
| ```
 | ||
| 
 | ||
| 在歧义的情况下需要圆括号(如果元组是更大表达式的一部分):
 | ||
| 
 | ||
| > 请注意,它实际上是一个逗号,它产生一个元组,而不是括号。括号是可选的,除了空元组情况,或者需要它们以避免语法歧义。例如, `f(a, b, c)`是具有三个参数的函数调用,而`f((a, b, c))`是以3元组作为唯一参数的函数调用。
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> print(1,2,3,4,)          # Calls print with 4 arguments: 1, 2, 3, and 4 
 | ||
|     1 2 3 4 
 | ||
|     >>> print((1,2,3,4,))        # Calls print with 1 argument: (1, 2, 3, 4,) 
 | ||
|     (1, 2, 3, 4) 
 | ||
|     >>> 1, 2, 3 == (1, 2, 3)     # Equivalent to 1, 2, (3 == (1, 2, 3)) 
 | ||
|     (1, 2, False) 
 | ||
|     >>> (1, 2, 3) == (1, 2, 3)   # Use surrounding round brackets when ambiguous. 
 | ||
|     True 
 | ||
| ```
 | ||
| 
 | ||
| 一个`tuple`也可以与创建的`tuple`的构造函数:
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> empty_tuple = tuple() 
 | ||
|     >>> print(empty_tuple) 
 | ||
|     () 
 | ||
|     >>> tuple_from_list = tuple([1,2,3,4]) 
 | ||
|     >>> print(tuple_from_list) 
 | ||
|     (1, 2, 3, 4) 
 | ||
|     >>> tuple_from_string = tuple("Hello campers!") 
 | ||
|     >>> print(tuple_from_string) 
 | ||
|     ('H', 'e', 'l', 'l', 'o', ' ', 'c', 'a', 'm', 'p', 'e', 'r', 's', '!') 
 | ||
|     >>> a_tuple = 1, 2, 3 
 | ||
|     >>> b_tuple = tuple(a_tuple)    # If the constructor is called with a tuple for 
 | ||
|     the iterable, 
 | ||
|     >>> a_tuple is b_tuple          # the tuple argument is returned. 
 | ||
|     True 
 | ||
| ```
 | ||
| 
 | ||
| **访问`tuple`元素:**
 | ||
| 
 | ||
| 访问`tuples`元素并以与`lists`相同的方式编制索引。
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> my_tuple = 1, 2, 9, 16, 25 
 | ||
|     >>> print(my_tuple) 
 | ||
|     (1, 2, 9, 16, 25) 
 | ||
| ```
 | ||
| 
 | ||
| _零索引_
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> my_tuple[0] 
 | ||
|     1 
 | ||
|     >>> my_tuple[1] 
 | ||
|     2 
 | ||
|     >>> my_tuple[2] 
 | ||
|     9 
 | ||
| ```
 | ||
| 
 | ||
| _包裹索引_
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> my_tuple[-1] 
 | ||
|     25 
 | ||
|     >>> my_tuple[-2] 
 | ||
|     16 
 | ||
| ```
 | ||
| 
 | ||
| **包装和拆包:**
 | ||
| 
 | ||
| 声明`t = 12345, 54321, 'hello!'`是元组封装的一个例子:值`12345` , `54321`和`'hello!'`在元组中包装在一起。反向操作也是可能的:
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> x, y, z = t 
 | ||
| ```
 | ||
| 
 | ||
| 这足够恰当地称为序列解包,适用于右侧的任何序列。序列解包需要在等号左侧有尽可能多的变量,因为序列中有元素。请注意,多重赋值实际上只是元组打包和序列解包的组合。
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> t = 1, 2, 3    # Tuple packing. 
 | ||
|     >>> print(t) 
 | ||
|     (1, 2, 3) 
 | ||
|     >>> a, b, c = t    # Sequence unpacking. 
 | ||
|     >>> print(a) 
 | ||
|     1 
 | ||
|     >>> print(b) 
 | ||
|     2 
 | ||
|     >>> print(c) 
 | ||
|     3 
 | ||
|     >>> d, e, f = 4, 5, 6    # Multiple assignment combines packing and unpacking. 
 | ||
|     >>> print(d) 
 | ||
|     4 
 | ||
|     >>> print(e) 
 | ||
|     5 
 | ||
|     >>> print(f) 
 | ||
|     6 
 | ||
|     >>> a, b = 1, 2, 3       # Multiple assignment requires each variable (right) 
 | ||
|     have a matching element (left). 
 | ||
|     Traceback (most recent call last): 
 | ||
|       File "<stdin>", line 1, in <module> 
 | ||
|     ValueError: too many values to unpack (expected 2) 
 | ||
| ```
 | ||
| 
 | ||
| **一成不变的:**
 | ||
| 
 | ||
| `tuples`是不可变的容器,保证**其**对象它们含有不会改变。它并**不能**保证它们包含的对象不会改变:
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> a_list = [] 
 | ||
|     >>> a_tuple = (a_list,)    # A tuple (immutable) with a list (mutable) element. 
 | ||
|     >>> print(a_tuple) 
 | ||
|     ([],) 
 | ||
|  
 | ||
|     >>> a_list.append("Hello campers!") 
 | ||
|     >>> print(a_tuple)         # Element of the immutable is mutated. 
 | ||
|     (['Hello campers!'],) 
 | ||
| ```
 | ||
| 
 | ||
| **用途:**
 | ||
| 
 | ||
| 函数只能返回单个值,但是,异构`tuple`可用于从函数返回多个值。一个例子是内置的`enumerate`函数,它返回一个可迭代的异构`tuples` :
 | ||
| 
 | ||
| ```shell
 | ||
|     >>> greeting = ["Hello", "campers!"] 
 | ||
|     >>> enumerator = enumerate(greeting) 
 | ||
|     >>> enumerator.next() 
 | ||
|     >>> enumerator.__next__() 
 | ||
|     (0, 'Hello') 
 | ||
|     >>> enumerator.__next__() 
 | ||
|     (1, 'campers!') 
 | ||
| ```
 | ||
| 
 | ||
| ### 更多信息:
 | ||
| 
 | ||
| [Python文档 - 元组](https://docs.python.org/3/library/stdtypes.html#tuples) |