Python: 学习系列之七:模块、PIPY及Anaconda

系列

什么是模块

  • 一个.py文件就是一个模块
  • 在模块中可以定义变量、函数、类等,它们统称为模块的属性

什么是包

  • 为了更好的组织和管理模块, Python引入了包
  • 在某个目录下添加模块__init__.py之后,该目录就变成了包,因为包是包含特定模块的特殊目录
  • 模块__init__.py的作用是初始化所在的包。如果不需要初始化,其内容可以为空。
  • 目录支持嵌套,所以包也支持嵌套,包可以包含子包

如何导入模块

当输入"[包名.]模块名."之后,在代码提示中,变量用黄色的v(variable)表示,函数用粉色的f(function)表示,类用蓝色的c( class)表示。

  1. 导入整个模块

    """
        import [包名.]模块名
        from 包名 import 模块名
    
    """
    
    import os
    
    print(os.environ)
    
    print(os.getenv('JAVA_HOME'))
    
    print(os.MutableMapping)
    
    import xml.dom.minidom as n
    
    print(xml.dom.minidom.StringTypes)
    
    print(n.StringTypes)
  2.  导入模块中的属性

    from os import getenv, environ
    from os import MutableMapping as m
    from os import * #导入了所有的属性,不推荐
    
    print(m)
    print(getenv('JAVA_HOME'))  # <class 'collections.abc.MutableMapping'>
    print(m)  # <class 'collections.abc.MutableMapping'>

使用当前项目中的模块

    1. 直接导入

    2.相对导入, 一个. 表示当前目录,两个..表示当前目录的父目录

        注意:当直接运行某个模块时,该 模块就变成了主模块,主模块位于最顶层,与同目录下的其它模块无法构成相对关系,因此,当直接运行某个模块时,该模块不能使用相对导入。

PIPY简介

PYPI的全称是:Python Package Index,它是Python官方的、基于WEB的、集中管理的、第三方的软件仓库。https://pypi.org

如何导入第三方库

如果要使用第三方库,必须先使用工具pip或pip3

# 看到如下界面,说明pip 安装好了
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip

Usage:
  pip <command> [options]

# 版本号
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip --version
pip 19.1.1 from c:\python37\lib\site-packages\pip (python 3.7)

#安装某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install requests

#安装指定版本某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install requests==1.20.1

#卸载某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip uninstall requests

#升级某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip install --upgrade requests

#模糊查找某个模块
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip search requests

#列出所有已安装的第三方库
PS C:\Users\cong.wu\Desktop\Test\packageDemo> pip list

Anaconda

Anaconda是一个开源的包、环境管理器,可以用于在同一个机器上安装不同版本的软件包及其依赖,并能够在不同的环境之间切换,Anaconda包括Conda、Python以及一大堆安装好的工具包,比如:numpypandas等,Miniconda包括Conda、Python。

  1. 访问https://www.anaconda.com安装Anaconda
  2. 安装完成后,会自动将Anaconda安装目录下的bin目录添加到系统环境变量PATH中,它会使用自带的python,安装第三方库会被安装到Anaconda安装目录下
  3. Anaconda的第三方库管理工具conda, 类似于工具pip3. 相关命令如下:
#查看帮助信息
conda

# 查看已安装第三方库
conda list

# 搜索第三方库
conda search XXX

# 安装第三方库
conda install XXX

conda install XXX=1.1  #这里只有一个等号

# 升级第三方库
conda update XXX

# 卸载第三方库
conda remove XXX

PYC字节码文件

模块第一次被导入时,它会被编译为PYC字节码文件。pyc字节码文件存放在与该模块同目录下的目录__pycache__中。

运行被导入的模块

导入包中的模块时,会先导入包中的 __init__.py,因此,在运行被导入的模块之前,会从最顶层的父包开始,先依次运行所有的父包中的__init_.py。

查看模块中的所有属性

import mod1

print(dir(mod1))  #查看被引入模块的所有属性 

print(dir())  # 查看当前模块的所有属性

如何重新加载已经被导入的模块

在交互式命令行中,使用import语句导入某个模块后,如果对该模块做了修改,然后再次使用import语句导入该模块,那么对模块的修改不会起任何作用。可以调用标准库函数reload重新加载已经被导入的模块。

但在程序中,即.py文件中,不会出现上述的问题。

PS C:\Users\cong.wu\Desktop\Test\packageDemo> python
Python 3.7.2 (tags/v3.7.2:9a3ffc0492, Dec 23 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import mod1
>>> mod1.v
14
#对mod1进行修改,将v改成15
>>> import mod1
>>> mod1.v
14 #可以看到这里结果依然是14

>>> import importlib
>>> importlib.reload(mod1) #重新加载后
<module 'mod1' from 'C:\\Users\\cong.wu\\Desktop\\Test\\packageDemo\\mod1.py'>
>>> mod1.v
15

模块的特殊属性之__doc__

"""
    模块的特殊属性之__doc__
"""

print(__doc__)  # 模块的特殊属性之__doc__

模块的特殊属性之__ name__

"""
    1. 对于被导入的模块,其特殊属性__name__的值为模块名
    2. 对于直接运行的模块,其特殊属性__name__的值为__main__
"""

import mod1

print(__name__)  # __main__
print(mod1.__name__)  # mod1


"""
    可以根据__name__的值来判断是否执行模块中的测试代码,对于模块中的测试代码,通常当直接运行模块时才需要执行,
    而当模块被导入时则不需要执行。
"""

def add(num1: int, num2: int):
    print('the result is %i' % (num1+num2))

"""
    只有当前模块直接运行时,才会运行如下代码,如果模块被引用,下面这段代码不会被执行
"""
if __name__ == '__main__':
    add(1, 2)

模块内的数据访问控制之单下划线 "_"

"""
    模块的属性前面加单下划线_ , 这样就无法使用语句"from 模块名 import *"导入相当的属性
    但使用语句"import 模块名"依然可以导入所有的属性。
"""

from mod1 import *

print(v)  # 15

print(_v)  # NameError: name '_v' is not defined

import mod1
print(v) # 15
print(_v)  # 15

模块内的数据访问控制之特殊属性__all__

"""
    可以在模块内定义特殊属性__all__.这样,可以使用语句"from 模块名 import *"导入特殊属性__all__中定义的属性
    但使用语句"import 模块名"依然可以导入所有的属性。
    __all__的优先级高于下划线。
"""

"""
    mod1.py

    __all__=['v','_v']
    v=15
    _v=15
"""

from mod1 import *

print(v)  # 15
print(_v)  # 15, 这里依然可以访问到

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章