doc: update docs/python.md (#407)

* doc: 优化 Python 判断语句的示例

* doc: 添加 Python 解包清单
This commit is contained in:
砹小翼
2023-08-03 21:32:50 +08:00
committed by GitHub
parent f421bfb764
commit ccd2310541

View File

@ -770,26 +770,36 @@ IndexError: list index out of range
Python 判断 Python 判断
------------ ------------
### 一般形式 ### if-else
```python ```python
num = 5 number = int(input('输入一个整数:'))
if num > 10: if number < 0:
print("num is totally bigger than 10.") print("您输入了一个负数。")
elif num < 10:
print("num is smaller than 10.")
else: else:
print("num is indeed 10.") print("您输入了一个非负整数。")
``` ```
### 单行形式 ### if-elif-else
```python ```python
>>> a = 330 number = int(input('输入一个整数:'))
>>> b = 200 if number < 0:
>>> r = "a" if a > b else "b" print("您输入了一个负数。")
>>> print(r) elif number == 0:
a print("您输入了一个 0 。")
else:
print("您输入了一个正数。")
```
### 三目运算
```python
scope = int(input('输入百分制成绩:'))
line = 60
tip = "及格" if scope >= line else "不及格"
# 相当于 scope >= line ? "及格" : "不及格"
print(tip)
``` ```
注意条件是放在中间的 注意条件是放在中间的
@ -941,6 +951,179 @@ add(5, 20) # => 25
(lambda x, y: x ** 2 + y ** 2)(2, 1) (lambda x, y: x ** 2 + y ** 2)(2, 1)
``` ```
Python 解包
--------
- 解包是将一个
[序列](https://docs.python.org/zh-cn/3/library/stdtypes.html#sequence-types-list-tuple-range)
内的多个元素依次重新分配到有限个容器的过程,这只发生在 **变量赋值**、**参数传递** 和 **生成式生成** 过程中。
- `_` 这个变量是命令行交互中最后一次计算得到的值,在程序设计中一般用来存放解包时不再需要的值。
但它的含义会因赋值而改变,比如标准库 [gettext](https://docs.python.org/zh-cn/3/library/gettext.html) 中常用作动态获取翻译文本。
### 等量解包
```python
ip, port = "127.0.0.1", 80
print(ip) # -> "127.0.0.1"
print(port) # -> 80
# 与以下代码等价
ip, port = ("127.0.0.1", 80)
# 与以下代码效果相同
ip, port = ["127.0.0.1", 80]
```
### 适量解包
```python
ip, _, port = "127.0.0.1:80".rpartition(":")
print(ip) # -> "127.0.0.1"
print(port) # -> "80"
# _ 这个变量此刻的值是 ":" ,但一般不再使用。
```
`_` 也是一个单一变量,不允许解包多个元素,因此变量与值必须一一对应。
### 过量解包
```python
major, minor, *parts = "3.10.2.beta".split(".")
print(major) # -> "3"
print(minor) # -> "10"
print(parts) # -> ["2", "beta"]
# 可将 parts 改为 _ 来表示不再需要后面的元素
```
这里的 `*` 就是收集[序列](https://docs.python.org/zh-cn/3/library/stdtypes.html#sequence-types-list-tuple-range)在解包过程中多出来的元素,
只能有一个,与向函数传递[位置参数](#位置参数)时的 `*` 别无二致。
### 解包取左边
```python
major, minor, *_ = "3.10.2.beta".split(".")
print(major) # -> "3"
print(minor) # -> "10"
```
### 解包取两边
```python
major, *_, level = "3.10.2.beta".split(".")
print(major) # -> "3"
print(level) # -> "beta"
```
### 解包取右边
```python
*_, micro, level = "3.10.2.beta".split(".")
print(micro) # -> "2"
print(level) # -> "beta"
```
### 解包集合
```python
a, b, *_ = {3, 2, 1}
print(a) # -> 1
print(b) # -> 2
print(_) # -> [3]
```
[集合](https://docs.python.org/zh-cn/3/library/stdtypes.html#set-types-set-frozenset)
中的元素是无序的,因此解包结果不能轻易确定。
### 解包迭代器
```python
a, b, *_ = range(3)
print(a) # -> 0
print(b) # -> 1
print(_) # -> [2]
```
支持
[迭代器](https://docs.python.org/zh-cn/3/library/stdtypes.html#iterator-types)
协议的对象也可被解包。
### 解包字典
```python
a, b, *_ = dict(a=1, b=2, c=3)
print(a) # -> "a"
print(_) # -> ["c"]
a, b, *_ = dict(a=1, b=2, c=3).values()
print(a) # -> 1
print(_) # -> [3]
```
### 生成式中的解包
```python
chars = (*"abc", *"def", "g", "h")
# -> ("a", "b", "c", "d", "e", "f", "g", "h")
digits = [*range(10), *"abcdef"]
# -> [0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
# "a", "b", "c", "d", "e", "f"]
part = {"小明": 18, "小亮": 22}
summary = {"小花": 16, **part}
print(summary)
# -> {"小花": 16, "小明": 18, "小亮": 22}
```
- 仅在列表/元组生成式中可以使用多个 `*`
- 仅在字典生成式中可以使用多个 `**`
### 迭代中解包
```python
students = [
("小明", 18),
("小亮", 22),
]
for k, v in students:
print(k) # -> "小明"、"小亮"
print(v) # -> 18、22
students = [
(0, ("小明", 18)),
(1, ("小亮", 22)),
]
for i, (k, v) in students:
print(i) # -> 0、1
print(k) # -> "小明"、"小亮"
print(v) # -> 18、22
```
### 函数中的解包
```python
def version(major, minor, *parts):
print(major) # -> "3"
print(minor) # -> "10"
print(parts) # -> ("2", "beta", "0")
version("3", "10", "2", "beta", "0")
# 过程类似于
major, minor, *parts = ("3", "10", "2", "beta", "0")
def version():
parts = "3.10.2.beta.0".split(".")
return *parts, "x64"
print(version())
# -> ("3", "10", "2", "beta", "0", "x64")
```
Python 模块 Python 模块
-------- --------