# random - 随机数库

# random 方法

import random
a = random.random()

random() 方法可以生成一个大于 0 小于 1 的浮点随机数位数可能很长
通常使用 round() 方法来控制浮点数长度

round(n,ndigits=x) 为其调用方法,n 为数据,ndigits 为位数
round() 方法遵循四舍五入原则好用多了

python 使用模块前,需要先使用 import 关键字声明

# randint 方法

import random
a = random.randint(0,10)
print(a) # 0-10 随机数

randint(s,e) 方法可以生成一个 s-e 区间内的随机整数

randint() 含头含尾,会生成头数和尾数

由于 bool 类型是 int 的子类,所以 randint(0,1) 相当于 50% 概率为真,可以直接用在条件中,不需要 ==

# uniform 方法

import random
a = random.uniform(0,10)
print(a) # 0-10 随机浮点数

uniform() 相当于一个带参数的 random() 方法

uniform() 的位数更离谱长,务必使用 round() 进行处理

# randrange 方法

import random
a = random.randrange(0,10,2)
print(a) # 0-10 的随机偶数

randrange() 方法生成随机递增序列里的一个数,这个数一定是 起始位+步长的倍数
看不懂?让我们等量代换一下:

import random
l = list(range(0,10,2))
print(random.choice(l)) # 随机从列表里选择一个数据,后面会讲到

这段代码与上面的结果是一致的,它的流程就是:

  1. 生成一个符合输入参数的列表
  2. 从列表里随机选择一个数
  3. 返回这个数

这里还有一个拆分更彻底的版本:

import random
# 根据输入参数生成列表
l = []
for i in range(0, 10, 2):
    l.append(i)
# 随机选择元素
index = random.randint(0, len(l) - 1)
print(l[index]) # 返回 (输出) 此元素

# shuffle 和 sample 方法

import random
l = [1,2,3,4,5]
random.shuffle(l)
print(l)
l = [1,2,3,4,5]
r = random.sample(l,5)
print(r)

shuffle(seq)sample(seq,k=len(seq)) 都可以随机打乱列表
但 shuffle 是在原列表上做操作,而 sample 则是返回一个新列表
sample(seq,k=n<len(seq) 则可以从列表中随机提取长度为 n 的片段 (不连续)

# choice 和 choices 方法

import random
l = [1,2,3,4,5]
r = random.choice(l)
print(r)
r1 = random.choices(l,k=3)
print(r1)

choice(seq) 方法可以从列表中返回一个随机元素
choices(seq,k=n) 方法可以从列表中返回 k 个随机元素

# string - 字符串模块

string.ascii_letters 从字母 a-Z 的字符串
string.ascii_lowercase 从字母 a-z 的字符串
string.ascii_uppercase 从字母 A-Z 的字符串
string.digits 所有十进制常数
string.punctuation 所有在 ASCII 环境下被 C 认为标点的字符串

# time - 时间模块

仅包含及其常用的方法,并不完整

# struct_time 格式

struct_time 是 time 模块返回的常见序列,索引见下表:

索引 属性
0 tm_year (年) 比如 2022
1 tm_mon (月) 1-12
2 tm_mday (日) 1-31
3 tm_hour (时) 0-23 (转换请 + 1)
4 tm_min (分) 0-59 (同上)
5 tm_sec (秒) 0-61
6 tm_wday (周几) 0-6 (0 表周日,需要 + 1)
7 tm_yday (一年中的第几天) 1-366
8 tm_isdst (是否是夏令时) 默认为 - 1

# localtime 和 gmtime 方法

import time
t = time.localtime() #返回一个 struct_time 对象
print(t) 
utc = time.gmtime() #返回一个 struct_time 对象
print(utc)

这两个方法都会将输入的时间戳转换为 struct_time对象 ,不输入则使用现在的时间戳
区别:localtime 使用你所在的时区,gmtime 使用 UTC 标准时间 (+0.00)
附带一个 mktime 方法,它可以将 struct_time对象 转换回时间戳

# time 和 time_ns 方法

import time
t = time.time()
print(t)

time() 返回现在的时间戳
time_ns() 也是返回现在的时间戳,但是是 int 对象,不可以传入 localtime 作为参数

time 模块比较复杂,建议查看官方文档

# 练习题

1. 输入一个时间戳,返回它的年、月、日、时、分、秒 (当前时区),
不输入则使用现在的时间戳,样例输出 / 入如下:
[输入] 没有输入任何东西
[输出] 2022 年 1 月 16 日 16 时 7 分 30 秒 (此时时间)

import time
u = input("请输入时间戳:")
if u == "":
    u = time.time()
else:
    u = int(u)
t = time.localtime(u)
print(f"{t[0]}{t[1]}{t[2]}{t[3]}{t[4]}{t[5]}秒")

2. 输入一串数据,判断它转换为 int 类型是否会报错,
可以则输出可以转换为 int 类型并返回这个数
不可以则输出不可以转换为 int 类型并返回这个字符串可以转换的部分
样例输入 / 出:
第一组数据:
[输入] 123456
[输出] 可以转换为 int 类型
[输出] 123456
第二组数据:
[输入] a123b456
[输出] 不可以转换为 int 类型
[输出] 123456

import string
u = input("输入数据:")
t = ""
can_int = True
for i in u:
    if i in string.digits:
        t += i
    else:
        can_int = False
if can_int:
    print("可以转换为int类型")
else:
    print("不可以转换为int类型")
print(t)