Python札记44_模块(sys、copy)

作者: 皮皮大 | 来源:发表于2019-07-15 20:49 被阅读0次

    Python的强大不仅体现在它拥有强大的自有模块(标准库),同时还体现在它有海量的第三方库。

    模块的自信来自于,模块是拿来即用的,不用自己编写


    什么是模块

    模块在Python中就是一个.py的程序。同样是一个py的程序既可以当做程序来执行,也可以当做模块来引入。
    比如现在有有个文件mokuai.pyD:\Python\datalearning\mokuai.py中,模块中有个函数可以说是方法lang

    image.png
    • 直接运行:python mokuai.py
    • 当做模块引入
    import sys   # sys是标准库
    sys.path.append("D:\Python\datalearning\mokuai.py")    # python中所有的模块加入到sys.path 中
    import mokuai    # 将程序作为整个模块导入
    mokuai.lang()  # 调用模块中的函数即方法,执行得到结果
    

    查看模块mokuai的具体特殊属性:

    ['__builtins__',
     '__cached__',
     '__doc__',
     '__file__',
     '__loader__',
     '__name__',
     '__package__',
     '__spec__',
     'lang']   # 代码中定义的属性
    
    >>mokuai.__name__   # 模块的属性__name__的值就是模块名称
    'mokuai'
    

    模块位置

    为了能够让Python器知道我们写的模块在什么位置,需要用sys.path.append("绝对路径")。在Python中将所有可饮用的模块加入到sys.path里面。

    import sys 
    import pprint
    pprint.pprint(sys.path)
    
    ['D:\\Python\\datalearning',
     'D:\\Python\\lib',
     'D:\\Python',
     'c:\\users\\admin\\venv',
     '',
     'c:\\users\\admin\\venv\\lib\\site-packages',
     'c:\\users\\admin\\venv\\lib\\site-packages\\setuptools-39.1.0-py3.7.egg',
     'c:\\users\\admin\\venv\\lib\\site-packages\\win32',
     'c:\\users\\admin\\venv\\lib\\site-packages\\win32\\lib',
     'c:\\users\\admin\\venv\\lib\\site-packages\\Pythonwin',
     'c:\\users\\admin\\venv\\lib\\site-packages\\IPython\\extensions',
     'C:\\Users\\admin\\.ipython',
     'D:\\Python\\datalearning\\mokuai.py']   # 找到模块所在的位置
    

    模块文件可以放置到任意指定的位置,只需要添加到环境变量即可。


    _all_作用

    定义两个变量和两个函数(方法),其中一个带上双下划线的是私有变量

    public_var = "I am public"   
    _private_var = "I am private"  # 私有变量
    
    def public():
        print("hello python")
    
    def _private():
        print("hello java")
    
    image.png

    被视为私有的变量、函数或者类没有访问权限。改进方法:使用__all__

    • 指定__all__变量
    • 只能访问指定的内容
    __all__ = ['_private_var', 'public']    # 增加__all__变量,告诉解释器可以访问这两个变量。
    
    public_var = "I am public"
    __private_var = "I am private"  # 私有变量
    
    def public():
        print("hello python")
    
    def private():
        print("hello java")
    
    image.png image.png

    包和库

    包和库比模块大。包里面有很多的模块。三者的大小是:模块--->包--->库(从小到大)。一个包由很多的模块(.py文件)组成。此时包就是熟悉的目录,那怎么引用包中的模块呢?

    解决办法:在目录中放置一个init.py文件。init.py文件是一个空文件,这样目录中的其他py文件就可以当做模块引用。比如Peter目录下面有两个模块:.py1和.py2

    >>import Peter.py1  # 导入模块
    >>Peter.py1.lang  # (lang是py1中的方法),调用模块的方法
    
    # 另一种导入方法
    >>from Peter import py1
    >>py1.lang
    

    标准库

    pprint:让字典格式化输出

    import pprint       # 导入模块
    a = {"name": "shenzhen", "lang": "python", "number": 123}
    pprint.pprint(a)   # 调用模块的方法
    
    # 结果
    {'lang': 'python', 
    'name': 'shenzhen',
     'number': 123}
    
    from pprint import *  # 表示导入模块pprint的所有方法
    import pprint  as pt   # 导入模块简写
    from pprint import pprint as pt 
    

    查看模块的信息,以pprint为例

    >>dir(pprint)
    
    ['PrettyPrinter',
     '_StringIO',
     '__all__',
     '__builtins__',
     '__cached__',
     '__doc__',   # pprint.__doc__    查看整个文档信息
     '__file__',  # 模块位置
     '__loader__',
     '__name__',
     '__package__',
     '__spec__',
     '_builtin_scalars',
     '_collections',
     '_perfcheck',
     '_recursion',
     '_safe_key',
     '_safe_repr',
     '_safe_tuple',
     '_sys',
     '_types',
     '_wrap_bytes_repr',
     'isreadable',
     'isrecursive',
     'pformat',
     'pprint',
     're',
     'saferepr']
    
    >>help(pprint.isreadable)     # 查看模块的属性
    

    标准库

    sys

    >>import sys
    >>print(sys.__doc__)
    
    This module provides access to some objects used or maintained by the
    interpreter and to functions that interact strongly with the interpreter.
    
    • sys.argv:获取运行 Python 程序的命令行参数。(python pp.py 其中pp.py就是命令行参数)
      • sys.argv[0] 通常就是指该 Python 程序
      • sys.argv[1] 代表为 Python 程序提供的第一个参数
      • sys.argv[2] 代表为 Python 程序提供的第二个参数……依此类推。
    • sys.byteorder:显示本地字节序的指示符。如果本地字节序是大端模式,则该属性返回 big;否则返回 little。
    • sys.copyright:该属性返回与 Python 解释器有关的版权信息。
    • sys.executable:该属性返回 Python 解释器在磁盘上的存储路径。
    • sys.exit():退出当前程序
    • sys.flags:该只读属性返回运行 Python 命令时指定的旗标。
    • sys.getfilesystemencoding():返回在当前系统中保存文件所用的字符集。
    • sys.modules:返回模块名和载入模块对应关系的字典。
    • sys.path:该属性指定 Python 查找模块的路径列表。程序可通过修改该属性来动态增加 Python 加载模块的路径。
    • sys.platform:返回 Python 解释器所在平台的标识符。
    • sys.stdin:返回系统的标准输入流——一个类文件对象。
    • sys.stdout:返回系统的标准输出流——一个类文件对象。
    • sys.stderr:返回系统的错误输出流——一个类文件对象。
    • sys.version:返回当前 Python 解释器的版本信息。
    • sys.winver:返回当前 Python 解释器的主版本号。
    import sys 
    for i in range(10):
        if i == 6:
            sys.exit()     # 相当于是break
        else:
            print(i)
    

    copy

    copy模块中最重要的就是copydeepcopy

    import copy    # 导入模块
    
    class Mycopy:   # 定义类
        def __init__(self,value):   # 初始化并传入参数
            self.value = value  # 定义属性的值
        
        def __repr__(self):   # 显式输出值
            return str(self.value)
        
    
    foo = Mycopy(100)  # 调用类并且实例化
    a  = ["Peter", foo]  # 列表a包含字符串和实例的值
    b = a[:]    # 通过切片复制
    c = list(a)
    d = copy.copy(a)    # 浅拷贝
    e = copy.deepcopy(a)   # 深拷贝
    
    a.append("python")
    foo.value = 24
    
    print("a:{0}\n b:{1}\n c:{2}\n d:{3}\n e:{4}".format(a,b,c,d,e))
    

    结果

    a:['Peter', 24, 'python']
     b:['Peter', 24]
     c:['Peter', 24]
     d:['Peter', 24]
     e:['Peter', 100]
    

    相关文章

      网友评论

        本文标题:Python札记44_模块(sys、copy)

        本文链接:https://www.haomeiwen.com/subject/fcmnkctx.html