python3标准库和上一版_Python3标准库解读——内建类型(下)

2.7 文本序列类型——str

Python中的文本数据都视作str类型对象,即字符串。如2.6所述,字符串是采用Unicode编码的immutable序列。在Python中,字符串可以用但引号表示(如'abc'),也可以用双引号表示(如"abc")。注意,都是英文输入法下的单、双引号。还有一种,常用来作为注释使用的,三引号,即三个单引号或者三个双引号,如'''abc''',"""abc"""。三引号可以跨行使用,即三引号之间的内容可以有多行,类似C语言种的/**/注释方法。

Python没有字符类型(char),单个字符的如'a',即为长度为1的str对象。

str类型是Python中最常使用的类型之一。除了常见的应用于序列类型的函数外,str类还定义了很多的比较实用的函数来处理字符串——“字符串函数”。

str.capitalize(),返回str对象对应的首字符大写,其余字符小写的字符串。

str.casefold(),返回str对象对应的字符串经过casefolded之后的字符串。casefold类似于小写化,但比其更彻底。如德语中的β,经过casefold之后,就变为了“ss”。

str.center(width[,fillchar]):如果width小于或等于str对象的长度,那么返回str对象本身;否则,返回一个以str对象为中心,长度为width的字符串,返回的字符串两端以fillchar填充(fillchar默认为空白)。

str.count(sub[,start[,end]]):返回str对象中,从start开始,到end位置,sub子串出现的次数。start和end为可选参数,其作用见slice,即切片。

str.encode(encoding='utf-8',errors='strict'):将str对象用encoding进行编码,返回经过编码的bytes对象。默认编码方式为utf-8。

str.endswith(suffix[,start[,end]]):如果str对象以suffix结尾,返回True,否则返回False。suffix可以是一组需要匹配的字符串组成的一个tuple类型,只要str对象的结尾为其中之一,则返回True。如果指定了start,则从str对象字符串的start位置开始匹配;如果指定了end,则str对象字符串匹配到end-1的位置。

str.expandtabs(tabsize=8):将str对象的一个副本中的所有tab字符,即制表符(字符串中用'\t'表示),用tabsize个空格替换,tabsize默认为8,然后返回这个副本。

str.find(sub[,start[,end]]):在str对象中的字串s[start:end]中查找字符串sub,返回sub第一次出现的位置。start默认为0,end默认为字符串的长度。如果没有找到sub,则返回-1.

str.format(*args,**kwargs):此函数用于格式化字符串。一般用于将str对象中的指定格式的文本用指定的内容替换。格式化字符串的具体方法有专门的介绍。

str.index(sub[,start[,end]]):功能和str.find一样,不同的是,如果没有找到sub,index会抛出ValueError异常。

str.isalnum(),isalpha, isdecimal, isdigit, isidentifier, islower, isnumeric, isprintable, isspace, istitle, isupper, islower:这些函数都是判断str对象是否具有指定属性,根据函数字面意思即可了解。

str.join(iterable):将iterable中各项用str对象连接起来,组成一个新的字符串并返回。新的字符串中,iterable中各项之间是str对象。例如,'@'.join(['aj','qq','com'])返回'aj@qq@com'。

str.ljust(width[,fillchar]):功能与str.center类似,只是返回的字符串中str对象在字符串的最左边。此外,还有str.rjust,该函数返回的字符串中str对象在最右边。

str.lstrip([chars]),str.strip([chars]),str.rstrip([chars]):这三个函数功能相似,分别用来去除str对象左边、两边、右边chars包含的字符,构成一个新的字符串,并返回该新字符串。

str.maketrans(x[,y[,z]]):该函数是静态函数,其返回结果为一表,可作为str.translate的参数。如果仅有一个参数x,那么x必须为一个dictionary,即映射类型。如果有两个参数,那么这两个参数x、y必须为相同长度的字符串。返回的结果传给str.translate时,将str对象中x中对应的字符转换为y中相同位置的字符。

str.partition(sep):将str对象在sep首次出现的位置将其分为三段,分别为sep之前子串、sep本身以及sep之后子串,并将这三部分放在一个tuple中,返回该tuple。

str.replace(old,new[,count]):将str对象中的old字串替换为new字串。如果指定了count,则替换前count个old。

str.splitlines([keepends]):将str对象在换行符处分离为几段,并将这些子串组成一个list并返回该list。默认不保留换行标识符,除非指定keepends且其值为True。

str.startswith(prefix[,start[,end]]):类似endswith,不同的是这个函数是判断str对象的前面开头部分。

