库学习
math
math 中包含常用的数学函数和数学常量。
- 数学函数:
acos, asin, atan, ceil, cos, degrees, exp, fabs, factorial, floor, fmod, gcd, log, log10, modf, pow, radians, sin, sqrt, tan
- 数学常量:
e, pi
random
choice, randint, random, randrange, sample, seed, shuffle
choice(序列)
:随机从序列中选择一个值。randint(start, end)
:产生 start 到 end 之间的一个整数。random()
:产生一个 0 到 1 之间的浮点数。sample(序列,数量)
:从序列中选取数量个不重复的值。seed(种子)
:初始化种子。shuffle(序列)
:将序列置乱。
copy
copy()
:浅拷贝。只拷贝父对象,不拷贝子对象,子对象仍然是引用。deepcopy()
:深拷贝。既拷贝父对象,又拷贝子对象。
当对象全为不可变类型时,
copy
和deepcopy
都是引用。当父对象是不可变的,子对象中有一个可变对象时,deepcopy 是深拷贝,然而 copy 还是浅拷贝。
json
json 模块用于将 Python 对象和 JSON 对象之间相互转换。
Python 对象 | JSON 对象 |
---|---|
dict | object |
list, tuple | array |
str, bytes | string |
int, float | number |
True, Flase | true, false |
None | null |
dumps
: 将 Python 对象转换成 JSON 对象loads
:将 JSON 对象转换成 Python 对象
hashlib
hashlib 中提供了一系列加密算法,这些算法接受传入的内容,经过运算得到一串 hash 值。sha1, sha224, sha384, sha512, md5等
。
- 一般步骤
import hashlib
m = hashlib.md5()
s = input('输入加密字符串')
m.update(m.encode('utf-8')) # 只接受bytes类型
print(m.hexdigest()) # 以十六进制输出结果
- 校验文件
import hashlib
m = hashlib.md5()
with open(r'haha.txt','rb') as f:
for line in f:
m.update(line)
print(m.hexdigest()) # 47a6b079cc33a4f312786b46e61e0305
os
- 文件操作:
rename, remove, listdir, mkdir, rmdir, chdir
- 执行终端命令:
os.system('终端命令')
sys
sys.path
:模块的搜索路径。sys.argv
:运行程序时传入的参数。
time
time()
:返回当前时间的时间戳(1970 元年后的浮点秒数),这是 Unix 时间戳,纪念 Unix 发行的时间点。sleep()
:程序延迟时长,单位是 s。localtime()
:将时间戳转换为时间元组。
import time
localtime = time.localtime(time.time())
# localtime 为 time.struct_time(tm_year=2016, tm_mon=4, tm_mday=7, tm_hour=10, tm_min=3, tm_sec=27, tm_wday=3, tm_yday=98, tm_isdst=0)
print(localtime.tm_year, localtime.tm_mon)
multiprocessing
Process
:创建多进程。start
:启动该进程。join
:主线程阻塞至此,直至子进程结束。但是主线程默认会等待Process
创建的子进程结束。
Pool
:创建进程池,可以指定最大子进程数。apply_async(func, (param1, param2))
:将进程装入进程池。close
:关闭进程池,不再接收新进程。join
:阻塞。主线程不会等待进程池中的子进程结束,故必须添加该句话且放在 close 之后。
Queue
:创建通信队列,可以指定最大容量。put(x), get(), full(), empty(), size()
。
threading
Thread
:创建多线程。start
:启动该线程。join
:主线程阻塞至此,直至子线程结束。但是主线程默认会等待Thread
创建的子线程结束。
lock
:创建互斥锁。acquire
:锁定。release
:释放。
socket
socket(AddressFamily, Type)
:创建TCP
或UDP
套接字。bind((ip, port))
:为套接字绑定 ip 和 port。setblocking(False)
:设置套接字为非阻塞模式。setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
:端口立即复用。sendto(data, addr), recvfrom(最大字节数)
:UDP
发送和接受数据函数。send(data), recv(最大字节数)
:TCP
发送和接受数据函数。connect((ip, port))
:客户端连接服务器。listen(最大连接数)
:设置套接字为监听状态。accpet()
:服务器接受客户端连接。close()
:关闭套接字。
re
import re
result = re.match(正则表达式, 要匹配的字符串)
print(result.group())
-
匹配单个字符
., \d, \D, \s, \S, \w, \W, [xyz], [^xyz], ^, $
。 -
匹配多个字符
*, +, ?, {m}, {m,}, {m,n}
。 -
匹配分组
|
表示匹配左右任意表达式。- 以
()
括号括起来的部分作为一个分组,分组以编号1
开始计算。 \num
引用第 num 个分组。(?P<name>
和(?P=name)
:给分组起别名和引用该分组。
pattern1 = r'^([a-zA-Z0-9_]{4,20}@(163|126)\.com$'
pattern2 = r'<(\w*)>\.*</\1>'
pattern3 = r'<(?P<name1>\w*)>\.*</(?P=name1)>'
-
相关函数
match
:从字符串开头开始匹配,返回匹配到的字符串。若有分组则返回group
分组对象。search
:从字符串任意位置开始匹配,返回匹配到的字符串。若有分组则返回group
分组对象。所以search(r'xx') = match(r'^xx')
。findall
:找到所有匹配的字符串,以列表的形式返回,若其中有分组,则只返回分组!!!split
:以匹配项进行分割字符串,返回列表。sub
。sub(匹配项,替换项,字符串)
,返回替换后的字符串。sub(匹配项,函数名,字符串)
,匹配项将作为函数的参数。
-
贪婪模式和非贪婪模式
正则中数量词默认是贪婪的,即会尽可能多地匹配。在数量词后加一个?
会变成非贪婪模式。 -
使用正则表达式对象
使用compile(模式)
方法编译生成一个re
对象,这样可以重复使用并且速度更快。
import re
pattern = re.compile(r'\w{3,}?')
x = pattern.findall('haha bbb')
print(x)