zoukankan      html  css  js  c++  java
  • python基础之模块&包

    1、模块

    1.1模块的概念

          在计算机程序的开发过程中,随着程序代码的越写越多,在一个文件里代码越来越长,这就不便于维护。为了便于维护代码,把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言采用这种方式。在python中,一个.py文件就称之为一个模块(Module)。

         使用模块的好处:(1)提高了代码的可维护性

                                      (2)编写代码不必从零开始,当一个模块编写完毕,就可以被其他地方应用

                                      (3)使用模块还可以避免函数名与变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中。

    模块有:Python标准库、第三方模块、应用程序自定义模块

    1.2 模块导入的方法

    (1)import语句

    mport module1[,module2[,...moduleN]]

    (2)from......import语句

    from modname import name1[,name2[,......nameN]]

    这个申明不会把整个modulename模块导入当前的命名空间中,只会讲它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

    (3)From......import*语句

    2、包

    2.1包的概念

         为了避免不同的人编写的模块名冲突,python中引入了按目录来组织模块的方法,成为包(Package)。

    例如:一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。现在假设abc与xyz模块的名字与其他模块的名字起冲突了,问了避免冲突,我们可以通过包来组织模块。方法是选择一个顶层报名:引入包以后,只要顶层的报名不与别人的起冲突,那么所有的模块都不会与别人冲突。

    注意:每一个包目录下都会有一个__init__.py的文件,这个文件是必须存在的,否则,python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。

    3、常用的模块

    3.1time模块

    import time
    
    时间戳,用秒是因为做计算用
    print(time.time())    #1563248318.8498843秒
    
    结构化时间----当地时间
    print(time.localtime())       #默认当时的时间print(time.localtime(time.time()))
    print(time.localtime(134134645))
    t=time.localtime()
    print(t.tm_year)
    print(t.tm_wday)
    
    结构化时间----世界标准时间(UTC)
    print(time.gmtime())
    
    ------将结构化时间转换成时间戳
    
    print(time.mktime(time.localtime()))
    
    ------将结构化时间转换成字符串时间
    print(time.strftime("%Y-%m-%d %X",time.localtime()))
    
    ------将字符串时间转换成结构化时间
    print(time.strptime("2019:07:16:12:04:38","%Y:%m:%d:%X"))
    
    print(time.asctime())
    print(time.ctime())

    3.2 random模块

    import random
    
    生成0-1之间的随机浮点数
    ret=random.random()
    print(ret)
    
    
    用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
    ret=random.randint(a,b)
    print(ret)
    
    
    从指定范围内,按指定基数递增的集合中 获取一个随机数。
    random.randrange(10, 30, 2),结果相当于从[10, 12, 14, 16, ... 26, 28]序列中获取一个随机数。
    random.randrange(10, 30, 2)在结果上与 random.choice(range(10, 30, 2) 等效。
    ret=random.randrange(1,3)
    print(ret)
    
    
    random.choice从序列中获取一个随机元素。其函数原型为:random.choice(sequence)。
    参数sequence表示一个有序类型。这里要说明 一下:sequence在python不是一种特定
    的类型,而是泛指一系列的类型。list, tuple, 字符串都属于sequence。
    ret=random.choice([11,22,33])
    print(ret)
    
    
    从指定序列中随机获取指定长度的片断并随机排列。注意:sample函数不会修改原有序列。
    ret=random.sample([11,22,33,44,55],2)
    print(ret)
    
    
    用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。
    ret=random.uniform(1,4)
    print(ret)
    
    
    item=[1,3,5,6,8]
    random.shuffle(item)         #用于将一个列表中的元素打乱,即将列表内的元素随机排列。
    print(item)
    View Code

    3.3 os模块

    (1) os.name          #显示当前使用的平台
    (2) os.getcwd()      #显示当前python脚本工作路径
    (3) os.listdir('dirname')        #返回指定目录下的所有文件和目录名
    (4) os.remove('filename')       #删除一个文件
    (5) os.makedirs('dirname/dirname')     #可生成多层递规目录
    (6) os.rmdir('dirname')     #删除单级目录
    (7) os.rename("oldname","newname")    #重命名文件
    (8) os.system()     #运行shell命令,注意:这里是打开一个新的shell,运行命令,当命令结束后,关闭shell
    (9) os.sep          #显示当前平台下路径分隔符
    (10)  os.linesep    #给出当前平台使用的行终止符
    (11) os.environ     #获取系统环境变量
    (12) os.path.abspath(path)     #显示当前绝对路径
    (13) os.path.dirname(path)     #返回该路径的父目录
    (14) os.path.basename(path)    #返回该路径的最后一个目录或者文件,如果path以/或结尾,那么就会返回空值。
    (15) os.path.isfile(path)      #如果path是一个文件,则返回True
    (16) os.path.isdir(path)       #如果path是一个目录,则返回True
    (17) os.stat()      #获取文件或者目录信息
    (18) os.path.split(path)  #将path分割成路径名和文件名。(事实上,如果你完全使用目录,它也会将最后一个目录作为文件名而分离,同时它不会判断文件或目录是否存在)
    (19) os.path.join(path,name)   #连接目录与文件名或目录 结果为path/name

    3.4 sys模块

    (1)sys.argv             #命令行参数List,第一个元素是程序本身路径
    (2)sys.modules.keys()   #返回所有已经导入的模块列表
    (3)sys.exit(n)          #退出程序,正常退出时exit(0)
    (4)sys.version          #获取Python解释程序的版本信息
    (5)sys.maxsize          #最大的Int值
    (6)sys.modules          #返回系统导入的模块字段,key是模块名,value是模块
    (7)sys.path             #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    (8)sys.platform         #返回操作系统平台名称

    3.5 json&pickle模块

    (1)序列化的概念

          我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在python中叫pickling。

          序列化后,就可以把序列化的内容写入磁盘或通过网络传输到别的机器上。

          反序列化:把变量内容从序列化对象重新读到内存里,即unpickling。

    (2)json的概念

             如果在不同的编程语言之间传递对象,就必须把对象序列化为标准格式,比如xml,但更好的方法是序列化为JSON。因为JSON表示出来就是一个字符串,可以被所有语言读取,也可以方便地存储磁盘或者通过网络传输,json不仅是标准格式,并且比xml快,而且可以直接在WEB页面中读取,非常方便。

             JSON表示的对象就是标准的javascript语言的对象,JSON和python内置的数据类型对应如下:

    Json类型 python类型
    {} dict
    [] list
    "string" str
    1234.56 int或float
    true/false True/False
    null

    None

    (3)pickle

         pickle的问题和所有其他编程语言特有的序列化问题一样,只用于python,并且不同版本的python可能不兼容,因此,只能用pickle保存那些不重要的数据。

    (4) Json和pickle

        Json 模块提供了四个方法: dumps、dump、loads、load
        pickle 模块也提供了四个功能:dumps、dump、loads、load

    a. dumps 和 dump:
    dumps和dump 序列化方法
    dumps只完成了序列化为str,
    dump必须传文件描述符,将序列化的str保存到文件中 b. loads 和 load
    查看源码:
    def dumps(obj, skipkeys=False, ensure_ascii=True, check_circular=True,
            allow_nan=True, cls=None, indent=None, separators=None,
            default=None, sort_keys=False, **kw):
        # Serialize ``obj`` to a JSON formatted ``str``.
        # 序列号 “obj” 数据类型 转换为 JSON格式的字符串 
    def dump(obj, fp, skipkeys=False, ensure_ascii=True, check_circular=True,
            allow_nan=True, cls=None, indent=None, separators=None,
            default=None, sort_keys=False, **kw):
        """Serialize ``obj`` as a JSON formatted stream to ``fp`` (a
        ``.write()``-supporting file-like object).
         我理解为两个动作,一个动作是将”obj“转换为JSON格式的字符串,还有一个动作是将字符串写入到文件中,也就是说文件描述符fp是必须要的参数 """

    示例代码(json):

    >>> import json
    >>> json.dumps([])    # dumps可以格式化所有的基本数据类型为字符串
    '[]'
    >>> json.dumps(1)    # 数字
    '1'
    >>> json.dumps('1')   # 字符串
    '"1"'
    >>> dict = {"name":"Tom", "age":23}  
    >>> json.dumps(dict)     # 字典
    '{"name": "Tom", "age": 23}'
    a = {"name":"Tom", "age":23}
    with open("test.json", "w", encoding='utf-8') as f:
        # indent 超级好用,格式化保存字典,默认为None,小于0为零个空格
        f.write(json.dumps(a, indent=4))
        # json.dump(a,f,indent=4)   # 和上面的效果一样
    # ----------序列化
    import json
    
    dic = {'name':'czd','age':23,'sex':'male'}
    print(type(dic))   #<class 'dict'>
    
    j=json.dumps(dic)
    print(type(j))    #<class 'str'>
    
    f=open('序列化对象1','w')
    f.write(j)                  #等价于json.dump(dic,f)
    f.close()
    
    
    
    # -----------反序列化
    import json
    
    f=open('序列化对象1')
    data=json.loads(f.read())       #等价于data=json.load(f)
    View Code


    loads和load 反序列化方法
                 loads 只完成了反序列化,
                 load 只接收文件描述符,完成了读取文件和反序列化

    查看源码

    def loads(s, encoding=None, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
        """Deserialize ``s`` (a ``str`` instance containing a JSON document) to a Python object.
           将包含str类型的JSON文档反序列化为一个python对象"""
    def load(fp, cls=None, object_hook=None, parse_float=None, parse_int=None, parse_constant=None, object_pairs_hook=None, **kw):
        """Deserialize ``fp`` (a ``.read()``-supporting file-like object containing a JSON document) to a Python object.
            将一个包含JSON格式数据的可读文件反序列化为一个python对象"""
    import json
    with open("test.json", "r", encoding='utf-8') as f:
        aa = json.loads(f.read())
        f.seek(0)
        bb = json.load(f)    # 与 json.loads(f.read())
    print(aa)
    print(bb)
    
    # 输出:
    {'name': 'Tom', 'age': 23}
    {'name': 'Tom', 'age': 23}

    示例代码(pickle)

    import pickle
    
    dic = {'name':'czd','age':23,'sex':'male'}
    print(type(dic))   #<class 'dict'>
    
    p=pickle.dumps(dic)
    print(type(p))    #<class 'str'>
    
    f=open('序列化对象1','w')
    f.write(j)                  #等价于pickle.dump(dic,f)
    f.close()
    
    
    
    # -----------反序列化
    import pickle
    
    f=open('序列化对象1')
    data=pickle.loads(f.read())       #等价于data=pickle.load(f)
    View Code

    3.6 shelve模块
         shelve模块比pickle模块简单,只有一个open函数,返回类似字典的对象,可读可写;keys必须为字符串,而值可以是python所支持的数据类型。

    ##---------------shelve模块
    import shelve
    
    f=shelve.open(r'shelve')    #目的:将字典放入文本中 f={}
    
    f=shelve.open(r'shelve')
    
    # f['stu1_info']={'name':'alex','age':18}
    # f['stu2_info']={'name':'czd','age':21}
    # f['school_info']={'website':'fzuniversity.edu','city':"fuzhou"}
    #
    # f.close()
    
    print(f.get('stu1_info')['age'])

    3.7 xml模块
          xml模块是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来简单。

          xml的格式如下,通过< >节点来区别数据结构的:

    xml的格式:
    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Pananma">
            <rank updated="yes">69</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>
    View Code

          xml的创建:

    import xml.etree.ElementTree as ET
    
    new_xml=ET.Element("namelist")
    
    name=ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"})
    age=ET.SubElement(name,"age",attrib={"checked":"no"})
    sex=ET.SubElement(name,"sex")
    sex.text='33'
    
    name2=ET.SubElement(new_xml,"name",attrib={"enrolled":"no"})
    age=ET.SubElement(name2,"age")
    age.text='19'
  • 相关阅读:
    未进入Kali Linux系统修改修改密码的方法
    SQL 修改字段名,数据类型,增加字段
    在 SAE 上部署 ThinkPHP 5.0 RC4
    在 C# 里使用 F# 的 option 变量
    Retinex图像增强和暗通道去雾的关系及其在hdr色调恢复上的应用
    暗通道去雾算法的python实现
    解析hdr图像文件的python实现
    博客说明
    retinex图像增强算法的研究
    我知道的JavaScript设计模式(桥接)应用之验证器
  • 原文地址:https://www.cnblogs.com/changzhendong/p/11247436.html
Copyright © 2011-2022 走看看