str.swapcase():将str对象字符串中的字符大写改为小写、小写改为大写,并返回经过转换的结果字符串。

str.title():将str对象字符串中所有的词首字母都改为大写字母,并返回该结果字符串。

str.translate(table):根据table将str对象中的对应子串进行替换。table可用str.maketrans生成。

str.upper():将str对象字符串中的所有字母都改为大写字母,并返回结果字符串。

str.zfill(width):功能同str.rjust,只是填充的字符为ASCII的'0',不能指定特定的字符。如果原字符串是带有正负号的数字,填充的'0'则在正负号和数字之间。

2.8 二进制序列类型——bytes、bytearray、memoryview

Python处理二进制数据的内建类型为bytes和bytearray。

2.8.1 bytes

bytes对象是由多个字节组成的immutable序列对象。其immutable特性类似str对象。由于很多主要的二进制协议是基于ASCII文本编码的,bytes对象的部分成员函数只有在处理与ASCII兼容的数据时才能用,且与str对象有着密切的关系。

bytes对象语法上和str对象基本一样,不同之处在于bytes对象前面有一个前缀'b'。如a='abc',b=b'abc',a为str对象,b为bytes对象。

bytes仅支持ASCII字符(实际是只支持直接使用ASCII字符),任何二进制值高于127的数据必须经过转义之后转换为二进制。例如,a=b'编程',这一句代码中“编程”两个字都不是ASCII字符,会抛出异常“SyntaxError: bytes can only contain ASCII literal characters.”,经过如下处理,就可以正常赋值了,a='编程'.encode(),此时a就是types类型。

由于bytes的语义和表示都是基于ASCII文本,bytes对象其实就像一个immutable的整数序列,序列中的每个元素值限定在[0,256)范围内。

除了前面介绍的创建bytes对象的方式外,还有很多方法可以创建bytes对象,例如:

创建指定长度,全部为0的bytes:bytes(10);

从一个整数组成的iterator创建:bytes(range(10)),bytes([1,2,3,5,8,100,23]);

2位16进制数正好对应一个字节,所以一般都用十六进制的数字来表示二进制数据。bytes提供了一个类函数bytes.fromhex(string),该函数从字符串string中直接生成bytes对象。string的内容必须是二位十六进制数的格式,如"2f 02 2ef0"。bytes对象还有一个函数bytes.hex(),将bytes内容转换为16进制数表示的字符串,正好与fromhex功能相反。

特别注意:bytes对象为整数序列,故而对于一个bytes对象b,b[0]返回一个整数,b[0:1]返回的是一个长度为1的bytes对象。

bytes对象也能够很简单地转换为整数组成的list,list(b)。

2.8.2 bytearray对象

bytearray与bytes类型相似,不同之处在于bytearray是mutable的序列。bytearray不能像bytes对象那样创建。创建bytearray都需要经过构造函数:

创建一个空的bytearray实例:bytearray();

创建一个指定长度,值都为0的实例:bytearray(10);

从一个整数iterator创建实例:bytearray(range(20));

从二进制数据创建:bytearray(b'hi');

bytearray类也提供了fromhex和hex函数。

bytes和bytearray支持序列类型的一般操作,如count、replace、find、endswith等,与str类型相似。

2.8.3 Memory Views

通过memoryview对象,可以直接访问任何支持buffer协议的对象的内部数据。memoryview(obj)创建一个memoryview对象,该对象指向了obj对象。obj对象必须支持buffer协议。

memoryview由元素组成,每个元素即为原对象obj处理的原子存储单元。对于简单的types、bytearray类型的对象,一个元素即为一个字节。

memoryview.release():释放memoryview对象对应的内存。调用此函数之后,任何对于该memoryview的操作都会抛出ValueError异常。如果用with创建memoryview对象,就不需要调用该函数。

