> For the complete documentation index, see [llms.txt](https://coding-girls-club.gitbook.io/python-101/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://coding-girls-club.gitbook.io/python-101/2.python/3-python-syntax.md).

# 2.3 Python 语法

> Cooking time: 30 mins active / 45 mins passive
>
> **Learning by Doing**:
>
> * 建议切换到英文输入法编程，可以避免一些用错符号的错误。
> * **Tasks for Learners**: 请学员创建第二个 Python 文件 `python_syntax_practice.py`, 对下列 Python 语法进行练习。
> * **Tasks for Coaches**: 请教练对学员的练习提供一定的辅助，请控制好时间。

## 魔法注释

惯例：把这一行写在 Python 文件的头一行，表达这个文件的非 [ASCII](https://zh.wikipedia.org/wiki/ASCII) 字符的编码为 [UTF-8](https://zh.wikipedia.org/wiki/UTF-8)，不然遇到中文会出现编码错误。

```python
# encoding: utf-8
```

## 注释

注释是写给阅读代码的人看的，计算机会忽略注释。一行中以 `#` 开始直到行末的部分都属于注释。

```python
# 可以在代码中穿插写一些笔记，不影响程序的执行。
```

## 基本数据类型

整数，类型为 `int`

```python
1234
-1234
```

小数（浮点数），类型为 `float`，例如

```python
3.1415926
```

字符串，类型为 `str`

```python
"双引号字符串" # 注意要用半角英文引号包起来
'单引号字符串'
```

字符串中，空格也是字符：

```python
" " # 这也是一个字符串
```

有一些字符也是没有对应的字形（Glyph），但是可以用 **转义字符** 表达:

```python
"\n" # 换行
"\r" # 回车
"\t" # tab
```

以上的字符串写法有个限制：只能写在一行内。Python 支持三个引号的多行字符串语法，方便书写多行的内容：

```python
"""
床前明月光
疑是地上霜
举头望明月
低头思故乡
"""
```

特殊量 -- 代表什么都没有

```python
None
```

查看数据的类型

```python
type(3) # int
```

## 运算

在 IPython 中输入下面的表达式试试：

```python
1 + 1
2.5 * 3
4 / 2
```

`%` 返回除法的余数：

```python
5 % 3
```

除以 0 会得到 NaN（Not a Number）

```python
1 / 0 # NaN
```

字符串也可以进行连接运算（使用 `+` 运算符）

```python
"hello" + " world"
```

注意：全角符号和半角符号的区别。

## 变量

用一个名称代表一个值（`=` 叫做赋值运算符）

```python
a = 3
some_variable_1 = "一个值" # 变量名可以包含字母、数字和下划线，但不能以数字打头
```

这个符号代表的值可以重新赋值，所以这个量称为变量 -- variable。

运算的结果可以赋予变量，变量也可以参加运算，例如下面计算平均值的代码：

```python
sum = 1 + 2 + 3 + 4 + 5
average = sum / 5.0
print(average)
```

## 条件

在 Python 中表达逻辑：“如果” 满足某种条件 “那么” 你就给我做这件事情。

布尔类型（注意大小写）

```python
True
False
```

条件语法

```python
if True:
    print("真")
if False:
    print("假")
```

注意：

* 「如果」部分以关键字 `if` 开始，接着是条件表达式，后面必须再加上冒号 `:`
* 「那么」部分的缩进要比 `if` 行深，推荐用 4 个空格缩进（参考 [PEP8](https://www.python.org/dev/peps/pep-0008/#indentation)）

上面两个条件内容互斥，我们可以用双路条件 `if`……`else`：

```python
t = True
if t:
    print(“真”)
else:
    print("假")
```

布尔类型上可以用布尔运算:

* 而且 `and`
* 或者 `or`
* 否定 `not`

练习：思考下面几个表达式的值并在 IPython 验证：

```python
True and True
not False
False or True
```

比较运算符可以判断两个值是否相等或者孰大孰小：

* `==` 等于（两个等号，注意和赋值运算的不同）
* `>` 大于
* `<` 小于
* `!=` 不等于
* `>=` 大于或者等于
* `<=` 小于或者等于

练习：思考下面几个表达式的值并在 IPython 验证：

```python
1 <= 3
5 > 4 and 4 > 3
```

综合运用条件语句和比较运算符：「如果天气晴朗并且低于 30 度就出去玩」

```python
weather = "rainy"
temperature = 20

if weather == "sunny" and temperature < 30:
    print("lets go out!")
```

## 循环

计算机是处理数据的机器。循环（迴圈）告诉机器重复做相同的工作。

`while` 循环打印 0 到 100

```python
a = 0
while a <= 100:
    print(a)
    a = a + 1
```

同样注意别忘了 `:` 和缩进

循环一般由循环条件和循环体组成。

练习：使用 Spyder 观察程序的执行：

1. 在 temp.py 中输入代码 &#x20;

   ![](https://3943080474-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP9hg6L7ZMwZCjoW01m%2F-LPjhLamOY_CQyH-5TFF%2F-LPjhMfXQUuVNhQb6U9W%2Finput_code.png?generation=1540546201577600\&alt=media)
2. 点击 Debug file 工具 &#x20;

   ![](https://3943080474-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP9hg6L7ZMwZCjoW01m%2F-LPjhLamOY_CQyH-5TFF%2F-LPjhMfZeoKXMhv708IB%2Fdebug_tools.png?generation=1540546201698912\&alt=media)
3. 多次点击 Run current line 工具，观察 Variable explorer 的变化 &#x20;

   ![](https://3943080474-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LP9hg6L7ZMwZCjoW01m%2F-LPjhLamOY_CQyH-5TFF%2F-LPjhMfaZQ1PLvajqUW9%2Fvariable_explorer.png?generation=1540546202069147\&alt=media)
4. 最后点击 Stop debugging 结束 debug

**死循环** 的意思是：不会结束的循环。

```python
import time
while True:
    print("I am stuck")
    time.sleep(1)
```

要结束程序，可以按 Ctrl + C 退出。(一个手指按住 Ctrl 键，然后另一个手指按 C 键，退出时解释器会报告一段错误，意思是收到了中断信号)。

循环控制：

* `continue` 进入下一个轮回
* `break` 结束循环

例：下面的代码打印 1 到 10，通过判断 `i` 是否增加到 10 决定结束循环：

```python
i = 1
while True:
    print(i)
    if i == 10:
        break
    i = i + 1
```

例：下面的代码打印 1 到 10 之间的偶数，当 `i` 是奇数时通过 `continue` 跳过循环体中的其余代码。

```python
i = 1
while i <= 10:
    if i % 2 == 1:
        i = i + 1
        continue
    print(i)
    i = i + 1
```

## 函数

我们学习了用一个词代表值（变量），在 Python 中我们也能用一个词代表一段代码。

定义函数用 `def` 关键字，接上函数名称，参数列表和冒号。试理解下面的代码：

```python
def double(x):
    return x * 2
```

在缩进的代码块中编写函数体，使用 `return` 返回需要的内容。

之前我们学习的 `print`, `len` 都是函数，而且是是 Python 自带的函数 (built-in functions)。

调用函数：

```python
double(4)
```

由于函数返回的是一个值，这个值也可以赋予给变量：

```python
twice = double(4)
four_times = double(twice)
```

函数返回的值也可以传递给下一个函数：

```python
print(double(4))
```

小提示：Python 的运算符 `+`，`-`，`*`，`/` 等等其实都是函数。

## 输入和输出简介

IO 是输入/输出（input / output）的缩写。

IO 是程序能从真实世界获取信息 (输入)，对真实世界产生影响（输出）的基础。

典型的输入包括：用户键盘输入，鼠标点击，读取文件，读取网络数据，获取传感器的读数，……

典型的输出包括：在屏幕显示文字，在屏幕绘制图像，输出到打印机，发出声音，发送数据到网络端口，……

## 读写文件

读写文件是 Python 里最基本的 IO 操作之一。

`open` 函数打开一个文件，`"r"` 模式是读取，`"w"` 模式是写入。

以读取模式打开一个文件 "foo.csv"，并返回对应的文件对象：

```python
f = open("foo.csv", "r")
```

关闭一个文件对象：

```python
f.close()
```

下面的代码打开文件，读取文件的内容，然后关闭文件。

```python
f = open("foo.csv", "r")
data = f.read()
f.close()

print(data)
```

但是，在对文件操作的时候有可能发生异常！例如文件编码不正确，或者出现了没考虑到的某种状况，就会出错。

> 没处理各种异常情况的一段程序，不能成为一个产品

Python 提供了 `with .. as` 语法， 不用处理异常和写 `close`，就能保证处理文件后能自动关闭它。

读取一个文件

```python
with open("foo.csv", "r") as f:
    data = f.read()
```

写入一个文件

```python
with open("foo.csv", "w") as f:
    f.write(data)
```
