一、元组的创建
1、用都好分割,切记()不是必须
2、用tuple()创建。内接字符串、列表、元组,将会创建一个包含序列内元素的元组。但是要是接一个字典的话,那么tuple只认识字典的键,这一点切记。
二、元组其实和列表很像,都是用整数值作为索引,但是最大的不同之处,便是元组是不可变的,而列表是可变的。
三、元组的赋值
与传统需要中间变量不同,元组赋值一气呵成:
a,b = b,a
这样便能改变两者的值
四、元组作为返回值
理论上返回值只能有一个,但是元组介入的话,那就不仅仅只有一个了。
五、可变长度参数元组
比如一个函数的形参不是固定的个数的话,就可以使用元组的形式。函数可以接受可变数量的参数。 以 “*” 开头的形参将输入的参数 汇集 到一个元组中。
def printall(*args):
print(args)
相当于args是一个元组,当然你可以随意命名元组的名字,但是一般用args。
这里的定义为 汇集,当然还有拆分。
比如divmod这个函数,接受两个变量,返回值为这两个书的商和余数。(你可以依次赋值给两个变量,或者仅仅赋值给一个变量,此时这个变量为一个元组)
>>> t = (7, 3)
>>> divmod(t)
TypeError: divmod expected 2 arguments, got 1
此时怎么办,还是用到*这个玩意儿。
>>> divmod(*t)
(2, 1)
总结五,只有元组才有可变参数长度的功能吧。此时无论是汇集还是拆分都得用到*呢,切记。
典型的可变参数长度的函数有 max() min(),但是sum()不是。你试试便知。
六、列表和元组
zip
是一个内建函数,可以接受将两个或多个序列组,并返回一个元组列表, 其中每个元组包含了各个序列中相对位置的一个元素。如果各个序列长度不一,以最短的为准。且这个zip对象是一个可迭代的对象。
说到这里,其实迭代器和列表也是很像,只不过你不能通过整数值去访问迭代对象的值。
所以按照常理来说,迭代器转化为列表也很容易
list(zip(list1,tuple2))
最精彩的来了:
对于元组列表,你可以使用元组赋值来循环
t = [('a', 0), ('b', 1), ('c', 2)]
for letter, number in t:
print(number, letter)
如果将 zip
、for
循环和元组赋值结合起来使用,你会得到一个可以同时遍历两个(甚至多个)序列的惯用法。 例如,has_match
接受两个序列 t1
和 t2
, 如果存在索引 i
让 t1[i] == t2[i]
,则返回 True
:
def has_match(t1, t2):
for x, y in zip(t1, t2):
if x == y:
return True
return False
如果需要遍历一个序列的元素以及其索引号,您可以使用内建函数 enumerate
:
for index, element in enumerate('abc'):
print(index, element)
enumerate
的返回结果是一个枚举对象(enumerate object),可迭代一个包含若干个对的序列; 每个对包含了(从0开始计数)的索引和给定序列中的对应元素。 在这个例子中,输出结果是:
0 a
1 b
2 c
和前一个示例的结果一样。
七、字典和元组
关键方法为items。它是字典的一个方法,返回多个元组组成的序列,其中每个元组的元素为一个键值对。和上面的zip后类似,它也是一个迭代器,可以利用元组来进行赋值。
>>> for key, value in d.items():
... print(key, value)
...
c 2
a 0
b 1
下面一句话,将列表、字典和元组结合起来使用:
你可以讲元组列表很容易变成字典。
>>> t = [('a', 0), ('c', 2), ('b', 1)]
>>> d = dict(t)
>>> d
{'a': 0, 'c': 2, 'b': 1}
所以用zip和dict很容易便会生成一个字典
>>> d = dict(zip('abc', range(3)))
>>> d
{'a': 0, 'c': 2, 'b': 1}
在字典中使用元组作为键(主要因为无法使用列表)的做法很常见。 例如,一个电话簿可能会基于用户的姓-名对,来映射至号码。 假设我们已经定义了 last
、 first
和 number
三个变量, 我们可以这样实现映射:
directory[last, first] = number
方括号中的表达式是一个元组。我们可以通过元组赋值来遍历这个字典:
for last, first in directory:
print(first, last, directory[last,first])