memoryview.cast(format[,shape]):将memoryview内容映射到新的格式、形状。shape默认为[byte_length//new_itemsize],即结果的维度默认为一维。函数返回新的memoryview,但是还是指向原来的对象所在内存。

memoryview.obj:memorygiew对象底层对应的对象。

memoryview.nbytes:memoryview对应对象所占空间的字节数。

memoryview.readonly:memoryview是否为只读。

memoryview.format:memoryview中每个元素的格式,如b、B等,见struct模块。

memoryview.itemsize:每个元素的大小,单位为字节。

memoryview.ndim:多为数组的维度。

memoryview.shape:一个表示memoryview形状的tuple对象。

memoryview.strides:一个由ndim个整数组成的tuple,表示每个维度的大小,单位为字节。

memoryview.c_contiguous,memoryview.f_contiguous,memoryview.contiguous:bool值,指示memeoryview在内存中是否连续。

2.9 set类型——set,frozenset

set类型,即集合类型。set对象中的每个元素应该是唯一的且为hashable,没有先后顺序,故而set对象不支持index、slice等序列对象的操作。set类型是mutable的,其内容可以通过add()、remove()等方法改变;frozenset类型正如其名,一旦创建,其内容不可改变,即immutable。

set的创建方法很简单,将元素放入话括弧中即可,各元素之间以逗号隔开,例如{'james','bond','007'}。

标准库中,set和frozenset的函数都比较简单,基本从字面意思就可以看出。set的并、交等集合运算与数学里的集合计算一样。

2.10 映射类型——dict

dict类型,即为“键值对”类型,也就是“key:value”的形式。每一个key都对应一个value。key是hashable对象。dict类型是mutable类型。dict中的key必须是唯一的,即一个key只能对应一个value;但是,两个不同的key也可能对应相同的value。创建dict的方式:{'name':'James Bond','id':'007','age':40},也可以通过dict的构造函数创建。

创建号dict对象d之后,d[key]返回key对应的value。如果key并不存在,那么抛出KeyError异常。对于dict的子类,如果定义了__missing__函数,且key不存在,那么会调用该函数。

dict对象d也可以直接给指定的key赋值或者改变其value,d[key]=value。

当把dict对象d传给iter函数时,获取到的iterator内容为d的key。

d.clear():清除d中所有的键值对。

d.get(key[,default]):该函数功能同d[key],但是如果key不存在,该函数不会抛出异常,而是返回default,如果没有指定default,那么就是None。

d.items():返回格式为(key,value)的d所有键值对序列,常用于遍历dict。

d.pop(key[,default'):如果key在d中,删除它并返回对应的value;否则,返回default,如果未指定default,抛出KeyError异常。

d.popitem():从d中随机移除并返回一个(key,value)。

d.setdefault(key[,default]):如果key在d中,返回其value;否则,将key添加到d中,设置其值为default并返回default。default默认为None。

d.update([other]):用other中的键值对更新d,并覆盖已经存在的key。other可以是dict对象,也可以是键值对。

d.values():返回d的所有value。

2.11 上下文管理器类型(Context Manager)

Python的with语句可以简化try/finally模式,保证了在with块代码结束或异常终止执行时,资源会被释放。Python的with语句就是通过上下文管理器(context manager)来进行控制。如打开一个文件:"with open('filename') as f: ..."。通过定义一对函数__enter__()、__exit__()即定义了一个上下文管理器:

contextmanager.__enter__():该函数返回的对象就是with表达式里as标识符所绑定的对象。上下文管理器对象就是with之后、as之前的表达式返回的结果,as之后的对象是相应的上下文管理器对象上调用__enter__函数返回的结果。可知,with后面的语句返回的对象必须为上下文管理器实例。

contextmanager.__exit__(exc_type,exc_val,exc_tb):退出上下文时调用此函数,该函数返回True表示with块中的异常已经被处理,不再向上层抛出异常;否则表示向上层抛出with块中抛出的异常。如果在执行with块时没有抛出异常,三个参数都为None;如果发生了异常,函数的参数包含了异常的信息:exc_type,异常类;exc_val,异常类实例;exc_tb,追踪对象。如果三个参数不为None,在__exit__函数中不要显示地抛出异常,应该返回False以使该函数顺利执行结束,这样上下文管理器就会知道__exit__函数是否调用失败。

Python定义了几个上下文管理器,具体情况参考contextlib模块。

2.12 其他内建类型

Python还有一些内建类型,其大多数只有一两函数。这些类型包括Module、Class、Function、Method、Code、Type、Null、Ellipsis、NotImplemeted、Boolean、Internal等。

Module类型对象的一个特别的属性是__dict__。这个属性包含了模块的符号表。

Function和Method的区别在于,Method一般是作为一个属性,如类的成员函数。

Code对象是一个可执行对象,见compile内建函数。

2.13 特殊属性

instance.__class__,对象所属的类;

class.__bases__,class的基类构成的一个tuple;

class.__name__,class的类名;

class.__mro__,由一组类组成的一个tuple,这些类是在进行class的函数解析时查找的基类。

---------------------------------------------------------------------

扫码及时获取信息!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值