#!/usr/bin/env python # coding: utf-8 # # 元组 # ## 基本操作 # 与列表类似,元组是一个有序序列,但是不可变。 # # 元组用小括号`()`生成: # In[1]: t = (10, 11, 12, 13, 14) # In[2]: t # 可以索引,切片: # In[3]: t[0] # In[4]: t[1:3] # 元组是不可变的,不能通过赋值改变: # In[5]: t[0] = 1 # ## 单元素的元组生成 # # 由于()在表达式中被应用,只含有单个元素的元组容易和表达式混淆,所以采用下列方式定义只有一个元素的元组: # In[6]: a = (10) # In[7]: a # In[8]: type(a) # In[9]: a = (10,) # In[10]: a # In[11]: type(a) # ## 列表与元组的转换 # # 用构造方法`list`和`tuple`可以相互转换: # In[12]: a = [10, 11, 12, 13, 14] # In[13]: tuple(a) # In[14]: a = (10, 11, 12, 13, 14) # In[15]: list(a) # ## 元组方法 # # 由于元组是不可变的,所以只能有一些不可变自身的方法,例如计算元素个数`.count()`方法和元素位置`.index()`方法,用法与列表一样: # In[16]: a = (10, 11, 12, 13, 14) # In[17]: a.count(10) # In[18]: a.index(12) # ## 列表与元组的速度比较 # # IPython 中用 `magic` 命令 `%timeit` 来计时。 # # 比较列表与元组的生成速度: # In[19]: get_ipython().run_line_magic('timeit', '-n 100000 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25]') # In[20]: get_ipython().run_line_magic('timeit', '-n 100000 (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25)') # 在遍历上,元组和列表的速度表现差不多。 # # 产生内容相同的随机列表和元组: # In[21]: from numpy.random import rand values = rand(10000,4) lst = [list(row) for row in values] tup = tuple(tuple(row) for row in values) # In[22]: get_ipython().run_line_magic('timeit', '-n 100 for row in lst: tuple(row)') # In[23]: get_ipython().run_line_magic('timeit', '-n 100 for row in tup: tuple(row)') # 比较遍历和索引速度: # In[24]: get_ipython().run_line_magic('timeit', '-n 100 for row in lst: a = row[0] + 1') # In[25]: get_ipython().run_line_magic('timeit', 'for row in tup: a = row[0] + 1') # 总结:元组的生成速度会比列表快很多,迭代速度快一点,索引速度差不多。 # ## 元组与多变量赋值 # # Python支持多变量赋值的模式: # In[26]: a, b = 1, 2 # In[27]: a # In[28]: b # Python中的多变量赋值,本质是两个元组中的元素进行一一对应,此时,等号两边的元素数目必须相等。例如,将包含两个元素的元组t的值分别赋给a和b: # In[29]: t = (1, 2) # In[30]: a, b = t # In[31]: a # 利用多变量赋值,变量的交换可以用一行代码实现: # In[32]: a, b = b, a # In[33]: a # 多变量赋值支持超过两个值的操作,只要等号两边的元素数相同: # In[34]: a, b, c = 1, 2, 3 # 嵌套: # In[35]: a, (b, c) = 1, (2, 3) # 带星号的赋值,将后面的值都变成一个列表给某个变量赋值: # In[36]: a, *b = 1, 2, 3 # In[37]: b # In[38]: a # In[ ]: