【附注信息  ----> 关注公众号:CS阿吉,大家一起分享更多的技术文章,聊天技术问题。】

 

数据类型:sequence (序列)

1. sequence(序列)是一组有顺序的元素的集合

(严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素)

序列可以包含一个或多个元素,也可以是一个没有任何元素的空序列

元素可以是我们之前所说的基本数据类型,可以是另一个序列,还可以是我们以后介绍的其他对象。

序列有两种:tuple(定值表; 也有翻译为元组) 和 list (表)

>>>s1 = (2, 1.3, 'love', 5.6, 9, 12, False)

>>>s2 = [True, 5, 'smile']# s2是一个list

>>>print s1,type(s1)

>>>print s2,type(s2)

tuple和list的主要区别在于,一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更。

一个序列作为另一个序列的元素

>>>s3 = [1,[3,4,5]]

空序列

>>>s4 = []

 

2. 序列元素的引用:

序列元素的下标从0开始:

>>>print s1[0]

>>>print s2[2]

>>>print s3[1][2]

由于list的元素可变更,你可以对list的某个元素赋值:

>>>s2[1] = 3.0

>>>print s2

如果你对tuple做这样的操作,会得到错误提示。

所以,可以看到,序列的引用通过s[<int>]实现, int为下标

3)其他的引用方式:

范围引用: 基本样式[下限:上限:步长]

>>>print s1[:5]

>>>print s1[2:]# 从下标2到最后

>>>print s1[0:5:2]# 从下标0到下标4 (下标5不包括在内),每隔2取一个元素 (下标为0,2,4的元素)

>>>print s1[2:0:-1]# 从下标2到下标1

从上面可以看到,在范围引用的时候,如果写明上限,那么这个上限本身不包括在内。

尾部元素引用

>>>print s1[-1]# 序列最后一个元素

>>>print s1[-3]# 序列倒数第三个元素

同样,如果s1[0:-1], 那么最后一个元素不会被引用 (再一次,不包括上限元素本身)

4) 字符串是一种tuple

因此也就可以做tuple可以进行的操作

>>>str = 'abcdef'

>>>print str[2:4]

 

总结:

tuple元素不可变,list元素可变

序列的引用 s[2], s[1:8:2]

字符串是一种tuple

 

来测试一下python中的序列

 


[python]  ​​view plain​​​  ​​​copy​

 



 



  1. seq='hello world!'#这是一个tuple
  2. seq1=[1,1.3,True,'hello',[1,1.2,True,'xxx']]#list嵌套
  3. seq2=(1,1.3,True,'hello',[1,1.2,True,'xxx'])#tuple中嵌套list
  4. seq3=[1,1.3,True,'hello',(1,1.2,True,'xxx')]#list中嵌套tuple
  5. seq4=(1,1.3,True,'hello',(1,1.2,True,'xxx'))#tuple嵌套


1.python中的序列中竟然可以含有不同类型的元素,c++中的数组、vector、list、deque、set、map的容器都做不到这一点。

 

2.python中的序列可以方便的取值

 


[python]  ​​view plain​​​  ​​​copy​

 



 



  1. ##有关取值操作符

  2. print("seq[2]=%s\nseq1[4]=%s\nseq2[4]=%s\nseq3[4]=%s\n"%(seq[2],seq1[4],seq2[4],seq3[4]))
  3. ##seq[m,n]输出的只有m到n-1。相当于是个半开半闭区间

  4. print("seq[2:4]=%s\nseq1[2:4]=%s\nseq2[2:4]=%s\nseq3[2:4]=%s\n"%(seq[2:4],seq1[2:4],seq2[2:4],seq3[2:4]))


输出:

 

>>> ================================ RESTART ================================
>>> 
seq[2]=l
seq1[4]=[1, 1.2, True, 'xxx']
seq2[4]=[1, 1.2, True, 'xxx']
seq3[4]=(1, 1.2, True, 'xxx')


seq[2:4]=ll
seq1[2:4]=[True, 'hello']
seq2[2:4]=(True, 'hello')
seq3[2:4]=[True, 'hello']

 

3.tuple和list的主要区别在于,一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更。

 


[python]  ​​view plain​​​  ​​​copy​

 



 



  1. #seq算是一个tuple。如果要修改里面的元素值,例如seq[2]='x'

  2. '''''
  3. 很悲惨的出现下面的错误
  4. Traceback (most recent call last):
  5. File "J:\pythonexercise\seq.py", line 15, in <module>
  6. seq[2]='x'
  7. TypeError: 'str' object does not support item assignment

  8. '''
  9. #seq1算是一个list。元素是可以修改的
  10. seq1[0]='I can change the cell in list'
  11. seq1[4]='change list to string'

  12. printseq1

  13. 输出为
  14. ['I can change the cell in list', 1.3, True, 'hello', 'change list to string']

  15. #seq2是一个tuple,所以它不能被修改
  16. #seq2[0]='I can change the cell in list'
  17. '''''
  18. 很悲惨的出现下面的错误
  19. Traceback (most recent call last):
  20. File "J:\pythonexercise\seq.py", line 33, in <module>
  21. seq2[0]='I can change the cell in list'
  22. TypeError: 'tuple' object does not support item assignment
  23. '''
  24. ##但是下面这句话竟然执行成功了。seq2[4]是一个list。所以seq2[4]中的元素可以被修改。
  25. ##这就比较蛋疼了,tuple不能被修改,但是tuple中嵌套的list可以被修改。⊙﹏⊙b汗!
  26. seq2[4][2]='change list to string'
  27. printseq2


4.tuple也不是那么不可变

>>> t1=(1,'zzzz')
>>> t2=[1,'zzzaaa']
>>> t1=t1+(1.23,True,[0,1])
>>> t1
(1, 'zzzz', 1.23, True, [0, 1])
>>> t1=t1+t2


Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    t1=t1+t2
TypeError: can only concatenate tuple (not "list") to tuple
>>> t2=t2+[1.23,True,[0,1]]
>>> t2
[1, 'zzzaaa', 1.23, True, [0, 1]]
>>> 

可以看到,list和tuple不能连接。tuple在连接操作后值变化了

>>> t1=(1,'zzzz')
>>> t1=t1*2
>>> t1
(1, 'zzzz', 1, 'zzzz')

对于*重复操作符也可以修改tuple的值。