转义序列
想象一下,如果你希望生成一串包含单引号( ' )的字符串,你应该如何指定这串字符串?
例如,你想要的字符串是 "What's your name?" 。你不能指定 'What's your name?' ,因为这
会使 Python 对于何处是字符串的开始、何处又是结束而感到困惑。所以,你必须指定这个单
引号不代表这串字符串的结尾。这可以通过 转义序列(Escape Sequence) 来实现。你通过
\ 来指定单引号:要注意它可是反斜杠。现在,你可以将字符串指定为 'What's your
name?' 。
另一种指定这一特别的字符串的方式是这样的: "What's your name?" ,如这个例子般使用
双引号。类似地, 你必须在使用双引号括起的字符串中对字符串内的双引号使用转义序列。
同样,你必须使用转义序列 \ 来指定反斜杠本身。
如果你想指定一串双行字符串该怎么办?一种方式即使用如前所述的三引号字符串,或者你
可以使用一个表示新一行的转义序列—— \n 来表示新一行的开始。下面是一个例子:
'This is the first line\nThis is the second line'
另一个你应该知道的大有用处的转义序列是制表符: \t 。实际上还有很多的转义序列,但
我必须只在此展示最重要的一些。
还有一件需要的事情,在一个字符串中,一个放置在末尾的反斜杠表示字符串将在下一行继
续,但不会添加新的一行。来看看例子:
"This is the first sentence. \
This is the second sentence."
相当于
基础
36
"This is the first sentence. This is the second sentence."
原始字符串
如果你需要指定一些未经过特殊处理的字符串,比如转义序列,那么你需要在字符串前增加
r 或 R 来指定一个 原始(Raw) 字符串。下面是一个例子:
r"Newlines are indicated by \n"
针对正则表达式用户的提示
在处理正则表达式时应全程使用原始字符串。否则,将会有大量 Backwhacking 需要处
理。举例说明的话,反向引用可以通过 '\1' 或 r'\1' 来实现。
变量
如果只使用字面常量很快就会让人感到无聊——我们需要一些能够存储任何信息并且也能操
纵它们的方式。这便是 变量(Variables) 登场的时刻。正如其名字所述那般,变量的值是可
以变化的,也就是说,你可以用变量来存储任何东西。变量只是你的计算机内存中用以存储
信息的一部分。与文字常量不同,你需要通过一些方式来访问这些变量,因此,你需要为它
们命名。
标识符命名
变量是标识符的一个例子。标识符(Identifiers) 是为 某些东西 提供的给定名称。在你命名
标识符时,你需要遵守以下规则:
第一个字符必须是字母表中的字母(大写 ASCII 字符或小写 ASCII 字符或 Unicode 字
符)或下划线( _ )。
标识符的其它部分可以由字符(大写 ASCII 字符或小写 ASCII 字符或 Unicode 字符)、
下划线( _ )、数字(0~9)组成。
标识符名称区分大小写。例如, myname 和 myName 并不等同。要注意到前者是小写字
母 n 而后者是大写字母 N 。
有效 的标识符名称可以是 i 或 name_2_3 ,无效 的标识符名称可能是
2things , this is spaced out , my-name 和 >a1b2_c3 。
数据类型
4
基础
37
变量可以将各种形式的值保存为不同的数据类型(Data Type)。基本的类型是我们已经讨论
过的数字与字符串。在后面的章节中,我们会了解如何通过 类(Classes) 类创建我们自己
的类型。
对象
需要记住的是,Python 将程序中的任何内容统称为 对象(Object)。这是一般意义上的说
法。我们以“某某对象(object)”相称,而非“某某东西(something)”。
针对面向对象编程语言用户的提示:
Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字、字符串与
函数。
接下来我们将看见如何使用变量与字面常量。你需要保存以下案例并试图运行程序。
如何编写 Python 程序
从今以后,保存和运行 Python 程序的标准步骤如下:
对于 PyCharm 用户
- 打开 PyCharm。
- 以给定的文件名创建新文件。
- 输入案例中给出的代码。
- 右键并运行当前文件。
注意:每当你需要提供 命令行参数(Command Line Arguments)时,点击 Run -> Edit
Configurations 并在 Script parameters: 部分输入相应参数,并点击 OK 按钮:
基础
38
对于其他编辑器用户 - 打开你选择的编辑器。
- 输入案例中给出的代码。
- 以给定的文件名将其保存成文件。
- 在解释器中通过命令 python program.py 来运行程序。
案例:使用变量与字面常量
输入并运行以下程序:
# 文件名:var.py
i = 5
print(i)
i = i + 1
print(i)
s = '''This is a multi-line string.
This is the second line.'''
print(s)
输出:
基础
39
5
6
This is a multi-line string.
This is the second line.
它是如何工作的
下面是这一程序的工作原理。首先,我们使用赋值运算符( = )将字面常量数值 5 赋值给
变量 i 。这一行被称之为声明语句(Statement)因为其工作正是声明一些在这一情况下应
当完成的事情:我们将变量名 i 与值 5 相连接。然后,我们通过 print 语句来打印变量
i 所声明的内容,这并不奇怪,只是将变量的值打印到屏幕上。
接着,我们将 1 加到 i 变量所存储的值中,并将得出的结果重新存储进这一变量。然后我
们将这一变量打印出来,并期望得到的值应为 6 。
类似地,我们将字面文本赋值给变量 s ,并将其打印出来。
针对静态编程语言程序员的提示
变量只需被赋予某一值。不需要声明或定义数据类型。
逻辑行与物理行
所谓物理行(Physical Line)是你在编写程序时 你所看到 的内容。所谓逻辑行(Logical
Line)是 Python 所看到 的单个语句。Python 会假定每一 物理行 会对应一个 逻辑行。
有关逻辑行的一个例子是诸如 print('hello world') 这样一句语句——如果其本身是一行
(正如你在编辑器里所看到的那样),那么它也对应着一行物理行。
Python 之中暗含这样一种期望:Python 鼓励每一行使用一句独立语句从而使得代码更加可
读。
如果你希望在一行物理行中指定多行逻辑行,那么你必须通过使用分号( ; )来明确表明逻辑
行或语句的结束。下面是一个例子:
i = 5
print(i)
实际上等同于
i = 5;
print(i);
同样可以看作
基础
40
i = 5; print(i);
也与这一写法相同
i = 5; print(i)
然而,我强烈建议你对于每一行物理行最多只写入一行逻辑行。这个观点就是说你不应该使
用分号。实际上,我从未在 Python 程序中使用、甚至是见过一个分号。
在一类情况下这一方法会颇为有用:如果你有一行非常长的代码,你可以通过使用反斜杠将
其拆分成多个物理行。这被称作显式行连接(Explicit Line Joining) :
s = 'This is a string. \
This continues the string.'
print(s)
输出:
This is a string. This continues the string.
类似地,
i = \
5
等同于
i = 5
在某些情况下,会存在一个隐含的假设,允许你不使用反斜杠。这一情况即逻辑行以括号开
始,它可以是方括号或花括号,但不能是右括号。这被称作 隐式行连接(Implicit Line
Joining)。你可以在后面当我们讨论列表(List)的章节时了解这一点。
缩进
空白区在 Python 中十分重要。实际上,空白区在各行的开头非常重要。这被称作 缩进
(Indentation)。在逻辑行的开头留下空白区(使用空格或制表符)用以确定各逻辑行的缩
进级别,而后者又可用于确定语句的分组。
5
6
基础
41
这意味着放置在一起的语句必须拥有相同的缩进。每一组这样的语句被称为 块(block)。我
们将会在后文章节的案例中了解块这一概念是多么重要。
有一件事你需要记住:错误的缩进可能会导致错误。下面是一个例子:
i = 5
# 下面将发生错误,注意行首有一个空格
print('Value is', i)
print('I repeat, the value is', i)
当你运行这一程序时,你将得到如下错误:
File "whitespace.py", line 3
print('Value is', i)
^
IndentationError: unexpected indent
# 缩进错误:意外缩进
你会注意到第二行开头有一个空格。Python 指出的错误信息告诉我们程序的语法是无效的,
意即,程序没有被正确地写入。这一信息对你的意义是 你不能任意开始一个新的语句块(当
然,除非你一直在使用默认的主代码块)。你可以使用新块的情况将会在后面诸如控制流等
章节加以介绍。
如何缩进
使用四个空格来缩进。这是来自 Python 语言官方的建议。好的编辑器会自动为你完成这
一工作。请确保你在缩进中使用数量一致的空格,否则你的程序将不会运行,或引发不
期望的行为。
针对静态编程语言程序员的提示
Python 将始终对块使用缩进,并且绝不会使用大括号。你可以通过运行 from
future import braces 来了解更多信息。
总结
现在我们已经了解了诸多本质性的细节,我们可以前去了解控制流语句等更多更加有趣的东
西。记得一定要充分理解你在本章所阅读的内容。
. 自本章起,书中将出现大量程序源代码内容,在源代码中会包含一些英文语句或者英
文注释。为保持源代码整体美观以及避免其它不必要的改动,在代码内容中出现的英文
语句将会保持原样,英文注释将酌情翻译。 ↩
1
2
基础
42
. “字面常量”原文作 Literal Constants。沈洁元译本译作“字面意义上的常量”。在一些
Python 中文文档中,Literal 译作“字面值”。 ↩
. 原文作 literal。 ↩
. “原始字符串”原文作 Raw String。沈洁元译本译作“自然字符串”。 ↩
. 沈洁元译本译作“明确的行连接”。 ↩
. 空白区原文作“Whitespace”,沈洁元译本译作“空白”。它可能被理解成“空格”,但为了
与后文的空格(Space)区分,此处取字面意。