Python专题, 语言

常用的Python软件包

以下列出自己常用的一些Python软件包,不定期更新。

0. Python内置语法

a = [1, 2] # 数组
print(a)
print(len(a)) # 数组长度
a.append(3) # 增加元素
print(a)
b = range(5)  # 数列(从0开始)
print(b)
for i0 in b:
    print(i0)

运行结果:

[1, 2]
2
[1, 2, 3]
range(0, 5)
0
1
2
3
4

1. numpy

numpy官网:https://numpy.org/。参考博文:Python和Numpy库的常用语句

例子:

import numpy as np
print(np.zeros((2, 3)), '\n') # 零矩阵
print(np.identity(3), '\n') # 单位矩阵
print(np.diag([1, 3, 5]), '\n')  # 对角矩阵
matrix1 = np.array([[3, 5+1j], [2, 7]]) # numpy矩阵
print(matrix1, '\n')
print(matrix1.shape, '\n') # 矩阵的维度
print(matrix1.transpose(), '\n') # 矩阵转置
print(matrix1.conj(), '\n') # 矩阵所有元素共轭
print(np.conj(matrix1), '\n') # 矩阵所有元素共轭(同上)
print(np.arange(1, 5, 1), '\n') # 数列(左闭右开)
print(np.linspace(-2, 2, 5), '\n') # 数列(左闭右闭)
print(np.random.uniform(-2, 2), '\n') # 随机数
print(np.random.randint(0, 2), '\n')  # 随机整数(左闭右开)
print(np.sort([1, 7, 0, 3]), '\n') # 排列
print(np.argsort([1, 7, 0, 3]), '\n') # 排列索引
print(np.linalg.det(matrix1), '\n')   # 行列式
matrix2 = np.linalg.inv(matrix1)  # 求逆
print(matrix2, '\n')
print(np.matmul(matrix1, matrix2), '\n') # 矩阵乘积
print(np.dot(matrix1, matrix2), '\n') # 矩阵乘积(同上)
eigenvalue, eigenvector = np.linalg.eig(matrix1)  # 求本征值,本征向量
print(eigenvalue, '\n')
print(eigenvector, '\n')
matrix3 = np.append(matrix1, matrix2, axis=0) # 增加数组元素或者矩阵的行
print(matrix3)

运行结果:

[[0. 0. 0.]
 [0. 0. 0.]]

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

[[1 0 0]
 [0 3 0]
 [0 0 5]]

[[3.+0.j 5.+1.j]
 [2.+0.j 7.+0.j]]

(2, 2)

[[3.+0.j 2.+0.j]
 [5.+1.j 7.+0.j]]

[[3.-0.j 5.-1.j]
 [2.-0.j 7.-0.j]]

[[3.-0.j 5.-1.j]
 [2.-0.j 7.-0.j]]

[1 2 3 4]

[-2. -1.  0.  1.  2.]

-0.9591084896701201

1

[0 1 3 7]

[2 0 3 1]

(11.000000000000002-2j)

[[ 0.616+0.112j -0.424-0.168j]
 [-0.176-0.032j  0.264+0.048j]]

[[ 1.00000000e+00+0.00000000e+00j  4.85722573e-17+0.00000000e+00j]
 [-1.66533454e-16+2.08166817e-17j  1.00000000e+00-6.93889390e-18j]]

[[ 1.00000000e+00+0.00000000e+00j  4.85722573e-17+0.00000000e+00j]
 [-1.66533454e-16+2.08166817e-17j  1.00000000e+00-6.93889390e-18j]]

[1.2488578-0.26658547j 8.7511422+0.26658547j]

[[ 0.9446263 +0.j          0.65546019+0.09978411j]
 [-0.3277961 +0.01519449j  0.74860876+0.j        ]]

[[ 3.   +0.j     5.   +1.j   ]
 [ 2.   +0.j     7.   +0.j   ]
 [ 0.616+0.112j -0.424-0.168j]
 [-0.176-0.032j  0.264+0.048j]]

2. math

math官网:https://docs.python.org/3/library/math.html。math中的一些函数在numpy中可以直接调用。

例子:

import math
print(math.pi)
print(math.e)
print(math.exp(1))
print(math.cos(math.pi))
print(math.sqrt(2), '\n')

import numpy as np
print(np.pi)
print(np.e)
print(np.exp(1))
print(np.cos(np.pi))
print(np.sqrt(2))

运行结果:

3.141592653589793
2.718281828459045
2.718281828459045
-1.0
1.4142135623730951 

3.141592653589793
2.718281828459045
2.718281828459045
-1.0
1.4142135623730951

