2025-09-10:仓库迁移
This commit is contained in:
16
3.数字日期和时间/1.对数值进行取整.py
Normal file
16
3.数字日期和时间/1.对数值进行取整.py
Normal 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库了
|
16
3.数字日期和时间/10.矩阵和线性代数的计算.py
Normal file
16
3.数字日期和时间/10.矩阵和线性代数的计算.py
Normal 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模块下可以找到,随用随查就行
|
34
3.数字日期和时间/11.随机选择.py
Normal file
34
3.数字日期和时间/11.随机选择.py
Normal 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模块产生随机加密字节
|
38
3.数字日期和时间/12.时间换算.py
Normal file
38
3.数字日期和时间/12.时间换算.py
Normal 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)
|
31
3.数字日期和时间/13.计算上周五的日期.py
Normal file
31
3.数字日期和时间/13.计算上周五的日期.py
Normal 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)))
|
33
3.数字日期和时间/14.找出当月日期范围.py
Normal file
33
3.数字日期和时间/14.找出当月日期范围.py
Normal 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)
|
22
3.数字日期和时间/15.将字符串转成日期.py
Normal file
22
3.数字日期和时间/15.将字符串转成日期.py
Normal 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))
|
14
3.数字日期和时间/16.处理涉及时区的日期问题.py
Normal file
14
3.数字日期和时间/16.处理涉及时区的日期问题.py
Normal 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)
|
||||
|
12
3.数字日期和时间/2.执行精确小数计算.py
Normal file
12
3.数字日期和时间/2.执行精确小数计算.py
Normal 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)
|
14
3.数字日期和时间/3.对数值做格式化输出.py
Normal file
14
3.数字日期和时间/3.对数值做格式化输出.py
Normal 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'))
|
||||
# 有一些特殊的,比如数值特有的千位逗号1,000
|
||||
print(format(x, ',.2f'))
|
||||
# 如果想用科学计数法,把f改成e就行
|
||||
print(format(x, '.2e'))
|
||||
print(format(x, 'e'))
|
25
3.数字日期和时间/4.二进制、八进制和十六进制.py
Normal file
25
3.数字日期和时间/4.二进制、八进制和十六进制.py
Normal 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)
|
||||
|
35
3.数字日期和时间/5.从字符串中打包和解包大整数.py
Normal file
35
3.数字日期和时间/5.从字符串中打包和解包大整数.py
Normal 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'))
|
34
3.数字日期和时间/6.复数运算.py
Normal file
34
3.数字日期和时间/6.复数运算.py
Normal 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
|
20
3.数字日期和时间/7.处理无穷大和NAN.py
Normal file
20
3.数字日期和时间/7.处理无穷大和NAN.py
Normal 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函数进行安全检测
|
24
3.数字日期和时间/8.分数的计算.py
Normal file
24
3.数字日期和时间/8.分数的计算.py
Normal 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))
|
39
3.数字日期和时间/9.处理大型数组的计算.py
Normal file
39
3.数字日期和时间/9.处理大型数组的计算.py
Normal 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))
|
Reference in New Issue
Block a user