2025-09-10:仓库迁移

This commit is contained in:
2025-09-10 16:12:45 +08:00
parent e0e49b0ac9
commit 3130e336a1
146 changed files with 4066 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
if __name__ == '__main__':
# 很多时候我们需要对浮点数进行取整操作通常情况下使用自带的round函数就能解决问题
f = 1.23456
print(round(f, 2))
# 虽然round函数可以很方便的对数值进行取整但一般情况下如果需要规范输出还是用format(.2f)来做
ff2 = format(f, '.2f')
print(ff2)
# 因为浮点数计算因为算法的局限性可能带来一些奇妙的误差
a = 2.1
b = 4.2
print(a+b)
# 所以一般来说我们就是算完直接按照需要取小数位数规整完格式就行了
# 除非我们的程序对数据精度要求非常高那这时候就要用decimal库了

View File

@@ -0,0 +1,16 @@
import numpy as np
if __name__ == '__main__':
# np在线性代数处理上有一个子包叫matrix专门使用线性代数规则来处理数据比如矩阵乘法、求行列式和解线性方程
m = np.matrix([[1,-2,3],[0,4,5],[7,8,-9]])
print(m)
# 做一个矩阵转置
print(m.T)
# 求可逆矩阵
print(m.I)
v = np.matrix([[2], [3], [4]])
print(m * v)
# 更多线代操作在np.linalg模块下可以找到随用随查就行

View File

@@ -0,0 +1,34 @@
import random
from gevent.subprocess import value
if __name__ == '__main__':
# 如果想要进行随机数操作那么random库是我们最好的选择
values = [1, 2, 3, 4, 5, 6, 7, 8, 9]
# 使用random.choice进行抽卡
random_num = random.choice(values)
print(random_num)
# 使用random.choices进行多次抽卡(k次),每次抽一张
random_nums = random.choices(values, k=2)
print(random_nums)
# 使用random.sample进行抽卡并剔除,这个函数只抽取一次每次抽k张所以k不能大于数组长度
random_num = random.sample(values, k=3)
print(random_num)
# 如果只是想洗牌那用shuffle就行了
random.shuffle(values) # 注意,这个函数不返回任何东西,它直接在原数组上进行操作
print(values)
# 生成随机数可以使用random.randint, 它接受两个参数生成a和b之间的随机数
print(random.randint(0, 10))
# 如果要0-1之间的float可以用random.random
print(random.random())
# 在配密钥的时候我们有的时候会想要得到N比特位的随机整数这时候可以用random.getrandbits(n)
print(random.getrandbits(12))
# 切记random虽然可以产生随机数但其使用的梅森旋转算法是确定算法只要破解seed就能计算出固定值
# 如果需要在密钥中搞到随机数请使用ssl模块产生随机加密字节

View File

@@ -0,0 +1,38 @@
from datetime import timedelta, datetime
if __name__ == '__main__':
# 使用timedelta表示时间间隔
a = timedelta(days=2, hours=6)
b = timedelta(hours=4.5)
c = a + b
print(c.days)
# 这是计算小时的秒数
print(c.seconds)
# 这是计算天+小时的秒数
print(c.total_seconds())
# 如果要创建特定的日期和时间可以用datetime来表示
time1 = datetime(2024, 8, 28)
birthday = datetime(2001, 4, 29)
life_time = time1 - birthday
print(life_time.days)
now = datetime.now()
print(now)
# 值得注意的是datetime模块可以正确处理闰年的二月并计算出正确的天数我的评价是我直接不管
# 对绝大部分的问题datetime模块已经足够使用但是如果需要处理复杂时间问题比如时区、模糊时间范围、计算节日日期等
# 请他娘的使用dateutil模块
a = datetime(2012, 9, 23)
# 很明显因为timedelta没有month这个key所以我们不能直接加一个月它的精度最大只到days
# 这时候dateutil下的relativedelta就派上用场
from dateutil.relativedelta import relativedelta
b = a + relativedelta(years=10, months=2)
print(b)
# 包括计算日期差
d = relativedelta(b, a)
print(d.years, d.months, d.days)

View File

@@ -0,0 +1,31 @@
from datetime import datetime, timedelta
if __name__ == '__main__':
weekdays = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']
def get_previous_by_day(day_name, start_date=None):
if start_date is None:
start_date = datetime.today()
day_num = start_date.weekday()
day_num_target = weekdays.index(day_name)
days_ago = (7 + day_num - day_num_target) % 7
if days_ago == 0:
days_ago = 7
target_date = start_date - timedelta(days=days_ago)
return target_date
get_previous_by_day("Friday")
# 但是如果要经常这么干请使用dateutil包
d = datetime.now()
from dateutil.relativedelta import relativedelta
from dateutil.rrule import *
# 找最近的周五FR是rrule里的函数
print(d + relativedelta(weekday=FR))
# 找上一个周五
print(d + relativedelta(weekday=FR(-1)))