3. cmath

cmath官网:https://docs.python.org/3/library/cmath.html。因为numpy和math中指数等无法处理复数的情况,所以要用cmath。

例子:

import cmath
print(cmath.exp(1j*cmath.pi))

运行结果:

(-1+1.2246467991473532e-16j)

4. copy

copy官网:https://docs.python.org/3/library/copy.html。如果直接用等于号,两个变量会指向相同的id,改变一个值,另外一个值可能会发生改变,容易出错,所以要用上这个copy。

例子:

import copy
import numpy as np

array_1 = [1, 2, 3]
array_2 = array_1
array_1[0] = 100
print('array_1=', array_1)
print('array_2=', array_2, '\n')

array_1 = np.array([1, 2, 3])
array_2 = array_1
array_1[0] = 100
print('array_1=', array_1)
print('array_2=', array_2, '\n')

array_1 = [1, 2, 3]
array_2 = copy.deepcopy(array_1)
array_1[0] = 100
print('array_1=', array_1)
print('array_2=', array_2, '\n')

array_1 = np.array([1, 2, 3])
array_2 = copy.deepcopy(array_1)
array_1[0] = 100
print('array_1=', array_1)
print('array_2=', array_2)

运行结果:

array_1= [100, 2, 3]
array_2= [100, 2, 3] 

array_1= [100   2   3]
array_2= [100   2   3]

array_1= [100, 2, 3]
array_2= [1, 2, 3]

array_1= [100   2   3]
array_2= [1 2 3]

5. matplotlib

matplotlib官网:https://matplotlib.org/。参考博文:Python中Matplotlib库的常用语句使用Matplotlib画图

例子:

import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111)
ax.plot(range(10), range(10))
ax.set_title('Example', fontsize=20, fontfamily='Times New Roman')
ax.set_xlabel('x', fontsize=20, fontfamily='Times New Roman') 
ax.set_ylabel('y', fontsize=20, fontfamily='Times New Roman')
plt.show()

运行结果:

6. functools

functools官网:https://docs.python.org/3/library/functools.html。“偏函数”的使用。

例子:

import functools

def func(x, y, z):
    return x-y+z

partial_func = functools.partial(func, x=5, z=0)
print(partial_func(y=2))

运行结果:

3

7. time

time官网:https://docs.python.org/3/library/time.html

例子:

import time
start_time = time.time()
time.sleep(5)
end_time = time.time()
print(end_time-start_time)

运行结果:

5.002896547317505

8. os

os官网:https://docs.python.org/3/library/os.html

例子:

import os
os.getcwd()  # 获取路径
if os.path.exists('new_dir') == False: # 判断路径是否存在
    os.makedirs('new_dir') # 新建文件夹
os.chdir('new_dir')  # 切换到该文件夹
print(os.walk('/'))  # 游走目录

9. pickle

通过 pickle,你可以将几乎任何 Python 对象(如列表、字典、函数、类实例等)转换为字节流文件,并在需要时恢复为原始对象。

例子:

import pickle
data = [1, 2, 3]
with open('a.txt', 'wb') as f:
    pickle.dump(data, f)
with open('a.txt', 'rb') as f:
    data_load = pickle.load(f)
print(data_load)

运行结果:

[1, 2, 3]

10. json

JSON(JavaScript Object Notation)可以简单地视为字典(或映射)的字符串表示形式。JSON是一种轻量级的数据交换格式,通常用于在网络之间传输数据。它采用键值对的形式,类似于字典或映射的结构。以下是相互转换的例子。

import json

# 定义一个字典对象
data = {
    "name": "张三",
    "age": 30,
    "city": "北京"
}

print(type(data))
print(data.items())
for key, value in data.items():
    print(f'{key}: {value}')
print()

# 将字典对象转换为JSON格式
json_data = json.dumps(data)
print(type(json_data))
print("JSON格式数据:", json_data)
print()

# 将JSON格式数据转换回字典对象
dict_data = json.loads(json_data)
print(type(dict_data))
print("字典对象:", dict_data)

运行结果:

<class 'dict'>
dict_items([('name', '张三'), ('age', 30), ('city', '北京')])
name: 张三
age: 30
city: 北京

<class 'str'>
JSON格式数据: {"name": "\u5f20\u4e09", "age": 30, "city": "\u5317\u4eac"}

<class 'dict'>
字典对象: {'name': '张三', 'age': 30, 'city': '北京'}

11. re

正则表达式是一种强大的字符串匹配工具,它允许您以一种灵活的方式搜索和操作字符串。

例子:

import re

