序列包括 字符串,列表和元组类型
序列从0开始计数,最后一个元素的偏移量是N-1
N = len(sequence)
但也可以从后向前偏移,最后一个元素的偏移量为-1,最开始的元素为-N
正序偏移从0开始,倒序偏移从-1开始
0 <= index <= len(sequence) - 1
-len(sequence) <= index <= -1
标准类型操作符一般都能适用于所有的序列类型。但如果是做复合类型的对象比较时,对象值比较符可能会不一样,但其他对象身份比较和逻辑操作符都是适用的。
序列的比较操作要分开字符串,列表,元组讨论,它们的表现不一样。
序列操作符 | 作用 |
---|---|
seq[ind] | 获得下标为ind的元素 |
seq[ind1:ind2] | 获得下标从ind1到ind2之间的元素,不包括ind2 |
seq * expr | 序列重复 expr 次 |
seq1 + seq2 | 连接序列 seq1和 seq2 |
obj in seq | 判断obj元素是否包含在seq中 |
obj not in seq | 判断obj元素是否不包含在seq中 |
序列类型操作符
序列操作符 | 作用 |
---|---|
seq[ind] | 获得下标为ind的元素 |
seq[ind1:ind2] | 获得下标从ind1到ind2之间的元素,不包括ind2 |
seq * expr | 序列重复 expr 次 |
seq1 + seq2 | 连接序列 seq1和 seq2 |
obj in seq | 判断obj元素是否包含在seq中 |
obj not in seq | 判断obj元素是否不包含在seq中 |
连接操作符(+)虽然能把两个序列合并,但它的效率不是最高的,更推荐用join或者extend
切片操作符 seq[ind1:ind2] 可以获取 [ind1,ind2)的元素,即包括起始元素但不包括结束索引对应的元素。切片操作符中的索引允许为空或者None,即seq[:],seq[None:None],空或者None表示序列的最开始处或者最末尾处。另外切片操作符的索引可以超出序列的长度,包括开始和结束索引。
函数 | 含义 |
---|---|
list(iter) | 把可迭代对象转为列表 |
str(obj) | 把obj对象转为字符串(对象的字符串表示法 |
unicode(obj) | 把对象转为unicode字符串(使用默认编码) |
tuple(obj) | 把可迭代对象转为元组 |
序列类型转换工厂函数(内建)
函数 | 含义 |
---|---|
list(iter) | 把可迭代对象转为列表 |
str(obj) | 把obj对象转为字符串(对象的字符串表示法 |
unicode(obj) | 把对象转为unicode字符串(使用默认编码) |
tuple(obj) | 把可迭代对象转为元组 |
把一个对象传给list()函数,只会创建这个对象的一个浅拷贝,然后将其插入到新生成的列表中。对于列表来说,连接(+)和重复(*)操作都是如此。
浅拷贝,深拷贝的概念只有可变类型有,对于标量来说没有浅拷贝之说。浅拷贝在后续再详细说明。
函数名 | 功能 |
---|---|
enumerate(iter) | 接受一个可迭代对象作为参数,返回一个enumerate对象(也是个迭代器),该对象生成由iter每个元素的index值和item值组成的元组 |
len(seq) | 返回seq的长度 |
max(iter,key=None) or max(arg0, arg1... key=None) | 返回iter或者(arg0, arg1...)中的最大值,如果指定key,这个key必须是一个可以传递给sort()方法的,用于比较的函数 |
min(iter, key=None) or min(arg0, arg1... key=None) | 返回iter或者(arg0,arg1...)中的最小值;如果指定了Key,这个key必须是一个可以传递给sort()函数的,用于比较的函数 |
reversed(seq) | 接受一个序列作为参数,返回一个以逆序访问的迭代器 |
sorted(iter, func=None, key=None, reverse=False) | 接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func、key和reverse的含义跟list.sort()内建函数的参数一样 |
sun(seq,init=0) | 返回seq和可选参数init的总和,其效果等同于reduce(operator.add, seq, init) |
zip([it0, it1,...itN]) | 返回一个列表,其第一个元素是it0, it1...这些元素的第一个元素组成的一个元组,第二个...以此类推 |
序列类型可用的内建函数
函数名 | 功能 |
---|---|
enumerate(iter) | 接受一个可迭代对象作为参数,返回一个enumerate对象(也是个迭代器),该对象生成由iter每个元素的index值和item值组成的元组 |
len(seq) | 返回seq的长度 |
max(iter,key=None) or max(arg0, arg1... key=None) | 返回iter或者(arg0, arg1...)中的最大值,如果指定key,这个key必须是一个可以传递给sort()方法的,用于比较的函数 |
min(iter, key=None) or min(arg0, arg1... key=None) | 返回iter或者(arg0,arg1...)中的最小值;如果指定了Key,这个key必须是一个可以传递给sort()函数的,用于比较的函数 |
reversed(seq) | 接受一个序列作为参数,返回一个以逆序访问的迭代器 |
sorted(iter, func=None, key=None, reverse=False) | 接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func、key和reverse的含义跟list.sort()内建函数的参数一样 |
sun(seq,init=0) | 返回seq和可选参数init的总和,其效果等同于reduce(operator.add, seq, init) |
zip([it0, it1,...itN]) | 返回一个列表,其第一个元素是it0, it1...这些元素的第一个元素组成的一个元组,第二个...以此类推 |
>>> zip([1,2,3], [4,5,6])
[(1,4), (2,5), (3,6)]
>>> zip([1,2,3], [4,5])
[(1,4), (2,5)]
字符串连接除了连接操作符(+)和 join()函数之外,还有一种方式
>>> foo = 'hello' "world"
>>> foo
'helloworld'
类似这样,中间可以有多个空格,两个子字符串的引号也可以不一样。常用于这样的场景
>>> f = urllib.urlopen('http://' # protocal
... 'loclhost' # hostname
... ':8000: # port
... '/cgi-in/friends2.py') # file
可以把一个长字符串分成几个部分来写,而不用加反斜杠。
另外这种写法的好处是,可以把注释也加进来。
格式化字符 | 转换方式 |
---|---|
%c | 转换成字符(ASCII码值,或者长度为一的字符串) |
%r | 优先使用repr()函数进行字符串转换 |
%s | 优先用str()函数进行字符串转换 |
%d or %i | 转成有符号十进制数 |
%u | 转成无符号十进制数 |
%o | 转成无符号八进制数 |
%x or %X | 转成无符号十六进制数(x/X代表转换后的十六进制字符的大小写) |
%e or %E | 转成科学计数法 (e/E控制输出e/E) |
%f or %F | 转成浮点型(小数部分自然截断) |
%g or %G | %e和%f %E和%F的简写 |
%% | 输出% |
字符串格式化操作符
格式化字符 | 转换方式 |
---|---|
%c | 转换成字符(ASCII码值,或者长度为一的字符串) |
%r | 优先使用repr()函数进行字符串转换 |
%s | 优先用str()函数进行字符串转换 |
%d or %i | 转成有符号十进制数 |
%u | 转成无符号十进制数 |
%o | 转成无符号八进制数 |
%x or %X | 转成无符号十六进制数(x/X代表转换后的十六进制字符的大小写) |
%e or %E | 转成科学计数法 (e/E控制输出e/E) |
%f or %F | 转成浮点型(小数部分自然截断) |
%g or %G | %e和%f %E和%F的简写 |
%% | 输出% |
>>> print "%e %f %g" % (3.01, 3.01, 3.01)
3.010000e+00 3.010000 3.01
>>> print "%e %f %g" % (3.0, 3.0, 3.0)
3.000000e+00 3.000000 3
符号 | 作用 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用作左对齐 |
+ | 在正数前面显示加号(+) |
(空格) | 在正数前面显示空格 |
# | 在八进制数前面显示零('0'),在十六进制数前面显示'0x'或者'0X'(取决于用的是'x'还是'X') |
0 | 显示的数字前面填充'0',而不是默认的空格 |
% | '%%'输出一个单一的'%' |
(var) | 映射变量(字典参数) |
m.n | m是显示的最小总宽度,n是小数点后的位数(如果可用的话) |
格式化操作符辅助指令
符号 | 作用 |
---|---|
* | 定义宽度或者小数点精度 |
- | 用作左对齐 |
+ | 在正数前面显示加号(+) |
(空格) | 在正数前面显示空格 |
# | 在八进制数前面显示零('0'),在十六进制数前面显示'0x'或者'0X'(取决于用的是'x'还是'X') |
0 | 显示的数字前面填充'0',而不是默认的空格 |
% | '%%'输出一个单一的'%' |
(var) | 映射变量(字典参数) |
m.n | m是显示的最小总宽度,n是小数点后的位数(如果可用的话) |
>>> print "There are %(howmany)d %(lang)s Quotation Symbols" %
... {'lang': 'Python', 'howmany': 3}
There are 3 Python Quotation Symbols
这种用法比较特殊
原始字符串操作符(r/R)
在字符串前面加上r/R就得到一个所谓的原始字符串,这字符串里的特殊字符,转义字符都不会起作用。常见于正则表达式
Unicode字符串操作符(u/U)
在普通字符串或者是包含Unicode字符的字符串的最前面加上u/U,就会把字符串完全转为Unicode字符串
Unicode字符串操作符可以和原始字符串操作符一起使用,但注意一起使用的时候,Unicode字符串操作符必须在原始字符串操作符前面,比如:
ur'hello\nworld'
字符串内建函数太多,参考P122
列表能保留任意数量的Python对象,并且可以是任何Python对象;同一个列表保存的对象类型可以不一致。
list.extend()方法比连接操作符的一个优点是它实际上是把新列表添加到了原有的列表里,而不是像连接操作符那样新建一个列表。类似复合操作符 +=
列表和元组的内建函数 cmp() 的比较逻辑
- 对两个列表的元素进行比较
- 如果比较的元素是同类型的,则比较其值,返回结果
- 如果两个元素不是同一个类型的,则检查它们是否是数字
a. 如果是数字,执行必要的数字强制类型转换,然后比较
b. 如果有一方的元素是数字,则另一方的元素“大”(数字是“最小的”)
c. 否则,通过类型名字的字母顺序进行比较 - 如果有一个列表首先到达末尾,则另一个长一点的列表“大”
- 如果我们用尽了两个列表的元素而且所有元素都相等,那么结局就是个平局,就是说返回一个0
列表函数 | 作用 |
---|---|
list.append(obj) | 向列表中添加一个对象obj |
list.count(obj) | 返回一个对象obj在列表中的出现的次数 |
list.extend(iter) | 把可迭代对象iter的内容添加到列表中 |
list.index(obj, i=0, j=len(list)) | 返回list[k] == obj的k值,并且k的范围在i <= k < j;否则引发ValueError异常 |
list.insert(index, obj) | 在索引为index的位置插入对象obj |
list.pop(index=-1) | 删除并返回指定位置的对象,默认是最后一个对象 |
list.remove(obj) | 从列表中删除对象obj |
list.reverse() | 翻转列表顺序 |
list.sort(func=None, key=None, revers=False) | 以指定的方式排序列表中的成员,如果func和key参数指定,则按照指定的方式比较各个元素,如果reverse标准被设为True,则列表以反序排列 |
列表类型的内建函数
列表函数 | 作用 |
---|---|
list.append(obj) | 向列表中添加一个对象obj |
list.count(obj) | 返回一个对象obj在列表中的出现的次数 |
list.extend(iter) | 把可迭代对象iter的内容添加到列表中 |
list.index(obj, i=0, j=len(list)) | 返回list[k] == obj的k值,并且k的范围在i <= k < j;否则引发ValueError异常 |
list.insert(index, obj) | 在索引为index的位置插入对象obj |
list.pop(index=-1) | 删除并返回指定位置的对象,默认是最后一个对象 |
list.remove(obj) | 从列表中删除对象obj |
list.reverse() | 翻转列表顺序 |
list.sort(func=None, key=None, revers=False) | 以指定的方式排序列表中的成员,如果func和key参数指定,则按照指定的方式比较各个元素,如果reverse标准被设为True,则列表以反序排列 |
所有的多对象的,逗号分隔的,没有明确用符号定义的(比如方括号表示列表和用圆括号表示元组),这些集合默认的类型都是元组
只有单个元素的元组的表示方法('xyz',) ,必须带上逗号,不然会被认作是str类型
序列类型可以通过以下几种方式获得一个浅拷贝:
- 完全切片操作[:]
- 利用工厂函数,比如list(), dict()等
- 使用copy模块的copy函数
- 连接操作符(+)和重复操作符(*)
用copy模块的deepcopy()函数进行深拷贝
对于非容器类型(比如数字,字符串和其他“原子”类型的对象,像代码,类型和xragne对象等)没有浅拷贝一说。
对于只包含原子类型对象的元组,对它的深拷贝也只能得到一个浅拷贝。因为只包含原子类型的元组就相当于不可变的原子类型,浅拷贝也无法改变它的值。
网友评论