python序列类型:str、bytes、 bytearray、 list、 tuple、 range

python中,序列类型有str、bytes、 bytearray、 list、 tuple、 range。所谓序列,说明是有序的,可以通过索引做一些特定的操作。首先先了解序列对象中比较重要的两个:str 和 list,然后探讨下序列对象的共有操作。

字符串:str

Python中的文本数据由str对象或字符串处理。 字符串是Unicode编码(从python3开始)的不可变序列。可以通过把字符序列通过单引号、双引号、三引号来创建字符串。例如:

# Python 3.5.3 >>> test = "Hello\tworld!"
>>> print(test)
Hello    world!
>>> test
'Hello\tworld!'
#字符串中可以包含任何unicode编码中包含的字符。'\t'是转义字符,在打印输出中显示为多个空格(具体几个由操作环境决定)
# 在交互模式下直接输变量名,显示更能体现字符串在python中的存储方式
>>> d = r'c:\windows\sys\table' >>> d 'c:\\windows\\sys\\table'
# 'r'前缀,'raw'的缩写,会使大部分的转义失效
>>> sql = """select * from user where name='tom' """ >>> sql "select * from user where name='tom' "
# 可以在三引号中方便的使用单双引号
# 使用三引号可以方便的横跨多行,任何空白字符都会被包含到字符串中。

字符串是可迭代的。

列表:list

列表是可变的序列,通常用于存储同类数据的集合,不过一个列表中可以存储任意不同类型的数据。

列表可以通过不同的方式创建:

  • 使用一对方括号来表示空列表:[]
  • 使用一对方括号,括号中的元素用逗号隔开: [a, b, c]
  • 使用列表解析式:[x for in iterable]
  • 使用列表的类型构造函数:list() 或 list(iterable)

构造函数创建一个列表,其元素和作为参数的可迭代对象完全相同,元素的顺序也相同。可迭代对象可以是序列、支持迭代的容器或者一个可迭代对象。如果可迭代对象是一个列表,返回一个该列表的拷贝,功能类似于iterable[:]。如果没有参数,构造函数创建一个新的空列表,[]。

>>> lst = [1,2,3]
>>> cp = list(lst)
>>> cp
[1, 2, 3]
>>> lst is cp
False

 

 

以下内容翻译自 file:///Library/Frameworks/Python.framework/Versions/3.5/Resources/English.lproj/Documentation/library/stdtypes.html#sequence-types-list-tuple-range

公共的序列操作

下面表中列出的操作适用于所有的序列类型,不论是可变序列还是不可变序列。

表中的操作是按优先级升序排列的。在表中,s和t是同一种序列类型,n,j,i,k表示整数,x是一个满足s所施加的任何类型和值限制任意对象。作为比较操作,in 和 not in 具有相同的优先级。

 

OperationResultNotes
in s True如果序列s中的某个元素等于x, 否则False (1)
not in s False 如果序列s中的某个元素等于x, 否则True (1)
t s 和 t 串联,返回一个新的序列
(6)(7)
n or s 相当于将s自身相加n次 (2)(7)
s[i] 序列s的第i个元素,索引从0开始 (3)
s[i:j] s的第i到j个元素,包含第i个元素,不包含第j个元素 (3)(4)
s[i:j:k] 分片操作,每隔k个元素取s的第i到j个元素的一个元素 (3)(5)
len(s) s序列的长度  
min(s) 序列s中最小的元素  
max(s) 序列s中最大的元素  
s.index(x[, i[, j]]) 在s中出现的第一个x元素的索引  (i及i索引之后,j索引之前) (8)
s.count(x) x在s中出现的总次数  

 

相同的列表类型支持比较。实际上,元组和列表通过比较对应索引位置的元素进行。也就是说,如果两个列表或者元组对象相等,那么它们的长度需要相同并且每一个元素必须相等。

注释:

  1. in 和 not in操作一般只用于普通的包含测试, 一些特殊的序列,例如str、bytes、bytearray也将它们用于子序列测试:

    >>> "gg" in "eggs"
    True
  2. 小于0的值当作0对待 (产生一个和s序列类型相同的空序列)。需要注意的是序列s中的元素没有被拷贝,它们只是被引用多次。 

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]

     [[]]是一个包含了一个空列表的元素的列表,所以通过 [[]] 3 产生的三个元素都引用同一个空列表。所以修改列表中的任意一个元素其实修改的是同一个列表。可以通过下面的方式创建一个包含不同列表元素的列表:

    >>> lists = [[] for i in range(3)]
    >>> lists[0].append(3)
    >>> lists[1].append(5)
    >>> lists[2].append(7)
    >>> lists
    [[3], [5], [7]]
  3. 如果i或j是负的,那么索引是相对于列表s末尾的,被替换为:len(s) i 或 len(s) j。但是-0还是0.
  4. 从i到j的分片操作定义一个新的带有索引k的项的序列,<= j。如果i或者j大于len(s), 使用 len(s)。如果i被省略,使用0。如果j被省略,使用len(s)。如果i大于等于j,那么返回的片段是空的。

(未完待续)

posted @ 2017-10-09 10:16  Wadirum  阅读(8412)  评论(0编辑  收藏  举报