1. random模块
1.1 基础方法 import random # (1) 取随机小数: 数学计算 print(random.random()) # 取0-1之间的小数 print(random.uniform(1, 2)) # 取所给范围之间的小数 # (2) 取随机整数: 彩票 抽奖 print(random.randint(1, 2)) # [1,2] 顾头也顾尾 print(random.randrange(1, 2)) # [1,2) 顾头不顾尾 print(random.randrange(1, 200, 2)) # 每两个取一个(200以内的奇数) # (3) 从一个列表中随机抽取值: 抽奖 li = ['a', 'b', (1, 2), 123] print(random.choice(li)) # 随机取一个 print(random.sample(li, 2)) # 随机取两个 # (4) 洗牌 打乱一个列表的顺序(没有返回值,在原来的列表基础上直接进行修改,节省空间) li = ['a', 'b', (1, 2), 123] random.shuffle(li) print(li)
1.2 验证码 - 课上练习 # 随机数练习 # (1) 4位 数字验证码 # (2) 6位 数字验证码 # (3) 6位 数字+字母验证码 # (1) 4位 数字验证码 s = "" for i in range(4): num = random.randint(0, 9) s = s + str(num) print(s) # (2) 6位 数字验证码 s = '' for i in range(6): num = random.randrange(0, 10) s += str(num) print(s) # (1)和(2)改成函数版本 def func(n=6): s = '' for i in range(n): num = random.randint(0,9) s += str(num) return s print(func(4)) print(func()) # (3) 6位 数字+字母验证码 # 1. 随机字母如何生成 # 2. 一个位置上 出现的是数字还是字母(小写)应该是随机事件(概率一样) # 1. 怎么用简单的方法输出全部数字字母? # 0在acsii码中的位置48, 0-9的位置就是48-57 # A在acsii码中的位置65, A-Z的位置就是65-90(65+25) # a在acsii码中的位置97, a-z的位置就是97-122(97+25) # 两种取值方法 # 1>先随机取位置范围的数字,再把数字放到chr()中,然后打印 # ret = chr(random.randint(65, 90)( # print(ret) # 2>把所有的位置范围循环,打印chr(位置)放在列表中,再随机 # [chr(i) for i in range(48,58)] # 所有数字 # [chr(i) for i in range(65,91)] # 所有大写字母 # [chr(i) for i in range(97,123)] # 所有小写字母 # 老师讲解的 s = '' for i in range(6): # 重复操作6次 # 生成随机的大写字母,小写字母,数字各一个(出现的概率一样) num = str(random.randint(0, 9)) # 随机出一个数字 alpha_upper = chr(random.randint(65, 90)) # 随机出一个大写字母 alpha_lower = chr(random.randint(97, 122)) # 随机出一个小写字母 res = random.choice([num, alpha_upper, alpha_lower]) # 把随机的三个值放在列表中,再随机取一个,这样是为了保证三个值被取到的概率相同 s += res # 把每一次随机取出来叠加到字符串s print(s) # 最后输出的这个字符串就是6位的(数字+字母验证码) # 自己写的 l1 = [chr(i) for i in range(48, 58)] # s数字 l2 = [chr(i) for i in range(97, 123)] # 小写字母 s = '' # 空字符串s for i in range(6): num = random.choice(l1) # 随机出一个数字 alpha = random.choice(l2) # 随机出一个字母 ret = random.choice([num, alpha]) # 从列表li中取一个(一个位置出现字母和数字的概率应该相同) s += str(ret) # 把每一次随机取出来叠加到字符串s print(s) # 最后输出的这个字符串就是6位的(数字+字母验证码) # 函数版本 def code(n = 6): s = '' for i in range(6): # 实参没给就用默认值参数,给了就用给的参数 # 生成随机的大写字母,小写字母,数字各一个 num = str(random.randint(0, 9)) alpha_upper = chr(random.randint(65, 90)) alpha_lower = chr(random.randint(97, 122)) res = random.choice([num, alpha_upper, alpha_lower]) s += res return s print(code(4)) print(code())
1.3 字母/数字兼容的函数(3个功能) # 字母/数字兼容的函数(3个功能) # (1)4位 数字验证码 # (2)6位 数字验证码 # (3)6位 数字+字母验证码 # 简化代码,逻辑清晰,用最少的代码实现更多的功能 def code(n = 6, alpha = True): s = '' for i in range(n): num = str(random.randint(0, 9)) if alpha: alpha_upper = chr(random.randint(65, 90)) alpha_lower = chr(random.randint(97, 122)) num = random.choice([num, alpha_upper, alpha_lower]) s += num return s print(code(4, False)) # 4位数字 print(code(6, False)) # 6位数字 print(code()) # 6位的(数字+大写字母+小写字母)
2. time模块
2.1 time模块的常用方法 # time模块主要是用来和时间打交道的 # 时间格式(3种): # 格式化时间/字符串时间: '2018-8-20' '2018.8.20' 字符串数据类型 格式化时间 - 给人看的 # 结构化时间/元组时间: 作为字符串时间和时间戳时间之间的一个中间状态来使用的 # 时间戳时间/浮点型时间: 1566448411.2815611 浮点型数据类型以s(秒)为单位 时间戳时间 - 给机器计算用的 # 1970 1 1 0:0:0 # 时间节点:1970年的1月1号的伦敦时间的0点0分0秒 # (线程)推迟指定的时间运行。单位为秒。 time.sleep(2) # 程序走到这儿会等待(休眠)2秒 # 时间戳时间/浮点型时间 print(time.time()) # 当前时间的时间戳时间1566450347.240795 # 字符串时间/格式化时间 print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2019-08-22 12:50:10 当前时间的字符串时间 str format time print(time.strftime('%y-%m-%d %H:%M:%S')) # 19-08-22 12:50:10 小写y只显示19 print(time.strftime('%c')) # 外国格式:Thu Aug 22 12:51:22 2019 # 结构化时间/元组时间 print(time.localtime()) # 当前时间的结构化时间 struct_time = time.localtime() # 北京时间 print(struct_time) # 结果: time.struct_time(tm_year=2019, tm_mon=8, tm_mday=22, tm_hour=13, tm_min=6, tm_sec=23, tm_wday=3, tm_yday=234, tm_isdst=0) print(struct_time.tm_mon) # 从结构化时间中去取时间 # 结构化时间中的dst代表是否夏令时 # dst=0 0表示非夏令时 1表示夏令时 # 澳洲还在用
2.2 时间相关练习题 # 1. 课堂练习 # (1) 时间戳换成字符串时间 struct_time = time.localtime(1500000000) # 将时间戳时间1500000000通过localtime转换成了结构化时间(当地时间) # print(time.gmtime(1500000000)) # 将时间戳时间1500000000装换为结构化的伦敦时间 ret = time.strftime('%y-%m-%d %H:%M:%S', struct_time) # 将结构化时间通过strftime转换成了字符串时间 print(ret) # (2) 字符串时间 转 时间戳时间 struct_time = time.strptime('2018-8-8','%Y-%m-%d') # 先用strptime把字符串时间转成结构化时间 print(struct_time) # 打印结构化时间 res = time.mktime(struct_time) # 再用mktime把结构化时间转成时间戳时间 print(res) # 2. 课下练习 # (1) 查看一下2000000000时间戳时间表示的年月日 struct_time = time.localtime(2000000000) # 用localtime将时间戳时间2000000000转换为结构化时间 ret = time.strftime('%Y-%m-%d', struct_time) # 用strftime将结构化时间转换为字符串时间 print(ret) # 2033-05-18 # (2) 将2008-8-8转换成时间戳时间 struct_time = time.strptime('2008-8-8','%Y-%m-%d') # 用strptime将字符串时间2008-8-8转换为结构化时间 ret = time.mktime(struct_time) # 用mktime将结构化时间转换为时间戳时间 print(ret) # (3) 请将当前时间的当前月1号的时间戳时间取出来 - 函数 def func(): st = time.localtime() # 当前时间的结构化时间 st2 = time.strptime('%s-%s-1'%(st.tm_year,st.tm_mon),'%Y-%m-%d') # 把结构化时间里的年月取出来写成字符串格式的时间,然后用strptime结构化 return time.mktime(st2) # 将结构化的年月,通过mktime转换成时间戳时间,然后返回 print(func()) # (4) 计算时间差 - 函数 # 2018-8-19 22:10:8 2018-8-20 11:07:3 # 经过了多少时分秒 str_time1 = '2018-8-19 22:10:8' str_time2 = '2018-8-20 11:07:3' struct_t1 = time.strptime(str_time1, '%Y-%m-%d %H:%M:%S') struct_t2 = time.strptime(str_time2, '%Y-%m-%d %H:%M:%S') timestamp1 = time.mktime(struct_t1) timestamp2 = time.mktime(struct_t2) sub_time = timestamp2 - timestamp1 # 先把字符串时间转换成时间戳时间然后相减 gm_time = time.gmtime(sub_time) # 把时间戳时间的差 转换成 节点(伦敦时间)的结构化时间 # (利用了时间戳节点:伦敦时间1970-01-1 0:0:0) print("过去了%d年%d月%d天%d小时%d分%d秒"%(gm_time.tm_year-1970,gm_time.tm_mon-1, gm_time.tm_mday-1,gm_time.tm_hour,gm_time.tm_min,gm_time.tm_sec))
3. sys模块
import sys # sys模块是和python解释器打交道的 # 1. sys.argv的第一个参数 是python这个命令后的值 print(sys.argv) # ['D:\\pythonproject\\day18\\05_sys模块.py', 'alex', 'alex3714'] usr = sys.argv[1] pwd = sys.argv[2] if usr == 'alex' and pwd == 'alex3714': print('登录成功') else: exit() #为什么要使用argc? # 1. 程序员 运维人员 在命令行运行代码 # 2. 操作系统input事件 阻塞 退出了CPU的竞争 # 2. sys.path是python的搜索模块的路径集,是一个list print(sys.path) # 打印出模块的搜索路径 # 模块是存在解释器里的吗?? 不是 # 模块应该是存在硬盘上 # 但是我在使用的时候 import --> 这个模块才到内存中 # 一个模块能否被顺利的导入 全看sys.path 下面有没有这个模块所在的 # 学习自定义模块的时候 导入模块的时候 还需要再灌注 sys.path # 3. sys.modules sys.modules是一个全局字典,该字典是python启动后就加载在内存中。每当程序员导入新的模块,sys.modules都将记录这些模块。字典sys.modules对于加载模块起到了缓冲的作用。 print(sys.modules) # 是我们导入到内存中所有的模块的名字: 这个模块的内存地址 print(sys.modules['re'].findall('\d','abc126')) # 通过名字可以拿到具体的方法
4. os模块
import os # os是和操作系统交互的模块 1. 文件夹和文件相关(8) # (1) 生成目录 os.makedirs('dir1/dir2') # 生成多级目录 os.mkdir('dir3') # 生成单级目录 os.mkdir('dir3/dir4') # 在die3的目录下再生成dir4 # (2) 删除文件夹,只能删除空位文件夹,不是空的就报错. os.rmdir('dir3/dir4') # 删除一个 os.removedirs('dir3/dir4') # 删除多层 os.removedirs('dir1/dir2') # ,如果dir1中海油一个文件aaa,那就只删除了dir2 # (3) os.listdir列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 file_list = os.listdir('D:\pythonproject') for path in file_list: # os.path.join 不需要考虑跨平台,文件夹和文件的分隔符 print(os.path.join('D:\pythonproject', path)) # 文件夹和文件中间的分隔符 # \ window # / linux # (4) 删除一个文件 os.remove('../day17/move_info7') # 返回上一层,访问day17目录中的move_info7文件,将它删除 # (5) 重命名文件/目录 os.rename("../day17/aaa", "../day17/我爱你") # 返回上一层,访问day17目录中的aaa文件,将aaa文件重命名为我爱你 # (6) 获取文件/目录信息 print(os.stat(r'D:\pythonproject\day18\06 os模块.py')) 返回值: os.stat_result(st_mode=33206, st_ino=31243722414894972, st_dev=3596035138, st_nlink=1, st_uid=0, st_gid=0, st_size=2145, st_atime=1566698216, st_mtime=1566698216, st_ctime=1566698216) stat 结构: st_mode: inode 保护模式 st_ino: inode 节点号。 st_dev: inode 驻留的设备。 st_nlink: inode 的链接数。 st_uid: 所有者的用户ID。 st_gid: 所有者的组ID。 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 st_atime: 上次访问的时间。 st_mtime: 最后一次修改的时间。 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元 数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。
1.2 执行操作系统命令有关(4) # (1) 执行字符串数据类型的 命令行代码 # exec/eval 执行的是字符串数据类型的 python代码 # 而os.system和os.popen是执行字符串数据类型的 命令行代码 # os.system执行系统的命令,没有返回值,实际的操作/删除一个文件 创建一个文件夹 exec os.system('dir') # 乱码 # 程序要处理这些路径 eval和os.popen 有返回值 ret = os.popen('dir') # 适合做查看类的操作 s = ret.read() print(s) print(s.split('\n')) # (2) 查看当前的工作目录 print(os.getcwd()) # current work dir # 并不是当前文件所在的目录(储存的地方) # 当前文件是在哪个目录下执行的(这个文件在D盘储存,但是在C盘执行) ret = os.popen('dir') s = ret.read() print(s) # (3) 切换当前的工作目录 os.chdir('D:\pythonproject\day18') # 无论在哪个目录下执行,都切换到当前目录 ret = os.popen('dir') s = ret.read() print(s)