zoukankan      html  css  js  c++  java
  • 包、常用模块

    一.模块的循环导入

    模块循环/嵌套导入抛出异常的根本原因是由于在python中模块被导入一次之后,就不会重新导入,只会在第一次导入时执行模块内代码。在我们的项目中应该尽量避免出现循环/嵌套导入,如果出现多个模块都需要共享的数据,可以将共享的数据集中存放到某一个地方。

    在程序出现了循环/嵌套导入后的异常分析、解决方法如下:

    方法一:导入语句放到最后
    #m1.py
    print('正在导入m1')
    
    x='m1'
    
    from m2 import y
    
    #m2.py
    print('正在导入m2')
    y='m2'
    
    from m1 import x
    
    方法二:导入语句放到函数中
    #m1.py
    print('正在导入m1')
    
    def f1():
        from m2 import y
        print(x,y)
    
    x = 'm1'
    
    # f1()
    
    #m2.py
    print('正在导入m2')
    
    def f2():
        from m1 import x
        print(x,y)
    
    y = 'm2'
    
    #run.py
    import m1
    
    m1.f1()
    View Code

     二.包

    1.什么是包?

    包就是一个含有__init__.py文件的文件夹。

    注:

        1. 在python3中,即使包下没有__init__.py文件,import 包仍然不会报错,而在python2中,包下一定要有该文件,否则import 包报错   

        2. 创建包的目的不是为了运行,而是被导入使用,记住,包只是模块的一种形式而已,包的本质就是一种模块

    2.为何要用包?

    包的本质就是一个文件夹,那么文件夹唯一的功能就是将文件组织起来, 随着功能越写越多,我们无法将所以功能都放到一个文件中,于是我们使用模块去组织功能,而随着模块越来越多,我们就需要用文件夹将模块文件组织起来,以此来提高程序的结构性和可维护性。

    3.如何用包?

    #m1.py
    
    def func1():
        print('from func1')
    
    def func2():
        print('from func2')
    
    
    def func3():
        print('from func3')
    
    def func4():
        print('from func4')
    
    #m2.py
    
    def f1():
        print('from f1')
    
    def f2():
        print('from f2')
    
    def f3():
        print('from f3')
    
    def f4():
        print('from f4')
    
    #m3.py
    
    # from aaa.m2 import f1
    
    from ..m2 import f1
    
    def fff():
        print('fff====>')
        f1()
    
    
    #run.py
    
    import sys
    sys.path.append(r'E:脱产5期内容day16dir')
    
    import aaa # aaa--------->__init__.py
    
    aaa.func1()
    aaa.func2()
    aaa.func3()
    aaa.func4()
    aaa.f1()
    aaa.f2()
    aaa.f3()
    aaa.f4()
    aaa.fff()
    
    #__init__.py
    
    #把aaa这个包内子文件内的所有名字都要导入到__init__.py这个文件中
    #方式一:
    绝对导入:以包的顶级目录作为起始,往下查找
    from aaa.m1 import func1,func2,func3,func4 
    
    from aaa.m2 import f1,f2,f3,f4
    
    from aaa.bbb.m3 import fff
    #方式二:
    相对导入:它只能在包内使用,具体用法是from .模块名 import 名字
    from .m1 import func1,func2,func3,func4
    
    from .m2 import f1,f2,f3,f4
    
    from .bbb.m3 import fff
    View Code

    三.json模块与pickle模块

    1.什么是序列化?

    序列化就是将内存中数据类型转换成另外一种格式

    例如:

    字典————>序列化——————>其他格式——————>存到硬盘

    硬盘————>读到内存——————>其他格式——————>反序列化——————>字典

    2.为什么要序列化?

      1.持久保存程序的运行状态

      2.实现数据的跨平台交互

    3.如何序列化?

    json模块:json.dumps() (序列化),json.loads() (反序列化)

    优点:是一种通用的格式,所有的编程语言的可以识别,跨平台性好

    缺点:不能识别所有python的数据类型(不能识别单引号)

    pickle模块:pickle.dumps() (序列化),pickle.loads() (反序列化)

    优点:可以识别python的所有数据类型

    缺点:只能被python的编程语言识别,跨平台性差

    # ========================json
    import json
    
    dic={'k1':True,'k2':10,'k3':'egon','k4':'你好啊'}
    
    # 序列化
    dic_json=json.dumps(dic)
    print(dic_json,type(dic_json))
    
    # 持久化
    with open('a.json',mode='wt',encoding='utf-8') as f:
        f.write(dic_json)
    
    序列化+持久化
    with open('a.json',mode='wt',encoding='utf-8') as f:
        json.dump(dic,f)
    
    
    import json
    # 从文件中读取json格式化的字符
    with open('a.json',mode='rt',encoding='utf-8') as f:
        dic_json=f.read()
    
    # 反序列化
    dic=json.loads(dic_json)
    print(dic,dic['k1'])
    
    # 读取文件内容+f反序列化
    with open('a.json',mode='rt',encoding='utf-8') as f:
        dic=json.load(f)
        print(dic['k1'])
    
    
    
    # ========================pickle
    import pickle
    
    dic={'k1':True,'k2':10,'k3':'egon','k4':'你好啊',}
    
    
    #===========>1 pickle.dumps与pickle.loads
    
    dic_pkl=pickle.dumps({1,2,3,4})
    print(dic_pkl)
    
    with open('b.pkl',mode='wb') as f:
        f.write(dic_pkl)
    
    
    
    
    
    with open('b.pkl',mode='rb') as f:
        s_pkl=f.read()
        s=pickle.loads(s_pkl)
        print(type(s))
    
    
    #===========>2 pickle.dump与pickle.load
    with open('c.pkl',mode='wb') as f:
        pickle.dump(dic,f)
    
    with open('c.pkl',mode='rb') as f:
        dic=pickle.load(f)
        print(dic,type(dic))
    View Code

    四.time模块和datetime模块

    time模块:

    时间分为三种格式:

    1.时间戳

    import time
    
    print(time.time()) #从1970年到当前时间所经历的秒数,主要用于时间运算,比如时间差

    2.格式化的字符串

    print(time.strftime('%Y-%m-%d %H:%M:%S %p'))
    #固定格式,2018-12-5 15:15:10 pm
    #主要用在展示时间,记录日志

    3.结构化的时间对象

    print(time.localtime()) #本地时间
    print(time.localtime().tm_hour) #截取当前小时
    print(time.localtime().tm_wday) #截取本周第几天
    print(time.localtime().tm_yday) #截取本月第几天
    print(time.gmtime()) #世界标准时间

    时间转换:

    # 时间戳---->struct_time------->格式化的字符串
     struct_time=time.localtime(123123)
     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))

    datetime模块:

    #时间加减
    import datetime
    
    # print(datetime.datetime.now()) #返回 2016-08-19 12:47:03.941925
    # print(datetime.date.fromtimestamp(time.time()) )  # 时间戳直接转成日期格式 2016-08-19
    # print(datetime.datetime.now() )
    # print(datetime.datetime.now() + datetime.timedelta(3)) #当前时间+3天
    # print(datetime.datetime.now() + datetime.timedelta(-3)) #当前时间-3天
    # print(datetime.datetime.now() + datetime.timedelta(hours=3)) #当前时间+3小时
    # print(datetime.datetime.now() + datetime.timedelta(minutes=30)) #当前时间+30分
    
    # c_time  = datetime.datetime.now()
    # print(c_time.replace(minute=3,hour=2)) #时间替换
    

    五.random模块

    import random
     
    print(random.random())#(0,1)----float    大于0且小于1之间的小数
     
    print(random.randint(1,3))  #[1,3]    大于等于1且小于等于3之间的整数
     
    print(random.randrange(1,3)) #[1,3)    大于等于1且小于3之间的整数
     
    print(random.choice([1,'23',[4,5]]))#1或者23或者[4,5]
     
    print(random.sample([1,'23',[4,5]],2))#列表元素任意2个组合
     
    print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 
     
     
    item=[1,3,5,7,9]
    random.shuffle(item) #打乱item的顺序,相当于"洗牌"
    print(item)
    def make_code(max_size=5):
        res=''
        for i in range(max_size):
            num=str(random.randint(0,9))
            alp=chr(random.randint(65,90))
    
            res+=random.choice([num,alp])
    
        return res
    随机生成验证码
  • 相关阅读:
    Mac终端编写c语言程序方法
    X-code最常用快捷键
    类方法和实例方法区别
    一、SQL语句中的增、删、查、改
    从零开始,学习web前端之HTML基础
    图片 自适应 容器大小
    Java第二天 数据类型
    Java 第一天
    javascript的基础知识
    JavaScript(一)
  • 原文地址:https://www.cnblogs.com/wangke0917/p/10070719.html
Copyright © 2011-2022 走看看