《从问题到程序:用Python学编程和计算》——2.4 字符串

2.4 字符串

文字处理是计算机的重要应用领域。此外,大多数计算机程序都需要和使用者打交道,需要接受使用者提供的数据或命令,给使用者提供反馈,把计算的结果展示给使用者,操作中也可能用到各种文字形式的信息。Python用字符串支持文本的表示和处理。

2.4.1 字符串和字符串类型

字符串就是字符的序列,Python中的字符串也是一种数据对象,其类型称为字符串类型,类型的名字是str。

字符串字面量

字符串有几种字面量描述形式,最简单的字面量是用一对单引号或者一对双引号括起的一系列字符(两种括号的作用相同,但要配对)。例如:

>>> 'University'
'University'
>>> "University"
'University'
>>> type('University')
<class 'str'>

CPython解释器输出字符串时都采用单引号括起的形式,这也间接说明,无论用单引号还是双引号写字符串字面量,结果都一样。这两种形式的限制是在一个字符串字面量中间不能换行,因此只适合描述比较短的字符串。如果在一个字符串没写完(没出现表示结束的第二个引号)时换行,解释器将报告语法错SyntaxError: EOL while scanning string literal,意为在扫描字符串字面量的过程中遇到了换行(EOL,end of line)。

字符串还有另外两种字面量形式。Python允许用一对连续的三个单引号或者一对连续的三个双引号作为字符串括号。这种形式的字符串,特点是描述中可以换行,换行符号也作为字符串内容。例如,下面是Python文档中的一段话:

>>> """Python is an interpreted, interactive, 
object-oriented programming language. It 
incorporates modules, exceptions, dynamic 
typing, very high level dynamic data types, 
and classes."""
'Python is an interpreted, interactive, \nobject-oriented programming language. It \nincorporates modules, exceptions, dynamic \ntyping, very high level dynamic data types, \nand classes.'

注意,这里的输入是连续的5行字符,解释器输出的是一个字符串,同样用一对单引号括起。比较输入和输出,可以看到输入中的每个换行,在解释器输出的字符串里变成了两个字符 \n,实际上,这样两个字符的序列就表示一个换行字符。

特殊字符

有些字符无法用普通字符形式写出,上面的换行符就是一例。为了能在字符串里写这些字符,Python规定了一组特殊描述方式,其形式都是用一个反斜线字符开头,随后再写另外的字符。下面是几个常用特殊字符的写法及其解释:

这种写法称为换意序列,用反斜线符表示后面字符的意义换了。例如,如果想在单引号括起的字符串里写一个单引号,直接写出就表示字符串结束,显然不行。这里必须用换意序列,写两个字符“\'”表示这个单引号。例如 'I don\'t think so'。其他情况类似。由于有两种引号,上例也可以简单写为 "I don't think so",这里就不必写反斜线符了。也就是说,在两个双引号括起的字符串里单引号是普通字符,反之依然。对反斜线符本身,如果单写就表示做换意,因此规定双写。本章语言细节一节列出了更多换意序列。

2.4.2 字符串操作

作为一种重要的数据类型,字符串也有很多操作。这里简单介绍几个最基本的字符串操作,更多操作将在后面介绍,另请查看Python标准库手册。

字符串运算

在一个字符串里包含一系列字符,其中每个字符有一个位置,从0开始顺序编号,称为下标(index)。可以通过编号取得字符串里对应的字符,例如:

>>> "University"[0]
'U'
>>> "University"[8]
't'
>>> "University"[10]
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    "University"[10]
IndexError: string index out of range

基于下标取字符串里的单个字符,用方括号里写下标的形式描述。显然,取字符只能在具体字符串的范围内进行,超范围访问是下标越界(index out of range)错误。Python允许用负整数作为下标提取字符串里的字符,下标 – 1表示取最后一个字符,其余类推:

>>> "University"[-3]
'i'

注意,Python语言里并没有独立的字符概念,只有字符串。通过下标取字符,得到的实际上是只包含一个字符的字符串。

字符串中的字符个数称为字符串的长度(length),用Python内置函数len可以求出字符串的长度,例如:

>>> len("University")
10

显然,对字符串s,其合法下标范围是0到len(s) – 1。

字符串的另一个重要操作是拼接,可以拼接起两个或更多个字符串,做出一个长字符串。Python中字符串的拼接用加法运算符表示。例如:

>>> "Peking" + " " + "University"
'Peking University'

实际中需要拼接的通常不是这种直接写出的字面量,而是程序里已有的字符串。注意,字符串拼接运算没有可交换性,交换两个运算对象,通常将得到另一字符串。

可以从一个字符串出发,做出它的几个拷贝的拼接,这种操作用乘法运算符描述。操作的另一运算对象应该用一个整数。例如:

"Ok!" * 3
'Ok!Ok!Ok!'
>>> 3 * "Ok!"
'Ok!Ok!Ok!'

两种顺序写的运算对象的效果完全一样。

字符串切片

切片是另一种重要字符串操作,其功效是取出已有字符串中的一部分(0个或多个字符),做成一个新字符串。字符串切片的描述方式与取字符类似,也用一对方括号。但括号里不是写一个表示整数的表达式,而是写一个切片描述。切片描述有两种不同形式。假设s是一个字符串,下面两种描述取得s的切片:

  • s[m:n]  得到由字符s[m] 到s[n-1] 构成的字符串。如果m≥n就得到一个空字符串,其中不包含任何字符。
  • s[m:n:d]  得到由s[m] 到s[n-1],下标的步进值为d选出字符做成的字符串。如果d是正数且m≥n,或者d是负数且n≥m,都得到空字符串。

这里的m、n、d都应该是值为整数的表达式,m或n的值为-1表示字符串s的最后一个字符,其余负数类推。切片描述中必须包含冒号,但m、n、d都可以省略。m省略时表示0(从字符串的首字符开始),n省略时表示len(s)(到最后一个字符为止),d省略时表示1。因此,对这两种使用形式,所有下标都省略时都表示做出整个字符串的拷贝。

注意,这里的下标范围描述采用左闭右开的规则,也就是说,总包含第一个下标描述的字符,但不包括第二个下标描述的字符,是一个左闭右开的字符位置区间。

下面是几个简单示例:

>>> "Universities in Beijing"[16:]
'Beijing'
>>> "Universities in Beijing"[:12]
'Universities'
>>> "Universities in Beijing"[::2]
'Uieste nBiig'

数值与字符串的转换

各种数值类型的对象都可以转换到字符串,得到它们的字符串表示。在程序输入输出时经常需要做这种转换,有些是自动完成的。先看几个例子:

>>> str(101)
'101'
>>> str(101) + str(2.3**4)
'10127.98409999999999'

最后一步做的是字符串拼接。后一个例子没有实际意义,只是为了说明问题。

同样可以做另一个方向的转换:如果一个字符串里的字符都是十进制数字(可以带正负号),可以从它转换得到一个整数或者浮点数:

>>> int("-1234")
-1234
>>> int("00011234")
11234
>>> float("00011234")
11234.0

开头的0自动忽略。此外,如果一个字符串的内容符合Python浮点数的要求,就可以从它构造出一个浮点数。例如:

>>> float("-256.38")
-256.38
>>> float("0.276e-3")
0.000276

字符串还有很多操作,将在第5章介绍,后面还会看到字符串的很多实际使用。

时间: 2024-10-30 03:28:04

《从问题到程序:用Python学编程和计算》——2.4 字符串的相关文章

《Python 3程序开发指南(第2版•修订版)》——2.2 Integral类型

2.2 Integral类型 Python提供了两种内置的Integral类型,即int与bool1.整数与布尔型值都是固定的,但由于Python提供了增强的赋值操作符,使得这一约束极少导致实际问题.在布尔表达式中,0与False表示False,其他任意整数与true都表示true.在数字表达式中,True表示1,False表示0.这意味着,有些看起来很怪异的表达式也是有效的.例如,我们可以使用表达式i += True来对整型变量i进行递增操作,当然,最自然的方法还是i+=1. 2.2.1 整数

《Python 3程序开发指南(第2版•修订版)》——第1章 过程型程序设计快速入门 1.1 创建并运行Python程序

第1章 过程型程序设计快速入门 本章提供了足以开始编写Python程序的信息.如果此时尚未安装Python,强烈建议读者先行安装Python,以便随时进行编程实践,获取实际经验,巩固所学的内容. 本章第1节展示了如何创建并执行Python程序.你可以使用自己最喜欢的普通文本编辑器来编写Python代码,但本节中讨论的IDLE程序设计环境提供的不仅是一个代码编辑器,还提供了很多附加的功能,包括一些有助于测试Python代码.调试Python程序的工具. 第2节介绍了Python的8个关键要素,通过

《Python 3程序开发指南(第2版•修订版)》——2.7 练习

2.7 练习 1.修改程序print_unicode.py,以便用户可以在命令行上输入几个单独的单词,并且只有在Unicode字符名包含用户指定的所有单词时才打印相应列.这意味着,我们可以输入类似于如下的命令: print_unicode_ans.py greek symbol 实现上述要求的一种方法是使用words列表替换word变量(其中存放0.None或字符串).改变代码后,要记得更新使用帮助信息.这一改变需要添加不到10行代码,另外需要对不到10行的代码进行适当修改.文件print_un

