只是打印出 hello world
肯定是不够的,是吗?你会希望做得比这还要多——你想要输入一些内容,操纵它,然后从中得到一些输出出来的内容。我们可以在 Python 中通过使用变量与常量来实现这一目标,在本章中我们还会学习其它的一些概念。
注释
注释 是任何存在于 #
号右侧的文字,其主要用作写给程序读者看的笔记。
举个例子:
print('hello world') #注意到 print 是一个函数
或者:
# 注意到 print 是一个函数
print('hello world')
你应该在你的程序中尽可能多地使用有用的注释:
- 解释假设
- 说明重要的决定
- 解释重要的细节
- 说明你想要解决的问题
- 说明你想要在程序中克服的问题,等等。
代码会告诉你怎么做,注释会告诉你为何如此。
这样做对你的程序的读者来说非常有用,他们可以很容易地理解你的程序是做什么的。请记住,这个人可以是六个月后的你!
字面常量
一个字面常量(Literal Constants)的例子是诸如 5
、1.23
这样的数字,或者是如 这是一串文本
或 This is a string
这样的文本。
用这样的称呼是因为它们是 字面上的 ——你用的就是它字面意义上的值或是内容。数字 2
总是表示它本身而非其他含义——它是一个 常量,因为它的值不能被改变。因此,所有的这些都被称作字面常量。
数字
数字主要分为两种类型——python整数和浮点数。
有关整数的例子即 2
,它只是一个整数。
有关浮点数(Floating Point Numbers,在英文中也会简写为 floats )的例子是 3.23
或 52.3E-4
。其中,E
表示 10 的幂。在这里,52.3E-4
表示 52.3 * 10^-4
。
针对有经验的程序员的提示
没有单独的
long
类型。int
类型可以指任何大小的整数。
字符串
一串字符串(String)是 字符(Characters) 的 序列(Sequence)。基本上,字符串就是一串词汇。
你将会在几乎所有你撰写的 Python 程序中使用字符串,所以对下面的部分你要多上点心。
单引号
你可以使用单引号来指定字符串,例如 '将我这样框进来'
或 'Quote me on this'
。
所有引号内的空间,诸如空格与制表符,都将按原样保留。
双引号
被双引号包括的字符串和被单引号括起的字符串其工作机制完全相同。例如 "你的名字是?"
或 "What's your name?"
。
三引号
你可以通过使用三个引号——"""
或 '''
来指定多行字符串。你可以在三引号之间自由地使用单引号与双引号。来看看这个例子:
'''这是一段多行字符串。这是它的第一行。
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''
字符串是不可变的
这意味着一旦你创造了一串字符串,你就不能再改变它。尽管这看起来像是一件坏事,但实际上并非如此。我们将会在稍后展现的多个程序中看到为何这一点不是一个限制。
针对 C/C++ 程序员的提示
Python 中没有单独的
char
数据类型。它并非切实必要,并且我相信你不会想念它的。
针对 Perl/PHP 程序员的提示
记住单引号括起的字符串和双引号括起的字符串是一样的——它们不存在任何区别。
格式化方法
有时候我们会想要从其他信息中构建字符串。这正是 format()
方法大有用武之地的地方。
将以下内容保存为文件 str_format.py
:
age = 20
name = 'Swaroop'
print('{0} was {1} years old when he wrote this book'.format(name, age))
print('Why is {0} playing with that python?'.format(name))
输出:
$ python str_format.py
Swaroop was 20 years old when he wrote this book
Why is Swaroop playing with that python?
它是如何工作的
一个字符串可以使用某些特定的格式(Specification),随后,format
方法将被调用,使用这一方法中与之相应的参数替换这些格式。
在这里要注意我们第一次应用这一方法的地方,此处 {0}
对应的是变量 name
,它是该格式化方法中的第一个参数。与之类似,第二个格式 {1}
对应的是变量 age
,它是格式化方法中的第二个参数。请注意,Python 从 0 开始计数,这意味着索引中的第一位是 0,第二位是 1,以此类推。
我们可以通过联立字符串来达到相同的效果:
name + 'is' +str(age) + 'years old'
但这样实现是很丑陋的,而且也容易出错。其次,转换至字符串的工作将由 format
方法自动完成,而不是如这般需要明确转换至字符串。再次,当使用 format
方法时,我们可以直接改动文字而不必与变量打交道,反之亦然。
同时还应注意数字只是一个可选选项,所以你同样可以写成:
age = 20
name = 'Swaroop'
print('{} was {} years old when he wrote this book'.format(name, age))
print('Why is {} playing with that python?'.format(name))
这样做同样能得到与前面的程序一样的输出结果。
Python 中 format
方法所做的事情便是将每个参数值替换至格式所在的位置。这之中可以有更详细的格式,例如:
# 对于浮点数 '0.333' 保留小数点(.)后三位
print('{0:.3f}'.format(1.0/3))
# 使用下划线填充文本,并保持文字处于中间位置
# 使用 (^) 定义 '___hello___'字符串长度为 11
print('{0:_^11}'.format('hello'))
# 基于关键词输出 'Swaroop wrote A Byte of Python'
print('{name} wrote {book}'.format(name='Swaroop', book='A Byte of Python'))
输出:
0.333
___hello___
Swaroop wrote A Byte of Python
由于我们正在讨论格式问题,就要注意 print
总是会以一个不可见的“新一行”字符(\n
)结尾,因此重复调用 print
将会在相互独立的一行中分别打印。为防止打印过程中出现这一换行符,你可以通过 end
指定其应以空白结尾:
print('a', end='')
print('b', end='')
输出结果如下:
ab
或者你通过 end
指定以空格结尾:
print('a', end=' ')
print('b', end=' ')
print('c')
输出结果如下:
a b c
转义序列
想象一下,如果你希望生成一串包含单引号('
)的字符串,你应该如何指定这串字符串?例如,你想要的字符串是 "What's your name?"
。你不能指定 'What's your name?'
,因为这会使 Python 对于何处是字符串的开始、何处又是结束而感到困惑。所以,你必须指定这个单引号不代表这串字符串的结尾。这可以通过 转义序列(Escape Sequence) 来实现。你通过 \
来指定单引号:要注意它可是反斜杠。现在,你可以将字符串指定为 'What\'s your name?'
。
另一种指定这一特别的字符串的方式是这样的: "What's your name?"
,如这个例子般使用双引号。类似地, 你必须在使用双引号括起的字符串中对字符串内的双引号使用转义序列。同样,你必须使用转义序列 \\
来指定反斜杠本身。
如果你想指定一串双行字符串该怎么办?一种方式即使用如Python教程前所述的三引号字符串,或者你可以使用一个表示新一行的转义序列——\n
来表示新一行的开始。下面是一个例子:
'This is the first line\nThis is the second line'
另一个你应该知道的大有用处的转义序列是制表符:\t
。实际上还有很多的转义序列,但我必须只在此展示最重要的一些。
还有一件需要的事情,在一个字符串中,一个放置在末尾的反斜杠表示字符串将在下一行继续,但不会添加新的一行。来看看例子:
"This is the first sentence. \
This is the second sentence."
相当于
"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
。
数据类型
变量可以将各种形式的值保存为不同的python数据类型。基本的类型是我们已经讨论过的数字与字符串。在后面的章节中,我们会了解如何通过 类(Classes) 类创建我们自己的类型。
对象
需要记住的是,Python 将程序中的任何内容统称为 对象(Object)。这是一般意义上的说法。我们以“某某对象(object)”相称,而非“某某东西(something)”。
针对面向对象编程语言用户的提示:
Python 是强(Strongly)面向对象的,因为所有的一切都是对象, 包括数字、字符串与函数。
接下来我们将看见如何使用变量与字面常量。你需要保存以下案例并试图运行程序。