第七篇:模块的介绍(一)

2018-06-18 03:18:59来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

 

  本篇主要介绍模块的定义及其好处、模块的分类,以及包的概念、关于模块导入的方式,以及模块导入路径相关知识。当然本篇还会介绍两种模块--time模块、random模块。

一、模块(module)的介绍

模块的定义:

  在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,将会显得越来越杂乱无章,故使得代码的维护性越来越差。例如:在分析中国的每个城市的人口数量变化情况时,若我们把对每个城市的人口数量分析放在一个word文档内,那要查找某一个城市的人口数量变化情况,那岂不是很难?故我们可以把对一个城市的分析写在一个文件内,这样想要找某个城市的数据分析则会容易得多。

  这时候我们会根据不同的功能将不同用途的代码放置在不同的.py文件内,这样做的好处就是:

    一、大大的提高了代码的可维护性。

    二、开源。编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

    三、使用模块可以避免变量名和函数名冲突。

  而一个 .py文件就是一个模块。

模块的分类:

  模块的通常而言有以下三种:

    1、Python标准库,例如:time、random、json等模块

    2、第三方模块  ->例如:Pandas(python实现的类似R语言的数据统计、分析平台。)

    3、自定义模块。即自写的.py文件

 

二、模块的导入

  关于模块的调用有以下几种形式:

一、import语句

  import module1[, module2[,... moduleN],直接导入模块,这种方式可以用于导入本目录下的模块,以及内置模块。

  当我们使用import语句的时候,Python解释器是怎样的找到对应的文件的呢?

  其实解释器有其搜索路径,可通过导入sys模块,调用sys.path来查看。当使用import 导入模块时,则按照该搜索路径进行查找,故若该被导入模块文件在这些搜索路径中,则直接可以使用import方法导入。例如:

  ['/usr/lib/python3.6/python_learning/my_module','/usr/lib/python3.6','/usr/lib/python3.6/plat-x86_64-linux-gnu','/usr/lib/python3.6/lib-dynload','/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages'],若该模块处于这些路径,则可以直接使用import方法。

二、from...import语句

  from module_name import name1[, name2[, ... nameN]],导入模块中的函数或者变量等。

  这种导入方式不会将整个module_name模块导入到当前的命名空间中来。仅导入指定的函数(函数即变量)或者变量等。

  而  from module_name import *,则是导入模块 module_name下的所有函数或者变量等。

  注:这种方法不推荐使用,由于导入的函数或者变量不明确则可能会与本文件中的函数名或者变量名冲突。

 

三、包(package)

   还是上面那个例子,若对每个城市的人口数量进行数据分析,即使将一个城市的人口数量分析放在一个Word文档中,由于中国的城市这么多,那么我们可以根据省进行划分,则可根据省创建文件夹,将该省内的城市的数据分析放入该文件夹内。包(package)也是同样的道理,只不过包(package)是带有__init__.py文件的文件夹(Directory)。

  故包(package)的好处:

    ①、在不同的包内模块名即便相同也不受影响。在很多情况下,我们通常会在不同的包内创建相同的文件名。

    ②、可根据模块的功能不同将文件进行分类,故包的存在可以使文件的分类更加清晰、使得代码的定位更加明确。

  注:每次调用某个包的时候,即执行该包下__init__.py文件。  

   

  例如,图中的my_module、module_test即为包(package),而其中必然会有一个__init__.py文件。

包(package)中文件的导入

  由于被导入文件在包内,例如:

  

   就如上述所示模块的导入有三种方式,而这三种方式需重点掌握前两种。

 

if __name__ ="__main__"的用法

   如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。

  故 if __name__ = "__main__" 的功能:

    一、可以在被导入模块中用于调试(在被导入模块中if  __name__ ="__main__" :-->True),而在导入该模块的文件中是不会被执行的(在导入模块的文件中,导入该模块时执行 if __name__ = "__main__" :-->Flase)。

    二、用于接口文件(bin)中使用 if __name__ ="__main__":mian.run() ,告诉别人我的模块你可以调用但是不能够修改。

#-----》在web1.web2.web3包下的cal.py文件中

def add(x,y): #加法
    return x+y
def multi(x,y): #乘法
    return x*y
#调试cal.py文件中的函数
if __name__ = "__mian__":
    m = add(3,2)
    print(m) 
#输出为:__main__


#-----》在导入模块的文件 web_test.py文件中
from web1.web2.web3 import cal
print( __name__)
#输出为:web1.web2.web3.cal

#同时在web_test.py中不会执行cal.py中的 if __name__:"__main__" 下的内容。

 

  

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:python3:文件读写+with open as语句

下一篇:Python标准库