第6章序列:字符串、列表和元组
序列:多个元素可通过切片得到
成员关系操作符: in not in
连接操作符: + ,用extend()进行两个列表连接
重复操作符: * ,sequence ( copies_int
返回包含原对象拷贝的对象
切片操作符: [],[:] , [: :]
6.1.3内建函数
转换实际上是执行工厂函数
Unicode(obj):将对象转换成unicode(默认编码)
把列表对象传递给list():会创建对象的浅拷贝
浅拷贝:只拷贝对象的索引,不建立对象
Operational:
min(iter , key=None) or
min(arg0 , arg1, …key = None)
sorted(iter , func=None , key=None,reverse=False)
sum(seq , init=0):返回seq和init的综合
zip([it0 , it1, ... , itN]): 返回一个列表,其元素是it0,it1,…这些元素的第一个
元素组成的一个元组,第二个,…类推
6.2字符串
单引号字符串不解析,双引号解析转移字符
字符串是不可变类型
删除字符串:赋值为空串,或del语句来删除
del string
string = ‘’
6.3 字符串和操作符
切片:[start ,end],end取不到
反向索引:从-1开始,最后一个索引为-len
in,not in:用于判断一个字符串是否出现在另一个字符串中
不推荐用字符串加法,建议使用字符串格式化打印,或者用join
unicode字符串与普通字符串做连接会将普通字符串转化为Unicode字符串
重复操作符(*)
# *是重复操作符
def repeat_test():
string = 'a'
string3 = string * 3
print(string3)
6.4只适用于字符串的操作符
格式化操作符%
%c :转换成字符
%r: 优先用repr()函数进行字符串转换
%u :无符号十进制数
%o: 无符号八进制数
%e: 科学计数法
m.n : m最小总宽度,n小数点后位数
-:左对齐
新式字符串Template对象,
from string import Template
# 字符串模板使用${}来明确要替换的变量,然后将模板中的substitue进行字符串替换
def stringTemplate():
string = Template('${name} is ${age}!')
result = string.substitute(name='DongFei', age=30)
print(result)
6.4.3原始字符串操作符(r/R)
原始字符串目的:所有字符按照其字面意义
r’string’
例如: r’\n’表示反斜杠加上n,而不是转义后的换行符
def rawString_test():
string= r'\n'
print(string)
6.4.4Unicode字符串操作符(u/U)
unicode用于将标砖字符串转换成完全地Unicode字符串对象
u‘abc’
内建函数:
max():返回序列或字符串中最大的字符
min(): 小
6.5.3自复查un类型函数
str():工厂函数,产生对对应类型的对象
Unicode():
chr():返回整数对应的字符
unichr():返回的是unicode字符 chr(65) = ‘A’
ord():返回字符对应的整数,chr(‘a’) =97
6.6字符串内建函数
string.count(str , beg=0,end=len(string)):返回str在string中出现次数
string.decode(encoding=’UTF-8’ , errors=’strict’):以指定编码格式转换string
string.find(str , beg=0,end=len(string)):检测str是否在string中,找不到返回-1
string.join(seq):以string作为分隔符,将seq所有元素拼接
string.replace(str1 , str2 ,num=string.count(str1)):替换次数不超过num次
string.rfind(str , beg = 0 ,end=len(string)):类似于find()函数,从右边查找
string,split(str=”” ,num=string.count(str)):以str作为分隔符切片,仅分隔num个字符串
三引号
允许字符串跨行
def threeQuote_test():
hi = '''abc
def
hij'''
print(hi)
6.7.2字符串不变性
字符串的值不能改变
ASCII:标准信息交换码
BOM:字节顺序标记
UTF:Unicode的转换格式Unicodetransform format
UTF-8:八位UTF转换格式,无符号字节序列,长度为1到四个字节
Ascii:找到每个字节对应数值转换为字符显示,8个字符
Unicode:使用1或多个字节来表示字符
默认字符串编码用ASCII,在字符串前面加’u’
表示Unicode自复查un
str(),chr()处理ASCII字符串,即0~255范围
Unicode(),unichr()将类型转换为unicode自复查un
codecs
coder/decoder组合,定义文本跟二进制值的转换方式
编码解释:encode()来把unicode内容转换为指定编码格式内容
unicode字符串到磁盘需要用指定编码器编码
教训:数据库应用要考虑支持Unicode
6.9相关模块
string:字符串
re:正则表达式
struct:字符串二进制转换
c/StringIO:字符串IO对象
base64: Base编码
codecs:解码器注册
crypt:单方面加密
difflib:找出序列间的不同
hashlib:安全哈希算法
md5:RSA的MD5信息摘要鉴权
6.10字符串关键点总结
原始字符串不转义
三引号可以换行
6.11列表
删除元素:
删除指定下标元素用del : del nums[1]
remove用于删除某个值,且只能删除一个:nums.remove(123)
删除列表用del, del nums
列表比较是用cmp。对两个列表对应位置元素逐个比较
序列类型操作符
切片( [] 和[:] )
连接操作符(+) :可以把多个列表对象合并在一起
重复操作符(*)
对列表内容复制
nums * 3,表示会对nums内容复制3份
# 重复操作符(*) 会复制列表内容,nums * 3,会把nums内容复制3份
def listCopy_test():
nums = [1,2]
newNums = nums * 3
print(newNums)
列表解析:采用[]和for进行解析
[i * 2 for i in nums]
6.13内建函数
6.13.1 标准类型函数
cmp():比较中如果两个元素不是同一类型,检查是否是数字
max():返回列表中最大元素,只适用于数字和字符串列表
min():
sorted(nums):
reversed(nums):逆置列表
enumerate():
sum():列表求和
def min_max_sum_Test():
nums = range(1,11,1)
maxNum = max(nums)
minNum = min(nums)
sumResult = sum(nums)
print("maxNum : %d , minNum: %d , sumResult:%d" % (maxNum , minNum ,sumResult))
list()和tuple()可以接受可迭代对象作为参数,通过浅拷贝
数据来创建一个新的列表或者元组
range():接受数值作为输入,返回列表
list.index(obj):返回值为list[k]=obj的k,如果不在0到len(nums)中,返回错误
list.sort(func=None,key=None,reverse=False)
reverse标志如果被设置为True。则反序排列
list.sort()原地操作,无返回值,可变对象可以直接修改
而字符串是不可变对象,不能改变值,因此会返回新的值
6.16元组
元组不可变类型,可用作字典的key
删除元组: del aTuple
6.17 元组操作符和内建函数
+
*
[:]
str(aTuple)
max()
min()
list()
<
==
元组作用:常量集合传递
元组不可变,但元组包含的可变对象可变
6.18.3默认集合类型
(‘a’)表示字符串
(‘a’,):必须加逗号表示元组
字典的关键字:键必须可哈希对象,元组变量符合,列表变量不是
使用元组:防止数据被其他人篡改
collections:容器数据累in个
types:含Python支持的所有类型
6.20 拷贝Python对象 浅拷贝和深拷贝
对象赋值是对象的引用:创建对象并赋值给另一个变量,python拷贝了这个对象的引用
默认拷贝是浅拷贝,通过完全切片[:],工厂函数list(),dict(),使用copy()都是浅拷贝,
浅拷贝的内容是原来对象元素的引用
字符串是拷贝,列表是浅拷贝,引用复制
浅拷贝的问题:对当前拷贝对象内容的修改会影响到原来对象
创建新容器需要copy.deepcopy()函数
#浅拷贝,只是持有对象引用,修改拷贝对象会造成对原有对象修改,切片,list(),dict(),copy()都是浅拷贝
def shallowCopyTest():
person = ['name' , ['money' , 100.00] ]
husband = person[:]
wife = list(person)
husband[0] = 'dongfei'
wife[0] = 'xiangqing'
husband[1][1] = 50.0
wife[1][1] = 80.0
# 字符串是不可变,因此重新创建对象,两次的名字不同,但是列表是可变的,因此不会重新创建,采用引用方式,两者一致
print(husband)
print(wife)
#深拷贝,完全创建新对象,修改拷贝对象不会对原对象产生影响
def deepcopy_Test():
person = [ 'name' , ['money', 100.00 ] ]
husband = person
wife = copy.deepcopy(person)
husband[0] = 'dongfei'
wife[0] = 'xiangqing'
husband[1][1] = 50.0
wife[1][1] = 80.0
# 字符串是不可变,因此重新创建对象,两次的名字不同,但是列表是可变的,因此不会重新创建,采用引用方式,两者一致
print(husband)
print(wife)
浅拷贝:来完全切片来做,非容器类型:数字,字符串,没有被拷贝说法
元组不会被深拷贝,
copy():浅拷贝,deepcopy():深拷贝