1、序列
成员有序排列,并且可以通过下标偏移量访问到它的一个或几个成员的类型统称为序列。
(1)标准类型操作符
(2)序列类型操作符
- 成员关系操作符(in,not in) 对象 [not] in 序列
- 连接操作符(+) seq1+seq2
- 重复操作符(*) seq*copies_int
- 切片操作符([],[:],[::])
seq[index] (0<=index<=len(seq)-1 || -len(seq)<=index<=-1)
seq[starting_index:ending_index](不包括结束索引对应的元素)
开始和结束索引值可以超过字符串的长度。
- 扩展切片操作( [::步长参数])
(3)内建函数(BIF)
迭代是从序列、迭代器或其他支持迭代操作的对象中泛化的。许多只支持序列作为参数的内建函数现在也开始支持迭代器或者类迭代器。这些类型统称为“可迭代对象”。
(a)类型转换(工厂函数)
list() str() tuple() 将对象作为参数,并将其内容(浅)拷贝到新生成的对象中。
- list(iter) 把可迭代对象转换为列表
- str(obj) 把obj对象转换成字符串(对象的字符串表示法)
- unicode(obj)把对象转换成unicode字符串(使用默认编码)
- basestring()抽象工厂函数,仅仅为str和unicode函数提供父类,不能被实例化,也不能被调用
- tuple(iter)把一个可迭代对象转换成一个元组对象
(b)可操作
len() reversed() sum()只接受序列作为参数;max() min()也可接受一个参数列表
- enumerate(iter)(2.3) 接受一个可迭代对象作为参数,返回一个enumerate对象(同时也是一个迭代器),该对象生成由iter每个元素的index值和item值组成的元组
- len(seq) 返回seq的长度
- max(iter,key=None) or max(arg0,arg1,…,key=None)(2.5开始支持关键字参数) 返回iter或(arg0,arg1,…)中的最大值,如果指定了key,这个key必须是一个可以传给sort()方法的,用于比较的回调函数
- min(iter,key=None) or min(arg0,arg1,…,key=None)(2.5开始支持关键字参数) 返回iter或(arg0,arg1,…)中的最小值,如果指定了key,这个key必须是一个可以传给sort()方法的,用于比较的回调函数
- reversed(seq)(2.4)接受一个序列作为参数,返回一个以逆序访问的迭代器
- sorted(iter,func=None,key=None,reverse=False) 接受一个可迭代对象作为参数,返回一个有序的列表;可选参数func,key,reverse的含义跟list.sort()内建函数的参数含义一样
- sum(seq,init=0)(2.3)返回seq和可选参数init的总和,其效果等同于reduce(operator.add,seq,init)
- zip([it0,it1,…,itN])(2.0加入,2.4加强) 返回一个列表,其第一个元素是it0,it1,…,itN这些元素的第一个元素组成的一个元组,第二个…依此类推
2、字符串
Python中单引号和双引号的作用是相同的。
字符串是一种直接量或者说是一种标量。
字符串是不可变类型,不能只改变一个字符串的一个字符或者一个子串。改变一个字符串就必须通过创建一个新串的方式来实现。
Python有三类字符串:通常意义的字符串(str)和Unicode字符串(unicode)实际上都是抽象类basestring的子类。basestring为抽象类,不能被实例化。
清空或者删除一个字符串:aString=” or del aString
3、字符串和操作符
(1)标准类型操作符
(2)序列操作符切片([]和[:])
- 正向索引:0,1,2,3
- 反向索引:-4,-3,-2,-1
- 默认索引:若开始索引或者结束索引没有指定的话,分别以字符串的第一个索引值和最后一个索引值为默认值。
起始和结束索引都没有指定的话会返回整个字符串。
(a)成员操作符(in or not in)
成员操作符用于判断一个字符或者一个子串是否出现在另一个字符串中,出现则返回True,否则返回False。而判断一个字符串是否包含另一个字符串由find()或者index()函数(rfind()/rindex())来完成。
string模块包含预定义字符串。(注:建议不要使用string模块,性能)
(b)连接符(+)
将一个普通字符串和一个Unicode字符串做连接,普通字符串会被转化成Unicode字符串。
- 运行时刻字符串连接。
使用“%s%s”格式化操作符或者把所有字符串放到列表中,然后使用join方法连接,要尽量少用“+”连接字符串。
>>> ‘%s %s‘ % (‘Spanish‘,‘Inquisition‘)
>>>s=‘‘.join((‘Spanish‘,‘Inquisition‘))
- 编译时字符串连接
Python允许在源代码中把几个字符串连在一起写,构建新字符串。
foo=“hello”“world!”
f=urllib.urlopen("http://" #protocol
"localhost") #hostname
(c)重复操作符(*)
>>>‘Ni!‘ * 3
‘Ni!Ni!Ni!‘
4、只适用于字符串的操作符
(1)格式化操作符(%)
- %c ASCII字符
- %r(2.0) 优先用repr()函数进行字符串转换
- %s 优先用str()函数进行字符串转换
- %d/%i 转成有符号十进制数
- %u 转成无符号十进制数
- %o 转成无符号八进制数
- %x/%X 转成无符号十六进制数
- %e/%E 转成科学计数法
- %f/%F 转成浮点型
- %g/%G %e和%f/%E和%F的简写(根据数字大小转成%e或%f/%E或%F)
- %% 输出%
Python支持两种格式的输入参数:
- 元组
‘dec:%d/oct:%#o’% (num,num)
- 字典
‘%(howmany)d %(lang)s’% {‘lang‘:‘Python‘,‘howmany‘:‘3‘}
下面是格式化操作符辅助指令:
- * 定义宽度或者小数点精度
- - 用作左对齐
- + 在正数前面显示加号(+)
- 在正数前面显示空格
- # 在八进制数前面显示零(’0’),在十六进制数前面显示’0x’或者’0X’(取决于用的是’x’还是’X’) >>>’%#X’ % 108
- 0 显示的数字前面填充’0’而不是默认的空格
- % ‘%%’输出一个单一的’%’
- (var) 映射变量(字典参数)
- m.n m是显示的最小总宽度,n是小数点后的位数(如果可以的话)
所有的Python对象都有一个字符串表示形式(通过repr()函数或str()函数来展现)。print语句自动为每个对象调用str()函数。
(2)字符串模板
字符串格式化操作符缺点:不够直观,会出现遗漏转换类型符号的错误;需要记住转换类型参数等细节。
>>>from string import Template(2.4)
>>>s = Template(‘${howmany} ${lang}‘)
>>>print s.substitute(lang=‘Python‘,howmany=3)
string模块,包含substring()和safe_substitute()方法:
- substitute()更为严谨,在key缺少情况下会报KeyError异常;
- safe_substitute()方法在缺少key时,直接原封不动把字符串显示出来。
字符串模板相对于字符串格式化操作符优点:不用记住所有细节(如类型符号)
(3)原始字符串操作符(r/R)(1.5)
>>>print r‘\n‘ #r/R必须紧靠在第一个引号前面
\n
(4)Unicode字符串操作符(u/U)(1.6)
>>>print u‘abc‘
>>>print ur‘Hello\n Worlld!‘
5、内建函数
(1)标准类型函数
cmp()根据ASCII码值进行比较。
(2)序列类型函数
- len()
- max()/min()
- enumerate()
- zip()
例:
>>>for i,t in enumerate(s):
>>> print i,t
>>>s,t=‘foa‘,‘obr‘
>>>zip(s,t)
[(‘f‘,‘o‘),(‘o‘,‘b‘),(‘a‘,‘r‘)]
(3)字符串类型函数
- raw_input()
- str()和unicode()
- chr()/unichr()
- ord()(ord()是chr()或unichr()的配对函数)
Python中没有C风格的结束字符NUL。
6、字符串内建函数
- 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() 如果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是标题化的则返回True,否则返回False
- string.isupper() 如果string中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回True,否则返回False
- string.join(seq) 以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开头,如果beg或者end指定则检查指定的范围内是否以obj开头,如果是返回True,否则返回False
- string.strip() 在string上执行lstrip()和rstrip()函数
- string.swapcase() 翻转string中的大小写
- string.title() 返回“标题化”的string,就是说所有单词都是以大写开头,其余字母均为小写
- string.translate(str,del=”“) 根据str给出的表(包含256个字符)转换string的字符,要过滤掉的字符放到del参数中
- string.upper() 转换string中所有小写字符为大写
- string.zfill(width) 返回长度为width的字符串,原字符串string右对齐,前面填充0
7、字符串的独特特性
(1)特殊字符串和控制字符
特殊字符(常用作字符串里面的定界符)
反斜线+单一字符
ASCII码值表示
Python字符串中可以多次出现NUL(\000)字符(C语言中的结束符)
反斜杠开头的转义字符
- \0 NUL 空字符Nul
- \a BEL 响铃字符
- \b BS 退格
- \t HT 横向制表符
- \n LF 换行
- \v VT 纵向制表符
- \f FF 换页
- \r CR 回车
- \e ESC 转义
- \” ” 双引号
- \’ ’ 单引号
- \\ \ 反斜杠
(2)三引号(“‘strcontent’”)
三引号括起来的字符串允许字符串跨越多行,字符串中可包含换行符,制表符及其他特殊符号。
三引号的语法是一对连续的单引号或者双引号(通常都是成对的用)。
(3)字符串不变性
>>>s=‘abc‘
>>>s=s+‘def‘
进行“s+’def’”操作时,新建一个新字符串,然后这个新的字符串对象被赋给了s,原来的’abc’被释放掉了。
8、Unicode(1.6引入Unicode字符串支持)
(1)相关术语
- ASCII 美国标准信息交换码
- BMP 基本多文种平面(第零平面)
- BOM 字节顺序标记(标识字节顺序的字符)
- CJK/CJKV 中文-日文-韩文(和越南语)的缩写
- Code Point 类似于ASCII值,代表Unicode字符的值,范围在range(1114112)或者说从0x000000到0x10FFFF
- Octet 八位二进制数的位组
- UCS 通用字符集
- UCS2 UCS的双字节编码方式
- UCS4 UCS的四字节编码方式
- UTF Unicode或者UCS的转换格式
- UTF-8 8位UTF转换格式(无符号字节序列,长度为1~4个字节)
- UTF-16 16位UTF转换格式(无符号字节序列,通常是16位长[两个字节],见UCS2)
(2)Python中怎样使用Unicode
Python中所有字符串字面量默认都用ASCII编码,可以使用‘u’前缀声明Unicode字符串。
string模块已停止更新,只保留了ASCII码的支持,string模块已不推荐使用。
chr()/str()只能处理常规的ASCII编码字符串。
unicode()/unichr是Unicode版本的str()/chr()。
(3)Codec是什么
codec是COder/DECoder首字母组合。定义了文本跟二进制值的转换方式。Unicode是多字节编码。codec支持4种编码方式:ASCII/ISO 8859-1/Latin-1/UTF-8/UTF-16。UTF-8使用1-4个字节表示字符。使用一个字节编码ASCII字符。UTF-16使用两字节来存储字符,UTF-16并不向后兼容ASCII。
(4)处理Unicode字符串时注意
- 程序中出现字符串时一定要加前缀’u’;
- 不用str()函数,用Unicode()函数代替;
- 不用过时的string模块;
- 不到必须时不在代码中编解码Unicode字符。
Python中绝大部分模块都支持Unicode,而pickle模块只支持ASCII字符串。不过现在pickle模块的默认格式是二进制格式,所以向数据库存文件时,把文件作为BLOB字段存储比作为TEXT或VARCHAR字段存储要好很多。
(5)Python的Unicode支持
- 内建的unicode()函数
- 内建的decode()/encode()方法都可以应用于常规字符串和Unicode字符串。
- Unicode类型:可以用Unicode()工厂方法或在字符串前面加一个u或者U来创建Unicode字符串实例。
- ord()函数已经升级到可以支持Unicode对象;
- unichar()函数接受一个32位的值返回一个对应的Unicode字符。
- 混合类型字符串操作需要把普通字符串转换成Unicode对象。
- UnicodeError异常。
- 正则表达式引擎需要Unicode支持。
- 字符串格式化操作符:u “%s %s” %(u”abc”,”abc”) => u”abc abc”
9、Python标准库中与字符串相关的模块
- string 字符串操作相关函数和工具,比如Template类
- re 正则表达式:强大的字符串模式匹配模块
- struct 字符串和二进制之间的转换
- c/StringIO 字符串缓冲对象,操作方法类似于file对象
- base64 Base 16、32和64数据编解码
- codecs 解码器注册和基类
- crypt 进行单方面加密
- difflib(2.1) 找出序列间的不同
- hashlib(2.5)多种不同安全哈希算法和信息摘要算法的API
- hma(2.2) HMAC信息鉴权算法的Python实现
- md5 RSA的MD5信息摘要鉴权
- rotor 提供多平台的加解密服务
- sha 安全哈希算法SHA
- stringprep(2.3)提供用于IP协议的Unicode字符串
- textwrap(2.3) 文本包装和填充
- unicodedata Unicode数据库
10、列表
列表能保存任意数目的Python对象。
元组是不可变的(只读的)。
列表用方括号([])来定义。
使用切片操作符([])和索引来访问列表元素。
列表元素可以被更新。也可以用append()方法来增加元素。
用del语句删除列表元素 del aList[1]
可以用remove()方法删除元素 aList.remove(123)
可以用pop()方法来删除并从列表中返回一个特定对象。
删除列表对象用del del aList
11、操作符
(1)标准类型操作符
> < == 等
(2)序列类型操作符
- 切片([])
- 成员关系操作(in,not in)
- 连接操作符(+)只能在同类型对象之间进行。
从1.5起可以使用extend()方法来代替连接操作符,其优点是将新列表添加到原列表里面,而不用创建一个新列表。 list.extend()方法也被用来做复合赋值运算,也就是2.0中添加的替换连接操作(+=)。
- 重复操作符(*)
- 列表解析 [i*2 for i in [8,-2,5]] =>[16,-4,10]
12、内建函数
(1)标准类型函数
cmp() 列表对比
(2)序列类型函数
- len()
- max()/min()
- sorted()/reversed()
- enumerate()/zip()
- sum()
list()/tuple()接受可迭代对象,并通过浅拷贝数据来生成一个新的列表或元组。它们常被用来进行列表与元组的类型转换。
13、列表类型的内建函数
dir(list) 使用dir()方法得到列表对象所有的方法和属性。
- list.append(obj)
- list.count(obj)
- list.extend(seq)
- list.index(obj,i=0,j=len(list))
- list.insert(index,obj)
- list.pop(index=-1)
- list.remove(obj)
- list.reverse()
- list.sort(func=None,key=None,reverse=False)以指定的方式排序列表中的元素,如果func和key参数指定,则按照指定的方式比较各个元素,如果reverse标志被置为True,则列表以反序排列
注:那些可以改变对象值的可变对象的方法是没有返回值的。
14、元组
元组用圆括号。元组是不可变类型。
元组可用作字典的key。当处理一组对象时,这个组默认是元组类型。
创建只有一个元素的元组需要在元组分隔符里面加一个逗号(,)以防止跟普通的分组操作符混淆。>>>t=(‘abc’,)
删除元组用del语句。
元组操作符及内建函数跟列表相同。
15、元组的特殊特性
元组不可变。但连接操作可将几个小元组连接成一个大元组。
重复操作也适用于元组。元组可转换成列表。
元组对象本身不可变,但是元组包含的可变对象可以被修改。
所有的多对象的,逗号分隔的,没有明确用符号(方括号,圆括号)定义的,这些集合默认类型为元组。
所有函数返回的多对象(不包括有符号封装的)都是元组类型。
创建单元素元组(’xy’,)因为圆括号被重载用作分组操作符,圆括号首先被作为分组操作,再是作为元组的分界符。
需要不可变类型的情况是,调用函数时确保入参不被篡改。
需要可变类型的情况是,管理动态数据集合时,需要先创建它们,再逐渐地或者不定期地添加它们,或者有时还需要移除一些单个元素。
数组类型类似列表类型,只是要求它们所有的元素都是同一类型。
16、相关模块
- array 数组
- copy 深拷贝和浅拷贝
- operator 包含函数调用形式的序列操作符
- re Perl风格正则表达式查找(和匹配)
- StringIO 将长字符串作为文件操作,read()/seek()等
- cStringIO 将长字符串作为文件操作(C版,更快)
- textwrap(2.3) 包装/填充文本的函数
- types 含Python支持的所有类型
- collections(2.4)高性能容器数据类型
17、拷贝Python对象
对象赋值只是简单的对象引用。
浅拷贝,不可变元素被显式的拷贝,而可变元素只是将引用复制了一下。
序列类型对象的浅拷贝有以下几种实现方式:
- 完全切片操作( [:])
- 工厂函数list()/dict()等
- copy模块的copy()函数
深拷贝使用copy.deepcopy()函数实现。
关于拷贝操作的几点警告:
- 非容器类型(比如数字、字符串和其他“原子”类型的对象,像代码、类型和xrange对象等)没有被拷贝一说,浅拷贝是用完全切片操作来完成的。
- 如果元组变量只包含原子类型对象,对它的深拷贝不会进行。