基础

只打印 hello world 是不够的,对吧?你想做更多的事情——你想接收一些输入,对其进行处理,然后得到一些输出。在 Python 中,我们可以使用常量和变量来实现这一点,在本章中我们还将学习一些其他概念。

注释

注释# 符号右边的任何文本,主要作为程序读者的笔记。

例如:

print('hello world') # 注意 print 是一个函数

或者:

# 注意 print 是一个函数
print('hello world')

在你的程序中尽可能多地使用有用的注释来:

  • 解释假设
  • 解释重要的决定
  • 解释重要的细节
  • 解释你试图解决的问题
  • 解释你在程序中试图克服的问题等。

代码告诉你怎么做,注释应该告诉你为什么

这对程序的读者很有用,因为他们可以轻松地理解程序在做什么。记住,那个人可能是六个月后的你自己!

字面常量

字面常量的例子包括数字 51.23,或字符串 'This is a string'"It's a string!"

它被称为字面量是因为它是字面的——你直接使用它的字面值。数字 2 始终代表它自己,没有其他含义——它是一个常量,因为它的值不能被改变。因此,所有这些都被称为字面常量。

数字

数字主要有两种类型——整数(integer)和浮点数(float)。

整数的一个例子是 2,它就是一个整数。

浮点数(简称 float)的例子有 3.2352.3E-4E 表示法表示 10 的幂。在这种情况下,52.3E-4 表示 52.3 * 10^-4

给有经验的程序员的提示

没有单独的 long 类型。int 类型可以是任意大小的整数。

字符串

字符串是字符序列。字符串基本上就是一堆文字。

在你编写的几乎每一个 Python 程序中都会用到字符串,所以请注意以下内容。

单引号

你可以使用单引号来指定字符串,例如 'Quote me on this'

引号内的所有空白(即空格和制表符)都会原样保留。

双引号

双引号中的字符串与单引号中的字符串工作方式完全相同。例如 "What's your name?"

三引号