View File

@@ -0,0 +1,33 @@
from datetime import datetime, date, timedelta
import calendar
from fontTools.misc.plistlib import end_date
if __name__ == "__main__":
def get_month_range(start_date=None):
if start_date is None:
start_date = date.today().replace(day=1)
_, days_in_month = calendar.monthrange(start_date.year, start_date.month)
end_date = start_date + timedelta(days = days_in_month)
return start_date, end_date
a_day = timedelta(days=1)
first_day, last_day = get_month_range()
while first_day < last_day:
print(first_day)
first_day = first_day + a_day
# 在获取一个月天数的时候calendar库会非常好用monthrange会返回第一个工作日的日期和当月的天数
# 如果想要实现和Python内建的range一样的遍历效果可以写一个生成器
def date_range(start_date, end_date, step=timedelta(days=1)):
while start_date < end_date:
yield start_date
start_date += step
for d in date_range(first_day, last_day):
print(d)

View File

@@ -0,0 +1,22 @@
from datetime import datetime, date
if __name__ == '__main__':
text = "2012-09-20"
# str -> time
y = datetime.strptime(text, "%Y-%m-%d")
z = datetime.now()
diff = z - y
print(diff)
# 如果你觉得不够美观,那就格式化一下
# time -> str
struct_time_str = datetime.strftime(y, "%A %B %d, %Y")
print(struct_time_str)
# 当然strptime这个函数的性能相当糟糕大量使用时如果考虑到效率问题还请自己动手
def parse_date(date_str):
y, m, d = date_str.split("-")
return datetime(int(y), int(m), int(d))
print(parse_date(text))

View File

@@ -0,0 +1,14 @@
from datetime import datetime
from pytz import timezone
if __name__ == "__main__":
d = datetime(2012, 12, 21, 9, 30, 0)
print(d)
central = timezone('US/Central')
loc_d = central.localize(d)
print(loc_d)
bang_d = loc_d.astimezone(timezone("Asia/Kolkata"))
print(bang_d)

View File

@@ -0,0 +1,12 @@
from decimal import Decimal
if __name__ == '__main__':
# 可以看到使用float的ieee754浮点标准进行计算会产生误差
a = 4.2
b = 2.1
print(a+b)
# 如果需要高精度小数我们的处理方法是将数字字符串转成decimal类型
a = Decimal(str(4.2))
b = Decimal(str(2.1))
print(a+b)

View File

@@ -0,0 +1,14 @@
if __name__ == '__main__':
x = 1234.56789
# 对数值格式化输出我们使用经典format函数
print(format(x, '.2f'))
print(format(x, '+<10.2f'))
print(format(x, '=>10.2f'))
print(format(x, '-^10.2f'))
# 有一些特殊的比如数值特有的千位逗号1000
print(format(x, ',.2f'))
# 如果想用科学计数法把f改成e就行
print(format(x, '.2e'))
print(format(x, 'e'))

View File

@@ -0,0 +1,25 @@
if __name__ == '__main__':
# 想要将十进制数字转换成二进制、八进制和十六进制,可以使用内建函数
a = 1234
a_bin = bin(a)
print(a_bin)
a_oct = oct(a)
print(a_oct)
a_hex = hex(a)
print(a_hex)
# 如果不想要出现0b、0o、0x这样的前缀可以使用format函数格式化做转换
print(format(a, 'b'))
print(format(a, 'o'))
print(format(a, 'x'))
# 如果我们需要一个32位无符号整数可以这样干
x = 1234
x = format(2**32 + x, 'b')
print(x)
# 要转回10进制的时候用int函数+字符串进制就可以了
x = int(a_bin, 2)
print(x)

View File

