day18

孤街浪徒 提交于 2019-11-28 09:46:57

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))

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!