# 基础
只能输出`Hello World`是不够的,我们需要更加复杂的功能,比如我们输入一些内容,处理它,然后输出。在Python中,我们使用常量和变量可以实现这些。除此之外,在这一章我们还将学习一些其他的概念。
## 注释
_注释_ 是`#`符号右边的内容,有了注释可以帮助其他人阅读你的程序。
例如:
```python
print('hello world') # 注意:print是一个函数
```
或者:
```python
# 注意:print是一个函数
print('Hello World')
```
程序中的注释应该尽可能的多,可以是以下内容:
- 解释假设
- 解释重要决策
- 解释重要细节
- 解释你在试图解决的问题
- 解释程序中你在努力克服的问题,等等。
[代码表示方法,注释表示原因。](http://www.codinghorror.com/blog/2006/12/code-tells-you-how-comments-tell-you-why.html)
程序的易读性非常重要,可以帮助阅读你的代码的人理解它的功能。而且,这个人很有可能是六个月之后的你自己!
## 字面值
字面值可以是数字,例如`5`、`1.23`,也可以是`这是一个字符串`或`它一个字符串!`这样的字符串。
它被称为字面值,因为它是 _字面_ 的^__^。直接使用它的字面值。`2`就是那个自然数`2`,没有其他的含义,它是一个 _常数_,它的值是不能改变的。因此这类数值被称为字面值。
## 数字
数字主要有两种类型--整数和浮点数。
整数例如`2`。
浮点数例如`3.23`和`52.3E-4`。符号`E`表示10的次方。在这种情况下,`52.3E-4`的意思是`52.3的-4次方`。
> **有经验的程序员要注意:**
> Python中没有单独的`long`长整型。`int`整型可以是任意大小的整数。
## 字符串
字符串是 _字符_ 的 _序列_,大部分情况下字符串就是一串单词。
字符串几乎会出现在你写的每一个Python程序中,因此请仔细阅读以下内容。
### 单引号
你可以使用单引号指定字符串,例如`'Quote me on this'`。所有的空白,包括空格和制表符(TAB键)都按原样保留。
### 双引号
Python中双引号和单引号一样,可以用来指定字符串。例如`"What's your name?"`
### 三重引号
您可以使用三重引号-(`"""`或`'''`)指定多行字符串。在三重引号中您可以随意使用单引号和双引号。例如:
```python
'''这是一个多行字符串。这是第一行。
这是第二行。
我问:“你叫什么名字?”
他回答:“邦德,詹姆士·邦德”。
'''
```
#### 字符串是不可改变的
这意味着,一旦您创建了一个字符串,你就不能改变它。虽然这看起来有些刻板,实际上未必。在后面的章节我们写了很多程序之后,将会明白这并不是一个限制。
> **C/C++程序员要注意:**
> 在Python中没有单独的`char`(字符型)数据。对于编程来说它并不是必须的,我相信你也不会想念它。
> **Perl/PHP程序员要注意:**
> 记住,单引号字符串和双引号字符串是相同的——使用方式完全一致。
#### 字符串格式化
有时候我们需要使用某些信息构建字符串。这时我们可以使用`format()`方法。
保存下面几行代码到文件`str_format.py`中:
```python
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,以此类推。
当然,我们也可以使用字符串的连接达到上述目的
```python
name + 'is' + str(age) + 'years old'
```
首先,这样写代码不那么优雅且容易出错。其次,`format`方法会自动将参数转换为字符串,而不是显式地转换为字符串。最后,当使用的`format`方法,我们无需关注所使用的变量就可以改变信息的内容,反之亦然。
还要注意,这些数字(索引)都是可选的,所以你也可以写成:
```python
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
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":
```python
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`方法中会使用每个参数值替代格式中的对应的位置。关于格式,下面有更详细的说明:
```python
# 用 (.) 表示浮点数的精度,下面代码的结果为'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`参数并设置为空即可,例如:
```python
print('a', end='')
print('b', end='')
```
输出为:
```
ab
```
也可以设置`end`为空格:
```python
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`开始新的一行,例如:
```python
'This is the first line\nThis is the second line'
```
还有一个有用的转义字符`\t`,表示Tab。转义字符太多了,本文只列举了最常用的。
另一个值得注意的地方是,在一个字符串末尾的反斜杠表示这个字符串与下一行的字符串要合并使用,中间没有回车, 例如:
```python
"This is the first sentence. \
This is the second sentence."
```
上面的字符串等价于
```python
"This is the first sentence. This is the second sentence."
```
### 原始字符串
如果你不希望Python对字符串进行特别处理, 例如不希望使用转义字符, 可以为字符串加上前缀`r`或`R`,这样的字符串就是 _原始_ 字符串。例如:
```python
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
1. 打开VSCode。
2. 新建一个文件,保存为指定的文件名。
3. 将示例代码输入到文件中。
4. 点击右上角的绿色小三角按钮运行程序。
注意:如果你需要指定命令行参数,使用菜单项`查看`->`运行`,点击`create a launch.json file`,然后在弹出的对话框里选择`Python File`,就可以创建一个`launch.json`文件。通常情况下文件看其实是这样的:
```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`,如下所示:
```json
{
// 使用 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"]
}
]
}
```
然后运行即可
### 使用其他编辑器
1. 打开选择的编辑器。
2. 输入例子中给出的程序代码。
3. 保存为指定的文件名。
4. 在命令行使用`python program.py`运行程序。
### 例如: 使用变量和字面值
输入并运行下面的程序
```python
# 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鼓励一行写一个语句的用法,这使代码更可读。
如果您想要一个物理行包括多个逻辑行,那么您必须使用一个表示逻辑行/语句结束的分号`;`显式地指明。例如:
```python
i = 5
print(i)
```
与
```python
i = 5;
print(i);
```
等效。同样可写成:
```python
i = 5; print(i);
```
或者是:
```python
i = 5; print(i)
```
然而,我**强烈建议**你坚持**一个物理行最多包括一个逻辑行**。这意味着你永远都不要使用分号。事实上,我**从未**使用,甚至在Python程序中从来没有见过一个分号。
上述观念在以下的情况中更显示出它的可取之处:如果你有一个很长的代码行,你可以通过使用反斜杠把它分解为多个物理行。这是被称为**显式行连接**,在这里反斜杠又被叫做续行符:
```python
s = '这是一个字符串。 \
这是字符串的继续。'
print(s)
```
输出结果为:
```
这是一个字符串。这是字符串的继续。
```
同样的,
```python
i = \
5
```
与
```
i = 5
```
相同
有一种情况不需要反斜杠就可以连接多行。这就是当逻辑行有一个左圆括号、左方括号或左花括号,但在同一行没有一个右括号结束它。这被称为**隐式行连接**。当我们在以后的章节编写程序使用列表时,看到这种情况。
### 缩进
Python中的空白非常重要。实际上应该这么说,**在一行开始的空白非常重要**。这被称为 **缩进**。在逻辑行开头的前导空白(空格和制表符)用于确定逻辑行的缩进级别,它用于依次确定语句的分组。
这意味着一起的语句**必须**有相同的缩进。每一个这样的语句组被称为**块**。在后面的章节,我们将会举例说明块是何等的重要。
你应该记住的一件事是,错误的缩进可以产生错误。例如:
```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`可以了解更多。
### 小结
现在,我们已经经历了许多细节,接下来我们会接触到更有趣的东西,如控制流语句。在这之前你一定要熟悉本章的内容。
- 开始学习
- 搭建Python开发环境
- 简明Python教程
- 致敬
- 前言
- 关于Python
- 安装
- 第一步
- 基础
- 运算符和表达式
- 控制流
- 函数
- 模块
- 数据结构
- 实战案例
- 面向对象编程
- 输入与输出
- 异常处理
- 标准库
- 更多
- 继续学习
- 附录:免费/自由和开放源码软件
- 附录: 关于
- 附录: 版本历史
- 附录: 翻译
- 附录: 参与翻译工作
- 反馈
- Django Step Sy Step
- 第一讲 从简单到复杂
- 第二讲 做加法的例子
- 第三讲 使用Template
- 第四讲 生成csv格式文件
- 第五讲 session示例
- 第六讲 wiki的例子
- 第七讲 通讯录的例子
- 第八讲 文件导入和导出
- 第九讲 通讯录的美化
- 第十讲 扩展django的模板
- 第十一讲 用户管理
- 第十二讲 搜索和部署
- 第十三讲 Ajax的实现(一)
- 第十四讲 Ajax的实现(二)
- 第十五讲 i18n的一个简单实现
- 第十六讲 自定义Calendar Tag
- 第十七讲 View,Template和Tag
- Django开发实战
- Python开发规范
- Django项目的gitignore
- 怎样配置开发环境的settings
- 如何使用Django和Vue.js构建项目
- 使用WebSocket开发网页聊天室
- 怎样使Django Admin显示中文
- 怎样使Model在Admin界面中显示中文
- 使用Django Admin怎样上传并显示图片
- 解决Django模板和Vue指令花括号冲突的问题
- 使用Django和Vue开发微信公众号
- 使用Django和Vue调用微信JSSDK开发微信支付