@@ -0,0 +1,35 @@
import struct
import math
if __name__ == '__main__':
# 假如我们有一个用字节串存储的大整数
data = b'\x00\x124V\x00x\x90\xab\x00\xcd\xef\x01\x00#\x004'
# 要将其还原成整数,我们需要:
print(int.from_bytes(data, byteorder="little"))
print(int.from_bytes(data, byteorder="big"))
# 而要将整数转成字节串,我们可以做一个逆向操作
int_to_b = int.from_bytes(data, byteorder="little")
print(int.to_bytes(int_to_b, byteorder="little", length=16))
# 在IPV6中网络地址以一个128位的整数表示这时候我们可以使用struct模块来完成解包
hi, lo = struct.unpack('>QQ', data)
print((hi << 64) + lo)
# 通过byteorder我们可以指定在编成字节码的时候使用大端排序还是小端排序
byte_num = 0x01020304
print(byte_num.to_bytes(4, 'big'))
print(byte_num.to_bytes(4, 'little'))
# 但是请务必使用合适的字节串大小来保存字节串否则python会因为防止信息丢失报错
x = 523**23
try:
x.to_bytes(4, 'little')
except OverflowError:
print("数据溢出")
# 这时候就要先算一下字节长度再行转换
bit_length = x.bit_length()
# 为了让内存结构更加严整我们要将字节串补全成8的整数倍长度
bytes_num = math.ceil(bit_length / 8)
print(x.to_bytes(bytes_num, 'little'))

View File

@@ -0,0 +1,34 @@
if __name__ == '__main__':
# 在python中我们使用complex函数或者在浮点数后面加j的方式来定义一个复数
a = complex(2,4)
b = 2 + 4j
print(a, b)
# 我们可以提取复数的实部、虚部和共轭复数
print(a.real)
print(a.imag)
print(a.conjugate())
# 同样的,复数可以进行所有常见的算术操作
print(a + b)
print(a - b)
print(a * b)
print(a / b)
print(abs(a))
# 但如果需要对复数求正弦余弦或平方根这种操作,请:
import cmath
cmath.sin(a)
cmath.cos(a)
cmath.sqrt(a)
# 使用numpy可以生成复数数组并对它进行操作
import numpy as np
complex_array = np.array([1+2j, 2+3j, 3+4j])
print(complex_array + 2)
print(np.sin(complex_array))
# 在标准的math库中所有的操作都不会产生复数结果如果想要产出复数结果请使用支持复数感知的库比如cmath

View File

@@ -0,0 +1,20 @@
import math
if __name__ == '__main__':
# python没有原生的东西来表示这些值但他们可以被创建
a = float('inf')
b = float('-inf')
c = float('nan')
print(a, b, c)
# 如果想要感知这些值请使用isnan或isinf函数
print(math.isnan(c))
print(math.isinf(a))
# 要尤其注意inf在计算中会被传播
print(a+45)
# 但是一些神奇操作会产生nan比如
print(a + b)
print(a / a)
# 尤其注意nan会在所有的操作中传播且不会引起任何报错请务必在计算前进行使用isnan函数进行安全检测

View File

@@ -0,0 +1,24 @@
from fractions import Fraction
from unicodedata import decimal
from xlrd.formula import oMSNG
if __name__ == '__main__':
# 如果遇到分数问题那么我们就需要使用fractions模块
a = Fraction(1, 2)
print("这是二分之一:{}".format(a))
# 同样的,分数可以进行所有的算术运算
print(a * a)
# 我们可以通过一些方法得到分子和分母
print("分子是:{}".format(a.numerator))
print("分母是:{}".format(a.denominator))
# 或者我们可以把分数转成浮点数
print(float(a))
# 下面展示如何正确计算高精度的pi/8
import numpy as np
from decimal import Decimal
print(np.pi * Fraction(1, 8))

View File

@@ -0,0 +1,39 @@
import numpy as np
if __name__ == '__main__':
# 终于到了最喜欢的环节没有np我真的会原地爆炸np万岁
# 如果是普通的python list 想要处理是很麻烦的
li = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# print(li * 2)
# 但如果转成nparray,事情就变得简单了起来
np_arr = np.array(li)
# print(np_arr * 2)
# np对一维矩阵的运算也做了加强:
li2 = [11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
np_arr2 = np.array(li2)
# print(np_arr * np_arr2)
# 你甚至可以计算多项式的值
# print(3 * np_arr**2 + 2 * np_arr + 1)
# numpy提供了很多通用函数来对nparray进行操作比如
np.sin(np_arr)
np.sqrt(np_arr)
# 这些操作的效率很高,平时要多用
# 在底层numpy使用和C一样的连续内存空间所以只要内存够大你可以为所欲为
grid = np.zeros(shape=(10000, 10000), dtype=float)
# print(np.sin(np.sqrt(grid + 10)))
# numpy对多维数组也提供了很好的支持
nd_array = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15]])
print(nd_array)
print(nd_array[1])
print(nd_array[:, 1])
print(nd_array[1:3, 1:3])
print(nd_array + [1,2,3,4,5])
# np.where,没见过第一个参数是条件满足就输出第二个参数x不满足就输出第三个参数y
print(np.where(nd_array < 10, nd_array, np.nan))