zoukankan      html  css  js  c++  java
  • day16 包的使用 json time 常用模块

    复习

    1.判断py文件的两种用途
    提到判断__name__ == '__main__'时,会执行py文件,
    直接输入main,在pycharm里按tab直接自动输入这条语句
    
    2.解决模块相互导入的问题: 
    在说之前,要知道文件的互相导入,是目录结构设计的不够合理,应该尽量调整程序结构并避免
    run.py
    import m1
    m1.fun1()
    
    m2.py
    print('正在导入m2')
    from m1 import x
    y='m2'
    
    m1.py
    print('正在导入m1')
    from m2 import y
    print('来自m2的y:',y)
    x='m1'
    
    上面的run.py文件运行时会报错,报错的地方在m2中的from m1 import x,因为x还未定义就跳转到m2文件中去了,所以,这时候内存中还没有x,会报错
    
    把函数内的定义放在导入的前面,这样可以先创建好自己的名称空间,方便互相导入,或者把导入放在函数中写,这样调用函数的时候才会导入模块
    
    调整后的m1.py
    def func1():
        from m2 import y,func2
        print('来自于m2的y:',y)
        func2()
    x = 'm1'
    
    调整后的m2.py
    def func2():
        from m1 import x
        print('来自m1的x:',x)
    y = 'm2'
    这样定义好后,运行run.py会把两个模块的名称空间都创建好了,方便后续的使用

    今日内容

    1. 包

    1. 什么是包
        包就是一个含有__init__.py文件的文件夹,导包就相当于在导入init文件
        包里的所有内容没有右键运行一说
    2. 导入都以包的顶级目录往下找
    3. 绝对导入
       相对导入:(仅限在包内使用)
        .加要用的模块名

    2. json&pickle (*****) (为了解决序列化问题)

    不要把自己定义的文件名命名为json或者pickle
    1. 什么是序列化
    序列化就是将内存中的数据类型转成另外一种格式
    即:
        序列化:字典------序列化----->其他格式-------->存到硬盘
        硬盘---读取------>其他格式------反序列化------>字典
    2. 为什么要序列化
        1. 持久保存程序的运行状态
        2. 数据的跨平台交互
        
        
    3.如何序列化
    
        json:(以后常用的是json,为了程序的跨平台性)
            优点:这种格式是一种通用的格式,所有编程语言都能识别      缺点:不能识别所有python的数据类型
           强调:json内没有单引号
           
           用法:
           1.json.dumps和json.dump
           import json
           dic = {'k1':True,'k2':10,'k3':'egon','k4':'你好啊'}
           dic_pkl = json.dumps(dic) # 序列化
           with open('1.json',mode='wt',encoding='utf8') as f:
            f.write(dic_pkl) # 持久化
            
           以上语句可以一步做到,用json.dump直接序列化+持久化
           with open(1.json,mode='wt',encoding='utf8') as f:
            json.dump(dic,f)
            
            2.反序列化
            1.json.loads和json.load
            import json
            with open('1.json',mode = 'rt',encoding = 'utf8') as f:
                dic_json = f.read()
            dic = dic_json.loads(dic_json) 反序列化
            print(dic)
           
           以上语句也可以用一步做到,json.laod()
           with open('1.json',mode = 'rt',encoding = 'utf8') as f:
                dic = json.load(f)
                print(dic['k1'])

    pickle
        优点:能识别所有python类型
            缺点:职能被python这门编程语言识别
        
        用法,pickle的用法和json的用法一模一样
        dic={'k1':True,'k2':10,'k3':'egon','k4':'你好啊'}
        1.pickle.dumps与pickle.dump
        dic_pkl=pickle.dumps(dic)
        with open('1.pickle',mode = 'wb') as f:
            f.write(dic_pkl)
            
        用dump代替
        with open('1.pickle',mode = 'wb') as f:
            pickle.dump(dic,f)
            
        2.pickle的loads,load
        with open('1.pickle',mode = 'rb') as f:
            dic_pkl=f.read()
        dic = pickle.loads(dic_pkl)
        
        用laod代替
        with open('1.pickle',mode = 'rb') as f:
            dic = pickle.load(f)
            print(dic)

    3.time&datetime模块

    http://www.cnblogs.com/linhaifeng/articles/6384466.html
    时间分为三种格式:
        1.时间戳:1970年1月1号到今天经过的秒数
            import time
            time.time()
        2. 格式化的字符
            print(time.strftime('%Y-%m-%d %H:%M:%S %p'))
        3.结构化的时间对象
            time.localtime() 得到本地时间的结构化时间对象
            time.localtime().tm_hour 只获取小时
            time.localtime().tm_wday 获取是本月的第几周
            time.localtime().tm_yday 获取本年的第几天 只获取小时只获取小时东八区的中国时间
            time.gmtime()  格林威治时间
            
        4. 时间转换
        时间戳---->struct time ------>格式化的字符串
        struct_time = time.localtime(123123123) 时间戳转struct time
        print(struct_time)
        print(time.strftime('%Y-%m-%d',struct_time))转成字符串
        
        格式化的字符串----->struct_time----->时间戳
        struct_time= time.strptime('2017-03-11','%Y-%m-%d')
        print(struct_time)
        print(time.mktime(struct_time))
        
        
        time模块的问题:
        1.格式化时间的获取比较麻烦
        2.时间转换不方便
        3.时间的计算太麻烦
        
        datatime解决了以上问题
        datetime.datetime.now() # 获取当前本地时间的格式化时间对象
        datetime.datetime.fromtimestamp(123123123) #从1970年1月1号往后多少秒后的时间转换成格式化时间对象
        datetime.datetime.now()+datetime.timedelta(days = 3) # 当前本地时间加上三天后的时间,换算成格式化时间对象
        datetime.datetime.now() + datetime.timedelta(days=3,hours = 3)

    4. 随机模块

    random() 随机取0到1之间的小数,不包含0和1
    random.randint(1,3) [1,3] 取大于等于1,小于等于3的整数
    random.randrange(1,3) [1,3) 取大于等于1小于3的整数
    random.uniform(1,3) 取大于1小于3的小数
    random.choice([1,'a','c']) 每次从里面选择一个
    random.sample([1,'a','c'],2) 每次从列表里选择2个
    item=[1,3,5,7,9]
    random.shuffle(item) #给列表其中元素洗牌
    
    小练习,生成一个网站的验证码
    import random
    def make_code(max_size = 6):
        res = ''
        for i in range(max_size):
            num = random.randint(0,9)
            alp = char(random.randint(65,90))
            res = random.choice(num,alp)
    
    其中chr(65)  把里面数字转成对应的ascii码表
    make_code(10)
  • 相关阅读:
    ZEat
    BingWallpaper
    ZBreak
    C语言块内变量回收问题
    Android 隐藏RadoiButton左边按钮
    php文件管理与基础功能的实现
    Ajax写分页查询(实现不刷新页面)
    jquery写日期选择器
    ajax三级联动下拉菜单
    ajax bookstrap美化网页,并实现页面的加载,删除与查看详情
  • 原文地址:https://www.cnblogs.com/shanau2/p/10071886.html
Copyright © 2011-2022 走看看