day18

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)

 

posted @ 2019-08-24 09:30  magickang  阅读(121)  评论(0编辑  收藏  举报