《Python 3程序开发指南(第2版•修订版)》——2.3 浮点类型

2.3 浮点类型 Python提供了3种浮点值:内置的float与complex类型,以及来自标准库的decimal.Decimal类型,这3种数据类型都是固定的.float类型存放双精度的浮点数,具体取值范围则依赖于构建Python的C(或C#或Java)编译器,由于精度受限,对其进行相等性比较并不可靠.float类型的数值要使用小数点或使用指数表示,比如,0.0.4..5.7.-2.5.-2e9.8.9e-4等. 计算机使用基数2表示浮点数--这意味着,有些十进制数可以准确表示(比如0.5)

《Python 3程序开发指南(第2版•修订版)》——1.2 Python的关键要素

1.2 Python的关键要素 在本节中,我们将学习Python的8个关键要素,下一节中,我们将展示如何借助这些要素编写实际的小程序.关于本节中讲述的各关键要素,都有更多的内容需要阐述,因此,阅读本节的内容时,有时候你会觉得Python似乎遗失了一些内容,使得很多工作只能以一种冗繁的模式完成,如果使用前向索引或索引表格中的内容,那么你几乎总是可以发现Python具备你需要的特性,并且可以更紧凑的表达方式来完成当前展示的工作方式--还有很多其他内容. 1.2.1 要素#1:数据类型 任何程序语言都

《Python 3程序开发指南(第2版•修订版)》——2.4 字符串

2.4 字符串 字符串是使用固定不变的str数据类型表示的,其中存放Unicode字符序列.str数据类型可以作为函数进行调用,用于创建字符串对象--参数为空时返回一个空字符串,参数为非字符串类型时返回该参数的字符串形式,参数为字符串时返回该字符串的拷贝.str()函数也可以用作一个转换函数,此时要求第一个参数为字符串或可以转换为字符串的其他数据类型,其后跟随至多两个可选的字符串参数,其中一个用于指定要使用的编码格式,另一个用于指定如何处理编码错误. 前面我们注意到,字符串是使用引号创建的,可以

《Python 3程序开发指南(第2版•修订版)》——2.5 实例

2.5 实例 在这一节中,我们将根据本章以及前面一章中所学的知识,提供两个虽小但完整的程序,以助于巩固到此为止所学的Python知识.第一个程序有点偏数学化,但是非常小,大约35行代码.第二个程序是关于文本处理的,并且更具体,其中包含7个函数,大约80行代码. 2.5.1 quadratic.py 二次方程是指形如ax2 + bx + c = 0的方程,其中,a不为0描述的是抛物线.这一方程的根可以由公式 得出,其中,公式的b2-4ac部分称为判别式--如果为正值,那么该方程有两个实根:如果为0

《Python 3程序开发指南(第2版•修订版)》——1.5 练习

1.5 练习 在本书的每一章最后,都有一节练习,设置练习的目的是鼓励读者对Python进行实践,获取实际经验,以助于吸收每章中所学的知识.本节包括的实例与练习既涉及数字处理,也涉及文本处理,以便尽可能满足更多读者的需求.此外,这些实例与练习都有非常小的代码规模,以便于读者将重点和注意力集中于学习与思考,而不是仅仅输入代码.本书的实例中,为每个练习都提供了一个解决方案. 1.bigdigits.py程序的一个变形,不再打印*,而是打印具体的数字.例如: bigdigits_ans.py 71942

《Python 3程序开发指南(第2版•修订版)》——导读

前 言 在应用广泛的各种语言中,Python或许是最容易学习和最好使用的.Python代码很容易阅读和编写,并且非常清晰,而没有什么隐秘的.Python是一种表达能力非常强的语言,这意味着,在设计同样的应用程序时,使用Python进行编码所需要的代码量要远少于使用其他语言(比如C++或Java)的代码量. Python是一种跨平台的语言:一般来说,同样的Python程序可以同时在Windows平台与UNIX类平台(比如Linux.BSD与Mac OS X)上运行--只需要将构成Python程序的

《Python 3程序开发指南(第2版•修订版)》——7.3 写入与分析XML文件

7.3 写入与分析XML文件 有些程序将其处理的所有数据都使用XML文件格式,还有些其他程序将XML用作一种便利的导入/导出格式.即便程序的主要格式是文本格式或二进制格式,导入与导出XML的能力也是有用的,并且始终是值得考虑的一项功能. Python提供了3种写入XML文件的方法:手动写入XML:创建元素树并使用其write()方法:创建DOM并使用其write()方法.XML文件的读入与分析则有4种方法:人工读入并分析XML(不建议采用这种方法,这里也没有进行讲述--正确处理某些更晦涩和更高级