1.2.6 基础
只是打印Hello World
是不够的,我们想要做的不仅仅是这些,我们想带一些输入,处理它,然后输出。在Python中,我们使用常量和变量可以实现这些。除此之外,在这一章我们还将学习一些其他的概念。
注释
注释 是#
符号右边的任何文字,它对阅读程序的人有很大用处。
例如:
print('hello world') # 注意:print是一个函数
或者:
# 注意:print是一个函数
print('Hello World')
在程序中,应该尽可能使用合理的注释:
- 解释设想
- 解释重要决策
- 解释重要细节
- 解释你在试图解决的问题
- 解释程序中你在努力克服的问题,等等。
这对你的程序的读者是有用的,他们可以很容易地理解程序做什么。记住,六个月后这个人可以是你自己!
字面值
字面值的例子就是像5
、1.23
的数字,或是像这是一个字符串
或它一个字符串!
这样的字符串。它被称为字面,因为它是 字面 的^_^。你使用它的字面值。数字2
总是代表本身并没有什么其他的——它是一个 常数_,因为它的值是不能改变的。因此,所有这些被称为字面值。
数字
数字主要有两种类型--整型和浮点数。
2
是整数的一个例子。
浮点数的例子有3.23
和52.3E-4
。符号E
表示10的次方。在这种情况下,52.3E-4
的意思是52.3的-4次方
。
有经验的程序员要注意: Python中没有单独的
long
长整型。int
整型可以是任意大小的整数。
字符串
字符串是 字符 的一个 序列,字符串通常只是一串单词。
字符串几乎会出现在你写的每一个Python程序中,因此要注意:
单引号
你可以使用单引号例如'Quote me on this'
指定字符串。所有的空白,例如空格和制表符都按原样保留。
双引号
在双引号中的字符串和在单引号中的字符串工作起来完全一样。例如"What's your name?"
三重引号
您可以使用三重引号-("""
或'''
)指定多行字符串。在三重引号中您可以自由使用单引号和双引号。例如:
'''这是一个多行字符串。这是第一行。
这是第二行。
我问“你叫什么名字?”
他回答:“邦德,詹姆士·邦德”。
'''
字符串是不可改变的
这意味着,一旦您已经创建了一个字符串,你就不能改变它。虽然这看起来似乎是一件坏事,实际上未必。在我们后面看到的各种程序中,将会明白这不是一个限制。
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?
它是如何工作的:
一个字符串可以使用特定的格式,通过调用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-strings":
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'
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
函数每次都能输出在不同的行。如果想要去掉这个回车,可以给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会搞不清字符串是从哪开始又是从哪结束。所以你需要告诉python字符串中间的单引号并不是字符串的结束标志。 利用 转义字符 可以做到这点。 将单引号替换成 \'
- 注意反斜杠,这样字符串就变成'What\'s your name?'
了.
另一个办法是使用双引号"What's your name?"
。类似的,当你需要双引号的时候和单引号的情况类似,必须加上反斜杠 \"
, 而反斜杠也一样必须表示成\\
。
如果你需要一个双行字符串呢? 一个办法是使用前面提到的三引号或者使用换行的转义字符\n
开始新的一行,例如:
'This is the first line\nThis is the second line'
还有一个有用的转义字符\t
,表示Tab。转义字符太多了,本文只列举了最常用的。
另一个值得注意的地方是,在一个字符串末尾的反斜杠表示这个字符串与下一行的字符串要合并使用,中间没有回车, 例如:
"This is the first sentence. \
This is the second sentence."
上面的字符串等价于
"This is the first sentence. This is the second sentence."
原始字符串
如果你不希望Python对字符串进行特别处理, 例如不希望使用转义字符, 可以为字符串加上前缀r
或R
,这样的字符串就是 原始 字符串。例如:
r"Newlines are indicated by \n"
正则表达式用户请注意
永远使用原始字符串编写正则表达式, 否则会需要大量的反斜杠, 例如反向引用可以表示为
'\\1'
或r'\1'
.
变量
仅仅使用字面值会很无聊——我们需要某种方式存储可变的信息,然后使用它们。这就要引入 变量。变量是它的名字一样——他们的值会有所不同。例如,你可以用变量存储任何值。变量是你电脑中存储信息的内存的一部分。和字面值不一样的是,您需要某种方法来访问这些变量,因此需要给出他们的名字。
标识符命名
变量是标识符的一个例子。标识符 是用来识别一些 东西 的名字。我们遵循以下的标识符命名规则:
- 标识符的第一个字符必须是字母表中的一个字母(大写或小写的ASCII或Unicode字符)或下划线(
_
)。 - 标识符名称的其余部分可以包含字母(大写或小写的ASCII或Unicode字符)、下划线(
_
)或数字(0 - 9)。 - 标识符的名称都是区分大小写的。例如,
myname
和myName
不相同。注意前者中n
小写和后者中N
大写。 - 有效 的标识符名称的例子有:
i
,name_2_3
。无效 的标识符名字的例子有:2things
,this is spaced out
,my-name
和>a1b2_c3
。
数据类型
变量可以保存不同的 数据类型 的数值。基本类型是数字和字符串,我们已经讨论了。在后面的章节中,我们将看到如何使用类创建自己的类型。
对象
记住,Python把程序中使用的任何东西都看作 对象。这意味着,在Python中,我们说的“这个东西”,其实就是“这个对象”。
面向对象编程的用户要注意: Python是一门强面向对象语言,在Python中一切皆是对象,包括数字、字符串和函数。
现在,我们将看到如何使用变量以及字面值。请保存下面的示例,然后运行这个程序。
怎样写Python程序
从此以后,保存和运行一个Python程序的标准流程如下:
使用VSCode
- 打开VSCode。
- 新建一个文件,保存为指定的文件名。
- 将示例代码输入到文件中。
- 点击右上角的绿色小三角按钮运行程序。
注意:如果你需要指定命令行参数,使用菜单项查看
->运行
,点击create a launch.json file
,然后在弹出的对话框里选择Python File
,就可以创建一个launch.json
文件。通常情况下文件看其实是这样的:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
}
]
}
如果想要增加命令行参数,在configurations
中增加args
,如下所示:
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python: 当前文件",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"args": ["-d", "test.py"]
}
]
}
然后运行即可
使用其他编辑器
- 打开选择的编辑器。
- 输入例子中给出的程序代码。
- 保存为指定的文件名。
- 在命令行使用
python program.py
运行程序。
例如: 使用变量和字面值
输入并运行下面的程序
# Filename : 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.
它是如何工作的
下面介绍这个程序如何工作的。首先,我们使用赋值运算符(=
)为变量i
指定了字面值5
,这一行叫做一个语句,因为它执行了一些事情。在这个例子中,我们将名为i
的变量与值5
联系起来。接下来,我们使用print
函数打印i
的值,不出所料,打印变量的值到屏幕上。
然后,我们给存储在变量i
中的值加1
后,再存回到i
中。然后,我们把它打印出来,和我们想的一样,我们得到值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 = '这是一个字符串。 \
这是字符串的继续。'
print(s)
输出结果为:
这是一个字符串。这是字符串的继续。
同样的,
i = \
5
与
i = 5
相同
有一种情况不需要反斜杠就可以连接多行。这就是当逻辑行有一个左圆括号、左方括号或左花括号,但在同一行没有一个右括号结束它。这被称为隐式行连接。当我们在以后的章节编写程序使用列表时,看到这种情况。
缩进
Python中的空白非常重要。实际上应该这么说,在一行开始的空白非常重要。这被称为 缩进。在逻辑行开头的前导空白(空格和制表符)用于确定逻辑行的缩进级别,它用于依次确定语句的分组。
这意味着一起的语句必须有相同的缩进。每一个这样的语句组被称为块。在后面的章节,我们将会举例说明块是何等的重要。
你应该记住的一件事是,错误的缩进可以产生错误。例如:
i = 5
print('值是 ', i) # 错误! 注意在行的开头有一个空格
print('重复,值是 ', i)
当运行它时,将会发生下面的错误:
File "whitespace.py", line 4
print('Value is ', i) # Error! Notice a single space at the start of the line
^
IndentationError: unexpected indent
请注意,这里第二行的开头有一个空格。Python的错误提示告诉我们程序的语法是无效的,即程序写的不正确。这意味着,你不能任意开始语句中的新块(当然,除了默认的主块,您一直已经使用的)。您可以使用新块的情况,将在后面的章节详细,如控制流
。
如何缩进
缩进只使用4个空格,这是Python官方推荐的标准。好的编辑器会为你自动这样做。确保你使用数量一致的缩进空格,否则你的程序将无法运行,或者产生未知的输出结果。
静态语言程序员应注意
Python为块总是使用缩进,从来不用花括号。运行
from __future__ import braces
可以了解更多。
小结
现在,我们已经经历了许多细节,我们可以转到更有趣的东西,如控制流语句。在这之前你一定要熟悉本章的内容。