Python项目开发实战 来界定一个字符串。很明显,引号的开头和结尾应该是同一种类型,但是任何其他类型的引号都可以被包含在字符串中。这对于撇号或其他的类似情况是尤其有用的(‘He said, “Hi!”’ 或 “My brother’s hat”)。任意类型的三重引号可以跨越多行。下面是一些示例: >>> 'using single quotes' 'using single quotes' >>> \'using double quotes' >>> print('''triple single quotes spanning ... multiple lines ''') triple single quotes spanning multiple lines 当一个字符串的字面值出现在模块、类或函数的开始并且没有赋值给任何变量时,系统会把它当成文档。当对这个对象调用内置函数help()时,这个字符串会作为输出的一部分。 当有特殊字符,比如制表符(\\t)或换行符(\\n),在字符串中时,需要加一个反斜杠字符前缀。反斜杠的字面值也必须加这个前缀,这样它们看起来就像双反斜杠。也可以通过在整个字符串前面加一个字母r(代表raw)来避免加反斜杠前缀。这样做就表示特殊字符将不会被处理。不可打印的字符可以用一个反斜杠加上这个字符的十六进制代码在字符串中表示。例如,转义字符表示为\\x1A(注意:开头的0并没有出现在十六进制整数的字面值中)。 字符串是不可变的。这意味着一旦一个字符串形成之后,就不可以直接对它进行修改或添加。然而,可以基于现有的字符串,创建一个新的字符串。这就是许多Python字符串操作的工作原理。Python支持范围广泛的字符串操作。这些操作大部分都实现为字符串类的方法。表1-1列出了一些最常用的字符串操作。 表1-1 字符串操作 操 作 + * upper,lower,capitalize center,ljust,rjust startswith,endswith 描 述 连接字符串。但是该操作在某种程度上是一个低效的操作。通常,可改用join()来避免使用它 乘法。该操作复制多个字符串并把它们连接起来 这些操作改变字符串中字符的大小写 这些操作会将字符串按照需要在给定的字符宽度内进行对齐。空白部分会根据需要填充指定字符(默认是空格) 这些操作会检查子字符串是否匹配一行的开头或结尾。可选参数控制真正被测试的子部分。但这样会让操作名显得有些令人困惑。如果输入为多个子字符串组成的一个元组,它们也可以一次测试多个子字符串 find,index,rfind 这些操作返回找到子字符串的最低下标。如果查找失败,find会返回-1,而index会抛出ValueError异常。 rfind从字符串的右边开始查找。所以它会返回满足条件的最高下标 8 第1章 Python核心知识回顾 (续表) 操 作 isalpha,isdigit,isalnum,等 join 描 述 这些操作检查字符串的内容。几个常用的测试类型分别是字母、数字和字母数字式字符。最常用的操作就是列出来的这几个 该操作连接一个字符串列表,并使用给定字符串作为分隔符。通常,一个单空格或无空格会作为分隔符来构建一个字符串。相比字符串连接操作,该操作更快也更节省内存 split,splitlines,partition 这些操作根据一个给定的分隔符将一个字符串分割成一个子字符串列表(默认分隔符为空白,多个连续空格也算一个空白)。需要注意的是,在这个过程中,原字符串中的分隔符将会被删除。splitlines()可以高效地根据换行符分割并返回一个行列表。partition() 根据给定的分隔符分割一个字符串。但该操作只运行到第一次分割,然后会返回分割出来的第一个子字符串、分隔符和剩余的字符串 strip,lstrip,rstrip 这些操作从字符串的两端移除空白(默认)或指定的字符。lstrip ()只处理字符串的左边。rstrip()只处理字符串的右边。这些操作中,没有操作从字符串的中间移除空白。它们只是移除外围的字符。如果需要全局地移除字符,请使用replace操作 replace format 该操作执行字符串替换。通过指定一个空字符串作为替代者,该操作可以高效地删除字符 该操作用来替换在Python 版本2中使用的老版本的C语言printf风格的字符串格式化操作。在Python版本3中,printf风格依然可用,但为了支持format(),它已经被弃用了。Python文档对字符串格式化有详细的解释。基本的概念是字符串中嵌入的大括号对形成了作为format()参数传入的数据的占位符。大括号内可以包含可选的风格信息,比如填充字符(可以在本书中找到一些相关示例) 其他字符串操作也是可用的,只不过表1-1中的操作是最常用的。 在布尔表达式中,空字符串被看作是False。所有其他的字符串都被看作是True。 1.2.6 字节和字节数组 Python支持两种面向字节的数据类型。一个字节是一个八位值,相当于一个范围在0~255之间的整数。它代表着计算机存储的或通过网络传输的原始的位模式。它们在使用上和字符串非常相似,并且支持很多相同的方法。这两个类型的名称分别是byte和bytearray。 字节字符串的字面值被表示成被引号引起来,然后在前面加一个字母b。字节字符串是不可改变的。字节数组与它类似,但它们是可改变的。 9 Python项目开发实战 在实际中,你很少会用到字节字符串或字节数组,除非你要处理来自文件或网络的二进制数据。有一个问题可能会令你非常惊讶。如果用下标来访问单一的元素,返回值会是一个整数。这意味着把一个单一字符的字节字符串和一个索引下标的字符串值进行比较,产生的结果是False。这个结果与对字符串进行相同操作产生的结果是不同的。下面是一个示例: >>> s = b'Alphabet soup' >>> c = b'A' >>> s[0] == c False >>> s[0] == c[0] True 可以看到,关键是在比较的两边都使用了下标索引。 可以使用struct模块将二进制数据从字节表示形式转换成正常的Python类型。当然,在完成该操作之前,首先还是要知道字节模式代表的是什么类型。 在布尔表达式中,空字节字符串被看作是False。所有其他的字节字符串都被看作是True。 1.2.7 元组 元组是任意对象的集合。既然这些对象被收集到一起,这就暗示着在它们之间可能存在逻辑关联。但Python语言并没有对元组包含的对象有任何的限制。Python中的元组通常被形容为其他语言中记录或结构体的等价物。 元组的字面值包含一系列用逗号分开的值(或变量)。通常,为避免语义歧义,元组整体都被包括在圆括号中。但元组本身并没有这样的要求。 元组是不可改变的,所以一旦元组被创建之后,就不能修改或扩展它。可以像字符串一样,基于现有元组创建一个新的元组。可以通过调用tuple()类型函数来创建一个新的空元组。由于元组是不可改变的,因此它可以作为字典的键。 Python元组有一个非常有用的特性,被称为解包(unpacking)。这个特性能够帮助你将元组中的值提取出来并赋值给单独的变量。最常在这样的场景见到这个特性:你想要将函数返回的元组中的值存储在不同的变量中。下面是一个使用divmod()函数的示例。divmod()函数将整数除法得到的商和余数组成的元组作为返回值。 >>> print(divmod(12,7)) (1, 5) >>> q,r = divmod(12,7) >>> print (q) 1 >>> print (r) 5 注意,q和r是如何被看作新的单值变量。 10 第1章 Python核心知识回顾 在collections模块中有一个namedtuple类。它允许通过名称(而不是位置)来索引元素。这一点结合了字典的一些优势和元组的紧凑性(节省内存)和不可变性。 在布尔表达式中,空元组被看作是False。所有其他元组都被看作是True。 1.2.8 列表 列表在Python中是一种高度灵活的强大的数据结构。它们可以被用来模仿许多经典数据结构的行为,也可以使用自定义对象类的形式作为其他数据结构的基础。它们是动态的,与元组相似的是它们可以保存任何类型的对象,与元组不同的是它们是可以改变的。所以可以修改它们的内容。也可以使用元组风格的解包,把列表的元素赋值给单独的变量。 列表的字面值表示为包含在方括号内的、用逗号分隔开的对象序列。可以通过指定一对空方括号或使用list()类型函数的默认值来创建一个空列表。列表有很多方法来添加和移除成员。它们也支持一些算术风格的操作,比如像字符串那样的连接和复制列表。 可以直接用值列表来初始化一个列表,或以编程方式使用列表推导来构建一个列表。列表推导看起来就像是在列表方括号里面的一行for循环。下面的示例构建了一个1~10的偶数平方的列表: >>> [n*n for n in range(1,11) if not n*n % 2] [4, 16, 36, 64, 100] 表1-2列出了一些最常用的列表操作。 在布尔表达式中,空列表被看作是False。所有其他列表都被看作是True。 表1-2 列表操作 操 作 + * append extend pop index count insert 该操作连接两个列表 该操作会复制多个第一个列表。注意,所有的复制对象都指向同一个对象。然而,修改一个对象通常会导致奇怪的副作用。通常,列表切片或列表推导是更好的选择 该操作添加一个元素到现有列表的尾端。新元素自己也可以是个列表。该操作可以高效地就地执行,返回值是None 该操作添加一个列表的内容到另一个列表的尾端。它可以高效地连接两个列表。原列表被就地修改。返回值是None 该操作从列表的尾端或者根据提供的参数在指定位置移除一个元素。返回值是被移除的元素 该操作返回元素在列表中的第一个下标。如果在列表中没有发现这个元素,会抛出ValueError异常(同名的字符串操作也有类似的行为) 该操作返回指定元素在列表中的个数 该操作在指定下标前插入一个元素。如果这个下标过大而超出列表范围,这个元素会被添加到列表的尾端 描 述 11 Python项目开发实战 (续表) 操 作 remove reverse sort 描 述 该操作移除列表中的第一个指定元素。如果在列表中没有这个元素,会抛出ValueError异常 该操作原地反转列表中的元素 该操作对列表中的元素进行原地排序。可选参数为如何进行排序提供了灵活性。如果想得到一个排好序的列表副本并且不修改原列表,则可以使用sorted()函数 1.2.9 字典 字典是初学者经常忽略的超级强大的数据结构。它为大量常见的编程问题提供了解决方案。字典使用起来就像列表,但是它的元素是通过键值(而不是数值索引)的方式被访问的。因此,一个Python字典就是一个(无序的)键值对序列。 键可以是任意不可改变的值,包括元组。键在字典中必须是唯一的。值可以是任意的Python对象,包括另一个字典、一个列表或者其他任何Python认为是对象的东西。 字典是高度优化的,所以字典的访问时间是非常快的。实际上,Python内部的其他部分也广泛地使用字典,包括实现命名空间和类。字典也为这种情况在任何地方提供了一种解决方案:动态命名的值需要被存储起来并支持访问。字典的键不是连续的,这一点也让字典很高效。因为Python使用了哈希算法将键映射到一个稀疏数组结构中(如果不理解最后一句话,不必担心,很多人都不理解,但是你真的不需要理解它。对你而言,这句话意味着Python字典很快,而且在内存的使用上也很高效)。 字典的字面值包含逗号分隔的键值对。键和它对应的值用冒号分隔,然后整体被包含在一对花括号或{}中。它看起来如下所示: >>> {'aKey':'avalue', 2:7, 'booleans':{False:0,True:1}} {'aKey': 'avalue', 2: 7, 'booleans': {False: 0, True: 1}} 可通过键值而不是数值索引的方式来访问字典中存储的值。如果之前的示例被存放在一个名为D的变量中,可按如下方式访问键为aKey和True的值: >>> D['aKey'] 'avalue' >>> D['booleans'][True] 1 可以使用一对空的花括号或dict()类型函数的默认值来创建一个空字典。 字典有一些额外的操作可用来抽取键列表和值列表,以及处理默认值。表1-3描述了一些操作。 由于字典的实现本质,字典是无序的。确实,当新数据被插入时,顺序可能发生改变。collections模块有一个OrderedDict类。如果需要的话,它可以维持插入的顺序。如果键是12
好文档 - 专业文书写作范文服务资料分享网站