你可以使用三引号——("""''')来指定多行字符串。你可以在三引号内自由使用单引号和双引号。例如:

'''This is a multi-line string. This is the first line.
This is the second line.
"What's your name?," I asked.
He said "Bond, James Bond."
'''

字符串是不可变的

这意味着一旦你创建了一个字符串,你就不能更改它。虽然这看起来可能是一件坏事,但实际上并不是。我们将在后面的各种程序中看到为什么这不是一个限制。

给 C/C++ 程序员的提示

Python 中没有单独的 char 数据类型。实际上并不需要它,我相信你不会想念它的。

给 Perl/PHP 程序员的提示

请记住,单引号字符串和双引号字符串是相同的——它们没有任何区别。

format 方法

有时我们可能想从其他信息构造字符串。这就是 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?

工作原理

字符串可以使用某些格式说明符,随后可以调用 format 方法,将这些格式说明符替换为 format 方法的相应参数。

观察第一个用法,我们使用 {0},它对应变量 name,这是 format 方法的第一个参数。同样,第二个格式说明符是 {1},对应 age,这是 format 方法的第二个参数。注意 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))

这将产生与前一个程序完全相同的输出。

我们还可以给参数命名:

age = 20
name = 'Swaroop'

print('{name} was {age} years old when he wrote this book'.format(name=name, age=age))
print('Why is {name} playing with that python?'.format(name=name))

这将产生与前一个程序完全相同的输出。

Python 3.6 引入了一种更短的命名参数方式,称为"f-string":

age = 20
name = 'Swaroop'

print(f'{name} was {age} years old when he wrote this book')  # 注意字符串前面的 'f'
print(f'Why is {name} playing with that python?')  # 注意字符串前面的 'f'

这将产生与前一个程序完全相同的输出。

Python 在 format 方法中所做的是将每个参数值替换到格式说明符的位置。还可以有更详细的格式规范,例如:

# 浮点数 '0.333' 的小数点(.)精度为 3
print('{0:.3f}'.format(1.0/3))
# 用下划线(_)填充,文本居中
# (^) 宽度为 11 '___hello___'
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 会困惑于字符串从哪里开始到哪里结束。所以,你必须指定这个单引号不表示字符串的结尾。这可以通过转义序列来实现。你将单引号指定为 \':注意反斜杠。现在,你可以将字符串指定为 '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."

等同于

"This is the first sentence. This is the second sentence."

原始字符串

如果你需要指定一些不处理特殊字符(如转义序列)的字符串,那么你需要通过在字符串前加上 rR 来指定一个原始字符串。例如:

r"Newlines are indicated by \n"

给正则表达式用户的提示

在处理正则表达式时,始终使用原始字符串。否则,可能需要大量的反斜杠转义。例如,反向引用可以写为 '\\1'r'\1'

变量

只使用字面常量很快就会变得无聊——我们需要某种方式来存储任何信息并对其进行操作。这就是变量发挥作用的地方。变量正如其名——它们的值可以变化,即你可以使用变量存储任何东西。变量只是你计算机内存中存储信息的一部分。与字面常量不同,你需要某种方法来访问这些变量,因此你给它们起名字。

标识符命名

变量是标识符的例子。标识符是用来标识某样东西的名字。在命名标识符时,你需要遵循一些规则:

  • 标识符的第一个字符必须是字母(大写 ASCII 或小写 ASCII 或 Unicode 字符)或下划线(_)。
  • 标识符名称的其余部分可以由字母(大写 ASCII 或小写 ASCII 或 Unicode 字符)、下划线(_)或数字(0-9)组成。
  • 标识符名称区分大小写。例如,mynamemyName相同的。注意前者是小写的 n,后者是大写的 N
  • 有效的标识符名称示例有 iname_2_3无效的标识符名称示例有 2thingsthis is spaced outmy-name>a1b2_c3

数据类型

变量可以保存不同类型的值,称为数据类型。基本类型是数字和字符串,我们已经讨论过了。在后面的章节中,我们将看到如何使用 创建自己的类型。

对象

请记住,Python 将程序中使用的任何东西都称为对象。这是在一般意义上说的。我们不说"某个东西",而是说"某个对象"。

给面向对象编程用户的提示

Python 是强面向对象的语言,在这个意义上一切都是对象,包括数字、字符串和函数。

现在我们将看到如何将变量与字面常量一起使用。保存以下示例并运行程序。

如何编写 Python 程序

从现在开始,保存和运行 Python 程序的标准步骤如下:

对于 PyCharm

  1. 打开 PyCharm
  2. 使用提到的文件名创建新文件。
  3. 输入示例中给出的程序代码。
  4. 右键点击并运行当前文件。

注意:当你需要提供命令行参数时,点击 Run -> Edit Configurations,在 Script parameters: 部分输入参数,然后点击 OK 按钮:

PyCharm 命令行参数

对于其他编辑器

  1. 打开你选择的编辑器。
  2. 输入示例中给出的程序代码。
  3. 使用提到的文件名保存为文件。
  4. 使用命令 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)

输出:

5
6
This is a multi-line string.
This is the second line.

工作原理

这个程序是这样工作的。首先,我们使用赋值运算符(=)将字面常量值 5 赋给变量 i。这一行被称为语句,因为它声明了要执行的操作,在这种情况下,我们将变量名 i 与值 5 关联起来。接下来,我们使用 print 语句打印 i 的值,不出所料,它只是将变量的值打印到屏幕上。

然后我们将 i 中存储的值加 1,并将结果存回去。然后我们打印它,不出所料,我们得到了值 6

同样,我们将字面字符串赋给变量 s,然后打印它。

给静态语言程序员的提示

变量只需赋值即可使用。不需要/不使用声明或数据类型定义。

逻辑行与物理行

物理行是你在编写程序时看到的内容。逻辑行是 Python 看作单个语句的内容。Python 隐式地假设每个物理行对应一个逻辑行

逻辑行的一个例子是像 print('hello world') 这样的语句——如果它在单独的一行上(正如你在编辑器中看到的那样),那么它也对应一个物理行。

隐式地,Python 鼓励每行只写一条语句,这使得代码更具可读性。

如果你想在单个物理行上指定多个逻辑行,那么你必须使用分号(;)显式指定,分号表示逻辑行/语句的结束。例如:

i = 5
print(i)

实际上等同于

i = 5;
print(i);

也等同于

i = 5; print(i);

以及

i = 5; print(i)

但是,我强烈建议你坚持在每个物理行上最多只写一条逻辑行。关键是你永远不应该使用分号。事实上,我在 Python 程序中从未使用甚至见过分号。

有一种情况下这个概念真的很有用:如果你有一行很长的代码,你可以使用反斜杠将其分成多个物理行。这被称为显式行连接

s = 'This is a string. \
This continues the string.'
print(s)

输出:

This is a string. This continues the string.

同样,

i = \
5

等同于

i = 5

有时候,有一种隐式的情况不需要使用反斜杠。这就是当逻辑行有开始括号、开始方括号或开始花括号但没有对应的结束符号时。这被称为隐式行连接。当我们在后面的章节中使用 list 编写程序时,你会看到它的实际应用。

缩进

空白在 Python 中很重要。实际上,行首的空白很重要。这被称为缩进。逻辑行开头的前导空白(空格和制表符)用于确定逻辑行的缩进级别,进而用于确定语句的分组。

这意味着属于同一组的语句必须具有相同的缩进。每个这样的语句集被称为一个代码块。我们将在后面的章节中看到代码块的重要性示例。

你需要记住的一件事是,错误的缩进会导致错误。例如:

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 来了解更多。

总结

现在我们已经了解了许多细节,可以继续学习更有趣的内容,比如控制流语句了。请确保你已经熟悉了本章所读的内容。

results matching ""

    No results matching ""