序列类型都用相同的访问模式:它的每一个元素都可以通过一个偏移量得到。包括了:字符串,列表和元组。
序列类型操作符
1.成员关系操作符(obj in seq,obj not in seq)
2.成员获取(seq[index])
3.切片(seq[begin:end])
4.序列重复(seq*expr)
5.连接序列(seq1+seq2)
序列类型转换函数
这些都是浅拷贝哦
list(iter)把迭代对象转换为列表
str(obj)把obj转换为字符串
unicode(obj)把对象转换成unicode字符串,默认编码
tuple(iter)把可迭代对象转换为一个元组
基本操作函数
enumerate(iter) 根据一个可迭代对象生产一个enumerate对象,该对象生成由iter每个元素的index值和item值组成的元组
len(seq) 返回seq的长度
max(iter,key=None) 返回序列中的最大值,可以根据key设置的排序方法(比较方法)
min(iter,key=None)返回序列中的最小值
reversed(seq) 返回一个序列的逆向迭代器
sorted(iter,func=None,key=None,reverse=False) 重排序列,参数与list.sort()参数含义一样
sum(seq,init=0)返回序列和init的总和,效果同reduce(operator.add,seq,init)
zip([it0,it1,it2...itn])返回一个列表,第一个元素是传入的序列的第一个元素组成的元组,如此类推
6.2字符串
字符串是不可变对象。字符串比较是比较ASCII值。
+操作符会在运行时连接字符串。而在源码中直接把若干个字符串编写到一起,则会在编译时连接字符串。
字符串格式化符号
%c 字符
%r 优先使用repr()进行字符串转换
%s 优先使用str()进行转换
%d/%i 有符号十进制
%u 无符号十进制
%o 无符号八进制
%x 无符号十六进制
%e 科学计数法
%f 浮点数字
%g %e和%f的简写
*python支持两种格式化输入,一种是元组,一种是字典,用字典输入时,key作为格式字符串出现,对于的val作为输入值。
栗子:'there are %(times)d times %(try)s' %{'times':3,'try' :'try' }
字符串方法
方法 描述
string.capitalize() 把字符串的第一个字符大写
string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串
string.count(str, beg=0, end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数
string.decode(encoding='UTF-8', errors='strict') 以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的异常
除非 errors 指定的是'ignore'或者'replace'
string.encode(encoding='UTF-8', errors='strict') 以 encoding 指定的编码格式编码 string
如果出错默认报一个ValueError的异常, 除非errors指定的是'ignore'或者'replace'
string.endswith(obj, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果 beg 或者 end 指定则检查指定的范围内是否以 obj 结束
如果是, 返回True,否则返回False.
string.expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格, 默认的空 格数 tabsize 是 8.
string.find(str, beg=0, end=len(string)) 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内
如果是返回开始的索引值,否则返回-1
string.index(str, beg=0, end=len(string)) 跟find()方法一样, 只不过如果str不在string中会报一个异常.
string.isalnum() R如果string至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False
string.isalpha() 如果string至少有一个字符并且所有字符都是字母则返回True,否则返回 False
string.isdecimal() 如果 string 只包含十进制数字则返回 True 否则返回 False.
string.isdigit() 如果 string 只包含数字则返回 True 否则返回 False.
string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写
则返回 True,否则返回 False
string.isnumeric() 如果 string 中只包含数字字符,则返回 True,否则返回 False
string.isspace() 如果 string 中只包含空格,则返回 True,否则返回 False.
string.istitle() 如果 string 是标题化的(见 title())则返回 True,否则返回 False
string.isupper() 如果 string 中包含至少一个区分大小写的字符, 并且所有这些(区分
大小写的)字符都是大写,则返回 True,否则返回 False
string.join(seq) Merges (concatenates)以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串
string.ljust(width) 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串
string.lower() 转换 string 中所有大写字符为小写.
string.lstrip() 截掉 string 左边的空格
string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把字符串string分成一个3元素的元组
(string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string.
string.replace(str1, str2, num=string.count(str1)) 把 string 中的 str1 替换成 str2,如果 num 指定, 则替换不超过 num 次.
string.rfind(str, beg=0,end=len(string)) 类似于 find()函数,不过是从右边开始查找.
string.rindex( str, beg=0,end=len(string)) 类似于 index(), 不过是从右边开始.
string.rjust(width) 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串
string.rpartition(str) 类似于 partition()函数,不过是从右边开始查找.
string.rstrip() 删除 string 字符串末尾的空格.
string.split(str="", num=string.count(str)) 以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串
string.splitlines(num=string.count('\n')) 按照行分隔, 返回一个包含各行作为元素的列表, 如果 num 指定则仅切片 num 个行.
string.startswith(obj, beg=0,end=len(string)) 检查字符串是否是以 obj 开头,是则返回 True,否则返回 False
如果beg 和 end 指定值,则在指定范围内检查.
string.strip([obj]) 在 string 上执行 lstrip()和 rstrip()
string.swapcase() 翻转 string 中的大小写
string.title() 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
string.translate(str, del="") 根据str给出的表(包含256个字符)转换string的字符,要过滤掉的字符放到 del 参数中
string.upper() 转换 string 中的小写字母为大写
string.zfill(width) 返回长度为 width 的字符串,原字符串 string 右对齐,前面填充0
6.11列表
列表对应其他语言中的数组,python的列表可以存储任何python支持的对象。
表 6.11 列表类型内建函数
list.append(obj) 向列表中添加一个对象 obj
list.count(obj) 返回一个对象 obj 在列表中出现的次数
list.extend(seq) 把序列 seq 的内容添加到列表中
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, reverse=False) 以指定的方式排序列表中的成员,如果 func 和 key 参数指定,则按照指定的方式比较各个元素,如果 reverse 标志被置为True,则列表以反序排列.
6.16元组
元组是不可变的,要改变元组,就必须创建一个新的元组对象。
在三个标准不可变类型里面--数字, 字符串和元组字符串--元组是受到影响最大的,一个数据类型是不可变的,简单来讲,就意味着一旦一个对象被定义了,它的值就不能再被更新,除非重新创建一个新的对象.对数字和字符串的影响不是很大,因为它们是标量类型,当它们代表的值改变时,这种结果是有意义的,是按照你所想要的方式进行访问的,而对于元组,事情就不是这样了。
不可变并不是坏事,比如我们把数据传给一个不了解的 API 时,可以确保我们的数据不会被修改。同样地,如果我们操作从一个函数返回的元组,可以通过内建 list()函数把它转换成一个列表.
不可变对象的值是不可改变的。这就意味着它们通过 hash 算法得到的值总是一个值。这是作为字典键值的一个必备条件。在下一章节里面我们会讨论到,键值必须是可哈希的对象,元组变量符合这个标准,而列表变量就不行。
6.20python的浅拷贝与深拷贝
序列类型对象的浅拷贝是默认类型拷贝,并可以以下几种方式实施:(1)完全切片操作[:],(2)利用工厂函数,比如 list(),dict()等,(3)使用 copy 模块的 copy 函数.
要得到一个完全拷贝或者说深拷贝--创建一个新的容器对象,包含原有对象元素(引用)全新拷贝的引用--需要 copy.deepcopy()函数.
有几点关于拷贝操作的警告。 第一,非容器类型(比如数字,字符串和其他"原子"类型的对象,像代码,类型和 xrange 对象等)没有深拷贝一说,浅拷贝是用完全切片操作来完成的.第二,如果元组变量只包含原子类型对象,对它的深拷贝将不会进行.
浙公网安备 33010602011771号