reference/docs/python.md
2023-02-20 11:07:54 +08:00

1254 lines
19 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Python 3 备忘清单
===
Python 备忘单是 [Python 3](https://www.python.org/) 编程语言的单页参考表
入门
-----
### 介绍
- [Python](https://www.python.org/) _(python.org)_
- [Learn X in Y minutes](https://learnxinyminutes.com/docs/python/) _(learnxinyminutes.com)_
- [Regex in python](./regex.md#python-中的正则表达式) _(jaywcjlove.github.io)_
### Hello World
```python
>>> print("Hello, World!")
Hello, World!
```
Python 中著名的“Hello World”程序
### 变量
```python
age = 18 # 年龄是 int 类型
name = "John" # name 现在是 str 类型
print(name)
```
Python 不能在没有赋值的情况下声明变量
### 数据类型
<!--rehype:wrap-class=row-span-2-->
:-| :-
:-| :-
`str` | Text
`int`, `float`, `complex` | Numeric
`list`, `tuple`, `range` | Sequence
`dict` | Mapping
`set`, `frozenset` | Set
`bool` | Boolean
`bytes`, `bytearray`, `memoryview` | Binary
查看: [Data Types](#python-数据类型)
### Slicing String
```python
>>> msg = "Hello, World!"
>>> print(msg[2:5])
llo
```
查看: [Strings](#python-字符串)
### Lists
```python
mylist = []
mylist.append(1)
mylist.append(2)
for item in mylist:
print(item) # 打印输出 1,2
```
查看: [Lists](#python-lists)
### If Else
```python
num = 200
if num > 0:
print("num is greater than 0")
else:
print("num is not greater than 0")
```
查看: [流程控制](#python-流程控制)
### 循环
```python
for item in range(6):
if item == 3: break
print(item)
else:
print("Finally finished!")
```
查看: [Loops](#python-循环)
### 函数
```python
>>> def my_function():
... print("来自函数的你好")
...
>>> my_function()
来自函数的你好
```
查看: [Functions](#函数)
### 文件处理
<!--rehype:wrap-class=col-span-2-->
```python
with open("myfile.txt", "r", encoding='utf8') as file:
for line in file:
print(line)
```
查看: [文件处理](#python-文件处理)
### 算术
```python
result = 10 + 30 # => 40
result = 40 - 10 # => 30
result = 50 * 5 # => 250
result = 16 / 4 # => 4.0 (Float Division)
result = 16 // 4 # => 4 (Integer Division)
result = 25 % 2 # => 1
result = 5 ** 3 # => 125
```
`/` 表示 x 和 y 的商,`//` 表示 x 和 y 的底商,另见 [StackOverflow](https://stackoverflow.com/a/183870/13192320)
### 加等于
```python
counter = 0
counter += 10 # => 10
counter = 0
counter = counter + 10 # => 10
message = "Part 1."
# => Part 1.Part 2.
message += "Part 2."
```
### f-字符串(Python 3.6+)
```python
>>> website = 'Quick Reference'
>>> f"Hello, {website}"
"Hello, Quick Reference"
>>> num = 10
>>> f'{num} + 10 = {num + 10}'
'10 + 10 = 20'
```
查看: [Python F-Strings](#python-f-字符串自-python-36-起)
Python 数据类型
---------------
### 字符串
```python
hello = "Hello World"
hello = 'Hello World'
multi_string = """Multiline Strings
Lorem ipsum dolor sit amet,
consectetur adipiscing elit """
```
查看: [Strings](#python-字符串)
### 数字
```python
x = 1 # int
y = 2.8 # float
z = 1j # complex
>>> print(type(x))
<class 'int'>
```
### 布尔值
```python
my_bool = True
my_bool = False
bool(0) # => False
bool(1) # => True
```
### Lists
```python
list1 = ["apple", "banana", "cherry"]
list2 = [True, False, False]
list3 = [1, 5, 7, 9, 3]
list4 = list((1, 5, 7, 9, 3))
```
查看: [Lists](#python-lists)
### 元组 Tuple
```python
my_tuple = (1, 2, 3)
my_tuple = tuple((1, 2, 3))
```
类似于 List 但不可变
### Set
```python
set1 = {"a", "b", "c"}
set2 = set(("a", "b", "c"))
```
一组独特的项目/对象
### 字典 Dictionary
```python
>>> empty_dict = {}
>>> a = {"one": 1, "two": 2, "three": 3}
>>> a["one"]
1
>>> a.keys()
dict_keys(['one', 'two', 'three'])
>>> a.values()
dict_values([1, 2, 3])
>>> a.update({"four": 4})
>>> a.keys()
dict_keys(['one', 'two', 'three', 'four'])
>>> a['four']
4
```
Key值对JSON 类对象
### Casting
#### 整数 Integers
```python
x = int(1) # x 将是 1
y = int(2.8) # y 将是 2
z = int("3") # z 将是 3
```
#### 浮点数 Floats
```python
x = float(1) # x 将为 1.0
y = float(2.8) # y 将是 2.8
z = float("3") # z 将为 3.0
w = float("4.2") # w 将是 4.2
```
#### 字符串 Strings
```python
x = str("s1") # x 将是 's1'
y = str(2) # y 将是 '2'
z = str(3.0) # z 将是 '3.0'
```
Python 字符串
------------
### 类数组
```python
>>> hello = "Hello, World"
>>> print(hello[1])
e
>>> print(hello[-1])
d
```
获取位置 `1` 或最后的字符
### 循环
```python
>>> for char in "foo":
... print(char)
f
o
o
```
遍历单词 `foo` 中的字母
### 切片字符串
<!--rehype:wrap-class=row-span-4-->
```java
┌───┬───┬───┬───┬───┬───┬───┐
| m | y | b | a | c | o | n |
└───┴───┴───┴───┴───┴───┴───┘
0 1 2 3 4 5 6 7
-7 -6 -5 -4 -3 -2 -1
```
---
```python
>>> s = 'mybacon'
>>> s[2:5]
'bac'
>>> s[0:2]
'my'
```
---
```python
>>> s = 'mybacon'
>>> s[:2]
'my'
>>> s[2:]
'bacon'
>>> s[:2] + s[2:]
'mybacon'
>>> s[:]
'mybacon'
```
---
```python
>>> s = 'mybacon'
>>> s[-5:-1]
'baco'
>>> s[2:6]
'baco'
```
#### 步长
```python
>>> s = '12345' * 5
>>> s
'1234512345123451234512345'
>>> s[::5]
'11111'
>>> s[4::5]
'55555'
>>> s[::-5]
'55555'
>>> s[::-1]
'5432154321543215432154321'
```
### 字符串长度
```python
>>> hello = "Hello, World!"
>>> print(len(hello))
13
```
`len()` 函数返回字符串的长度
### 多份
```python
>>> s = '===+'
>>> n = 8
>>> s * n
'===+===+===+===+===+===+===+===+'
```
### 检查字符串
```python
>>> s = 'spam'
>>> s in 'I saw spamalot!'
True
>>> s not in 'I saw The Holy Grail!'
True
```
### 连接
```python
>>> s = 'spam'
>>> t = 'egg'
>>> s + t
'spamegg'
>>> 'spam' 'egg'
'spamegg'
```
### 格式化
<!--rehype:wrap-class=col-span-2-->
```python
name = "John"
print("Hello, %s!" % name)
```
---
```python
name = "John"
age = 23
print("%s is %d years old." % (name, age))
```
#### format() 方法
```python
txt1 = "My name is {fname}, I'm {age}".format(fname="John", age=36)
txt2 = "My name is {0}, I'm {1}".format("John", 36)
txt3 = "My name is {}, I'm {}".format("John", 36)
```
### Input 输入
```python
>>> name = input("Enter your name: ")
Enter your name: Tom
>>> name
'Tom'
```
从控制台获取输入数据
### Join 加入
```python
>>> "#".join(["John", "Peter", "Vicky"])
'John#Peter#Vicky'
```
### Endswith 以..结束
```python
>>> "Hello, world!".endswith("!")
True
```
### 转义符号
| 转义符号 | 对应的操作 |
|---|---|
| `\\` | 输出反斜杠 |
| `\'` | 输出单引号 |
| `\"` | 输出双引号 |
| `\n` | 换行 |
| `\t` | 水平制表符 |
| `\r` | 光标回到首位 |
| `\b` | 退格 |
Python F 字符串(自 Python 3.6+ 起)
----------------
### f-Strings 用法
<!--rehype:wrap-class=row-span-2-->
```python
>>> website = 'Reference'
>>> f"Hello, {website}"
"Hello, Reference"
>>> num = 10
>>> f'{num} + 10 = {num + 10}'
'10 + 10 = 20'
>>> f"""He said {"I'm John"}"""
"He said I'm John"
>>> f'5 {"{stars}"}'
'5 {stars}'
>>> f'{{5}} {"stars"}'
'{5} stars'
>>> name = 'Eric'
>>> age = 27
>>> f"""Hello!
... I'm {name}.
... I'm {age}."""
"Hello!\n I'm Eric.\n I'm 27."
```
它从 Python 3.6 开始可用,另见: [格式化的字符串文字](https://docs.python.org/3/reference/lexical_analysis.html#f-strings)
### f-Strings 填充对齐
```python
>>> f'{"text":10}' # [宽度]
'text '
>>> f'{"test":*>10}' # 向左填充
'******test'
>>> f'{"test":*<10}' # 向右填充
'test******'
>>> f'{"test":*^10}' # 填充中心
'***test***'
>>> f'{12345:0>10}' # 填写数字
'0000012345'
```
### f-Strings 类型
<!--rehype:wrap-class=row-span-2-->
```python
>>> f'{10:b}' # binary 二进制类型
'1010'
>>> f'{10:o}' # octal 八进制类型
'12'
>>> f'{200:x}' # hexadecimal 十六进制类型
'c8'
>>> f'{200:X}'
'C8'
>>> f'{345600000000:e}' # 科学计数法
'3.456000e+11'
>>> f'{65:c}' # 字符类型
'A'
>>> f'{10:#b}' # [类型] 带符号(基础)
'0b1010'
>>> f'{10:#o}'
'0o12'
>>> f'{10:#x}'
'0xa'
```
### F-Strings Sign
```python
>>> f'{12345:+}' # [sign] (+/-)
'+12345'
>>> f'{-12345:+}'
'-12345'
>>> f'{-12345:+10}'
' -12345'
>>> f'{-12345:+010}'
'-000012345'
```
### F-Strings 其它
```python
>>> f'{-12345:0=10}' # 负数
'-000012345'
>>> f'{12345:010}' # [0] 快捷方式(不对齐)
'0000012345'
>>> f'{-12345:010}'
'-000012345'
>>> import math # [.precision]
>>> math.pi
3.141592653589793
>>> f'{math.pi:.2f}'
'3.14'
>>> f'{1000000:,.2f}' # [分组选项]
'1,000,000.00'
>>> f'{1000000:_.2f}'
'1_000_000.00'
>>> f'{0.25:0%}' # 百分比
'25.000000%'
>>> f'{0.25:.0%}'
'25%'
```
Python Lists
------------
### 定义
```python
>>> li1 = []
>>> li1
[]
>>> li2 = [4, 5, 6]
>>> li2
[4, 5, 6]
>>> li3 = list((1, 2, 3))
>>> li3
[1, 2, 3]
>>> li4 = list(range(1, 11))
>>> li4
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
```
### 生成
<!--rehype:wrap-class=col-span-2-->
```python
>>> list(filter(lambda x : x % 2 == 1, range(1, 20)))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
>>> [x ** 2 for x in range (1, 11) if x % 2 == 1]
[1, 9, 25, 49, 81]
>>> [x for x in [3, 4, 5, 6, 7] if x > 5]
[6, 7]
>>> list(filter(lambda x: x > 5, [3, 4, 5, 6, 7]))
[6, 7]
```
### 添加
```python
>>> li = []
>>> li.append(1)
>>> li
[1]
>>> li.append(2)
>>> li
[1, 2]
>>> li.append(4)
>>> li
[1, 2, 4]
>>> li.append(3)
>>> li
[1, 2, 4, 3]
```
### List 切片
<!--rehype:wrap-class=col-span-2 row-span-3-->
列表切片的语法:
```python
a_list[start:end]
a_list[start:end:step]
```
#### 切片
```python
>>> a = ['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[2:5]
['bacon', 'tomato', 'ham']
>>> a[-5:-2]
['egg', 'bacon', 'tomato']
>>> a[1:4]
['egg', 'bacon', 'tomato']
```
#### 省略索引
```python
>>> a[:4]
['spam', 'egg', 'bacon', 'tomato']
>>> a[0:4]
['spam', 'egg', 'bacon', 'tomato']
>>> a[2:]
['bacon', 'tomato', 'ham', 'lobster']
>>> a[2:len(a)]
['bacon', 'tomato', 'ham', 'lobster']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[:]
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
```
#### 跳跃索引
```python
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[0:6:2]
['spam', 'bacon', 'ham']
>>> a[1:6:2]
['egg', 'tomato', 'lobster']
>>> a[6:0:-2]
['lobster', 'tomato', 'egg']
>>> a
['spam', 'egg', 'bacon', 'tomato', 'ham', 'lobster']
>>> a[::-1]
['lobster', 'ham', 'tomato', 'bacon', 'egg', 'spam']
```
### 删除
```python
>>> li = ['bread', 'butter', 'milk']
>>> li.pop()
'milk'
>>> li
['bread', 'butter']
>>> del li[0]
>>> li
['butter']
```
### 列表边界
```python
>>> li = ['a', 'b', 'c', 'd']
>>> li[0]
'a'
>>> li[-1]
'd'
>>> li[4]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range
```
### 连接
<!--rehype:wrap-class=row-span-2-->
```python
>>> odd = [1, 3, 5]
>>> odd.extend([9, 11, 13])
>>> odd
[1, 3, 5, 9, 11, 13]
>>> odd = [1, 3, 5]
>>> odd + [9, 11, 13]
[1, 3, 5, 9, 11, 13]
```
### 排序和反转
<!--rehype:wrap-class=row-span-2-->
```python
>>> li = [3, 1, 3, 2, 5]
>>> li.sort()
>>> li
[1, 2, 3, 3, 5]
>>> li.reverse()
>>> li
[5, 3, 3, 2, 1]
```
### 计数
```python
>>> li = [3, 1, 3, 2, 5]
>>> li.count(3)
2
```
### 重复
```python
>>> li = ["re"] * 3
>>> li
['re', 're', 're']
```
Python 流程控制
------------
### 基本
```python
num = 5
if num > 10:
print("num is totally bigger than 10.")
elif num < 10:
print("num is smaller than 10.")
else:
print("num is indeed 10.")
```
### 一行
```python
>>> a = 330
>>> b = 200
>>> r = "a" if a > b else "b"
>>> print(r)
a
```
### else if
```python
value = True
if not value:
print("Value is False")
elif value is None:
print("Value is None")
else:
print("Value is True")
```
Python 循环
--------
### 基础
```python
primes = [2, 3, 5, 7]
for prime in primes:
print(prime)
```
### 有索引
```python
animals = ["dog", "cat", "mouse"]
for i, value in enumerate(animals):
print(i, value)
```
### While
```python
x = 0
while x < 4:
print(x)
x += 1 # Shorthand for x = x + 1
```
### Break
```python
x = 0
for index in range(10):
x = index * 10
if index == 5:
break
print(x)
```
### Continue
```python
for index in range(3, 8):
x = index * 10
if index == 5:
continue
print(x)
```
### 范围
```python
for i in range(4):
print(i) # Prints: 0 1 2 3
for i in range(4, 8):
print(i) # Prints: 4 5 6 7
for i in range(4, 10, 2):
print(i) # Prints: 4 6 8
```
### 使用 zip()
```python
name = ['Pete', 'John', 'Elizabeth']
age = [6, 23, 44]
for n, a in zip(name, age):
print('%s is %d years old' %(n, a))
```
### 列表理解
<!--rehype:wrap-class=col-span-2-->
```python
result = [x**2 for x in range(10) if x % 2 == 0]
print(result)
# [0, 4, 16, 36, 64]
```
Python 函数
--------
### 基础
```python
def hello_world():
print('Hello, World!')
```
### 返回
```python {3}
def add(x, y):
print("x is %s, y is %s" %(x, y))
return x + y
add(5, 6) # => 11
```
### 位置参数
```python
def varargs(*args):
return args
varargs(1, 2, 3) # => (1, 2, 3)
```
### 关键字参数
```python
def keyword_args(**kwargs):
return kwargs
# => {"big": "foot", "loch": "ness"}
keyword_args(big="foot", loch="ness")
```
### 返回多个
```python
def swap(x, y):
return y, x
x = 1
y = 2
x, y = swap(x, y) # => x = 2, y = 1
```
### 默认值
```python
def add(x, y=10):
return x + y
add(5) # => 15
add(5, 20) # => 25
```
### 匿名函数
```python
# => True
(lambda x: x > 2)(3)
# => 5
(lambda x, y: x ** 2 + y ** 2)(2, 1)
```
Python 模块
--------
### 导入模块
```python
import math
print(math.sqrt(16)) # => 4.0
```
### 从一个模块导入
```python
from math import ceil, floor
print(ceil(3.7)) # => 4.0
print(floor(3.7)) # => 3.0
```
### 全部导入
```python
from math import *
```
### 缩短模块
```python
import math as m
# => True
math.sqrt(16) == m.sqrt(16)
```
### 功能和属性
```python
import math
dir(math)
```
Python 文件处理
----------
### 读取文件
#### 逐行
```python
with open("myfile.txt") as file:
for line in file:
print(line)
```
#### 带行号
```python
file = open('myfile.txt', 'r')
for i, line in enumerate(file, start=1):
print("Number %s: %s" % (i, line))
```
### 字符串
#### 写一个字符串
```python
contents = {"aa": 12, "bb": 21}
with open("myfile1.txt", "w+") as file:
file.write(str(contents))
```
#### 读取一个字符串
```python
with open('myfile1.txt', "r+") as file:
contents = file.read()
print(contents)
```
### 对象
#### 写一个对象
```python
contents = {"aa": 12, "bb": 21}
with open("myfile2.txt", "w+") as file:
file.write(json.dumps(contents))
```
#### 读取对象
```python
with open('myfile2.txt', "r+") as file:
contents = json.load(file)
print(contents)
```
### 删除文件
```python
import os
os.remove("myfile.txt")
```
### 检查和删除
```python
import os
if os.path.exists("myfile.txt"):
os.remove("myfile.txt")
else:
print("The file does not exist")
```
### 删除文件夹
```python
import os
os.rmdir("myfolder")
```
Python 类和继承
--------
### Defining
```python
class MyNewClass:
pass
# Class Instantiation
my = MyNewClass()
```
### 构造函数
```python
class Animal:
def __init__(self, voice):
self.voice = voice
cat = Animal('Meow')
print(cat.voice) # => Meow
dog = Animal('Woof')
print(dog.voice) # => Woof
```
### 方法
```python
class Dog:
# 类的方法
def bark(self):
print("Ham-Ham")
charlie = Dog()
charlie.bark() # => "Ham-Ham"
```
### 类变量
<!--rehype:wrap-class=row-span-2-->
```python
class MyClass:
class_variable = "A class variable!"
# => 一个类变量!
print(MyClass.class_variable)
x = MyClass()
# => 一个类变量!
print(x.class_variable)
```
### Super() 函数
<!--rehype:wrap-class=row-span-2-->
```python
class ParentClass:
def print_test(self):
print("Parent Method")
class ChildClass(ParentClass):
def print_test(self):
print("Child Method")
# 调用父级的 print_test()
super().print_test()
```
---
```python
>>> child_instance = ChildClass()
>>> child_instance.print_test()
Child Method
Parent Method
```
### repr() 方法
```python
class Employee:
def __init__(self, name):
self.name = name
def __repr__(self):
return self.name
john = Employee('John')
print(john) # => John
```
### 用户定义的异常
```python
class CustomError(Exception):
pass
```
### 多态性
```python
class ParentClass:
def print_self(self):
print('A')
class ChildClass(ParentClass):
def print_self(self):
print('B')
obj_A = ParentClass()
obj_B = ChildClass()
obj_A.print_self() # => A
obj_B.print_self() # => B
```
### 覆盖
```python
class ParentClass:
def print_self(self):
print("Parent")
class ChildClass(ParentClass):
def print_self(self):
print("Child")
child_instance = ChildClass()
child_instance.print_self() # => Child
```
### 继承
```python
class Animal:
def __init__(self, name, legs):
self.name = name
self.legs = legs
class Dog(Animal):
def sound(self):
print("Woof!")
Yoki = Dog("Yoki", 4)
print(Yoki.name) # => YOKI
print(Yoki.legs) # => 4
Yoki.sound() # => Woof!
```
各种各样的
----------
### 注释
```python
# 这是单行注释
```
---
```python
""" 可以写多行字符串
使用三个",并且经常使用
作为文档。
"""
```
---
```python
''' 可以写多行字符串
使用三个',并且经常使用
作为文档。
'''
```
### 生成器
```python
def double_numbers(iterable):
for i in iterable:
yield i + i
```
生成器可帮助您编写惰性代码
### 要列出的生成器
```python
values = (-x for x in [1,2,3,4,5])
gen_to_list = list(values)
# => [-1, -2, -3, -4, -5]
print(gen_to_list)
```
### 处理异常
<!--rehype:wrap-class=col-span-3-->
```python
try:
# 使用“raise”来引发错误
raise IndexError("这是一个索引错误")
except IndexError as e:
pass # pass只是一个空操作。 通常你会在这里做恢复。
except (TypeError, NameError):
pass # 如果需要,可以一起处理多个异常。
else: # try/except 块的可选子句。 必须遵循除块之外的所有内容
print("All good!") # 仅当 try 中的代码未引发异常时运行
finally: # 在所有情况下执行
print("我们可以在这里清理资源")
```
另见
----
- [Python](https://www.python.org/) _(python.org)_
- [Learn X in Y minutes](https://learnxinyminutes.com/docs/python/) _(learnxinyminutes.com)_
- [Regex in python](./regex.md#python-中的正则表达式) _(jaywcjlove.github.io)_