# 正则表达式:匹配任意字符(.);零次或多次(*);尽可能少地匹配(?)

# re.match 指匹配起始位置的模式,如果起始位置不匹配的话,返回 None
string = 'this_is_a_test_abc_123'
result = re.match(pattern='ab(.*?)23', string=string)
print(result)
print()
result = re.match(pattern='this(.*?)abc', string=string)
print(result.group(0))
print(result.group(1))
print()

# re.search 扫描整个字符串并返回第一个成功的匹配。
string = 'this_is_a_test_abc_123'
result = re.search(pattern='ab(.*?)23', string=string)
print(result.group(0))
print(result.group(1))
print()
result = re.search(pattern='this(.*?)abc', string=string)
print(result.group(0))
print(result.group(1))

运行结果:

None

this_is_a_test_abc
_is_a_test_

abc_123
c_1

this_is_a_test_abc
_is_a_test_

12. tqdm

tqdm是一个Python库,它为循环迭代提供了一个简单而有效的进度条显示功能。

例子:

from tqdm import tqdm 
import time
import numpy as np

for i in tqdm(np.arange(1, 10)):     
    time.sleep(0.1)
    print('', i)

运行结果:

  0%|                                                                  | 0/9 [00:00<?, ?it/s] 1
 11%|██████▍                                                   | 1/9 [00:00<00:00,  9.37it/s] 2
 22%|████████████▉                                             | 2/9 [00:00<00:00,  9.25it/s] 3
 33%|███████████████████▎                                      | 3/9 [00:00<00:00,  9.20it/s] 4
 44%|█████████████████████████▊                                | 4/9 [00:00<00:00,  9.16it/s] 5
 56%|████████████████████████████████▏                         | 5/9 [00:00<00:00,  9.18it/s] 6
 67%|██████████████████████████████████████▋                   | 6/9 [00:00<00:00,  9.18it/s] 7
 78%|█████████████████████████████████████████████             | 7/9 [00:00<00:00,  9.19it/s] 8
 89%|███████████████████████████████████████████████████▌      | 8/9 [00:00<00:00,  9.16it/s] 9
100%|██████████████████████████████████████████████████████████| 9/9 [00:00<00:00,  9.17it/s]

13. multiprocessing

官网:https://docs.python.org/3/library/multiprocessing.html。一个并行计算的软件包,参考博文:在Python中使用multiprocessing实现多任务并行

例子:

from multiprocessing import Process
import time

def f(name):
    for i in range(5):
        time.sleep(1)
        print('Hello', name, i)

if __name__ == '__main__':
    start_time = time.time()
    f('A')
    f('B')
    end_time = time.time()
    print(end_time - start_time, '\n')

    start_time = time.time()
    p1 = Process(target=f, args=('A',))
    p2 = Process(target=f, args=('B',))
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    end_time = time.time()
    print(end_time - start_time)

运行结果:

Hello A 0
Hello A 1
Hello A 2
Hello A 3
Hello A 4
Hello B 0
Hello B 1
Hello B 2
Hello B 3
Hello B 4
10.094563722610474

Hello A 0
Hello B 0
Hello B 1
Hello A 1
Hello B 2
Hello A 2
Hello A 3
Hello B 3
Hello A 4
Hello B 4
5.1369547843933105

14. threading

Threading多线程并行。

例子:

import threading
import time

def print_numbers(x):
    for i in range(5):
        time.sleep(1)
        print(f"Thread {x}: {i}")

# 串行测试
start_time = time.time()
print_numbers('A')
print_numbers('B')
end_time = time.time()
print(end_time - start_time, '\n')

# 创建两个线程
thread1 = threading.Thread(target=print_numbers, args=('A'))
thread2 = threading.Thread(target=print_numbers, args=('B'))

start_time = time.time()
# 启动线程
thread1.start()
thread2.start()
# 等待两个线程完成
thread1.join()
thread2.join()
end_time = time.time()
print(end_time - start_time)

运行结果:

Thread A: 0
Thread A: 1
Thread A: 2
Thread A: 3
Thread A: 4
Thread B: 0
Thread B: 1
Thread B: 2
Thread B: 3
Thread B: 4
10.111509561538696

Thread A: 0
Thread B: 0
Thread A: 1
Thread B: 1
Thread B: 2
Thread A: 2
Thread B: 3
Thread A: 3
Thread A: 4
Thread B: 4
5.056422710418701
1,704 次浏览

【说明:本站主要是个人的一些笔记和代码分享,内容可能会不定期修改。为了使全网显示的始终是最新版本,这里的文章未经同意请勿转载。引用请注明出处:https://www.guanjihuan.com

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code