当前位置:文档之家› PYTHON学习计划

PYTHON学习计划

python之模块学习模块简介python是由一系列的模块组成的,每个模块就是一个py为后缀的文件,同时模块也是一个命名空间,从而避免了变量名称冲突的问题。

模块我们就可以理解为lib库,如果需要使用某个模块中的函数或对象,则要导入这个模块才可以使用,除了系统默认的模块(内置函数)不需要导入外。

导入直接使用如下语法: import 模块名称 (不要.py后缀) 这样导入成功后,就可以在另外一个模块中使用被导入模块的功能函数或对象。

[python] view plaincopyprint?1. # -*- coding:utf-8 -*-2. module_1.py3. name = ithomer[python] view plaincopyprint? 1.2. python3.3.3 (v3.3.3:c3896275c0f6, nov 18 2013, 21:19:30) [msc v.1600 64 bit(amd64)] on win323. type help, copyright, credits or license for more information.4. >>>此时如果我们直接输入print(url),系统则会报错,url变量未定义:[python] view plaincopyprint?1. >>> print(url)2. traceback (most recent call last):3. file <stdin>, line 1, in <module>4. nameerror: name url is not defined5. >>>所以我们需要先导入module_1的内容才算定义了url 变量,不过要注意的是导入的模块的变量并不是定义在顶层命名空间,而是在模块的命名空间中,因此使用如下方式导入后的打印变量如下:[python] view plaincopyprint? 1. >>> import module_12. >>> print(module_1.url)3.如果直接使用print(url),仍然还是会报url未定义的错误,原因就是上面说到的命名空间的问题。

如果想要直接在顶层命名空间中使用该变量,可以使用如下导入方式:[python] view plaincopyprint? 1. >>> from module_1 import url 2. >>> print(url) 3.这样就可以将module_1模块中的url变量导入到顶层命名空间了,直接使用变量也就不会报错了。

当然我们也可以为导入的变量重命名,如下把url重命名为myurl:[python] view plaincopyprint? 1. >>> from module_1 import url as myurl 2. >>> print(myurl)因为是使用了from…import语句,因此是将变量绑定在顶层命名空间,我们也就可以直接使用变量名了。

对于每个模块的导入,python解释器只会导入一次,即使重复使用import和from…import语句,也只有在pvm检测到该模块没有被导入时才执行导入动作。

即使后来你修改了模块的源代码,但没有重启pvm,python解释器仍然是使用之前导入的内容在处理。

如果需要重新载入修改后的源码,一是退出python的交互模式后再进入,二是直接使用reload语句,如下:[python] view plaincopyprint?1. >>> from imp import reload2. >>> reload(module_1)3. <module module_1 from .\\module_1.py>我们可以看到系统提示重新加载了module_1模块的源文件,我们修改内容后使用该方法重新导入后再执行就可以看到修改后的内容。

模块导入和执行模块作为python语言中的基本单元,可以用来编写公用库函数或对象以便重复使用。

同时模块还可以作为独立文件进行运行,之前也已经提到,只要是导入了模块文件,那么pvm就会依次执行模块文件中的所有语句。

本篇主要介绍模块使用的一些进阶,首先定义一个模块module_2.py,内容如下:[python] view plaincopyprint? 1. # -*- encoding:utf-8 -*-2. module_2.py模块的内容3.4. print(__name__)5.6. def sum(a,b):7. return a+b8.9. if __name__ == __main__:10. import sys11. print(sys.argv[0])12. a = int(sys.argv[1])13. b = int(sys.argv[2])14. print(sum(a,b))上面的这段代码基本上就包含了本篇文章要说的内容了:__name__变量说明__name__是一个全局变量,在模块内部是用来标识模块的名称的。

上面的例子中有一个打印__name__变量的语句,比如我们在python的交互模式下执行导入可以看到如下结果: 1.2. >>>import module_2 module_2可以看到,通过使用import的方式导入模块后,打印的__name__值就是我们刚才说的模块的名称。

另外如果是通过python解释器直接执行模块,则__name__会被设置为__main__这个字符串值,如下:[python] view plaincopyprint?2. __main__3. module_2.py4. 5 我们通过windows命令行直接执行module_2这个模块文件,可以看到的结果输入如上,打印的__name__值为__main__。

通过这个特性我们可以将一个模块文件既当做普通的lib库供其他模块使用,又可以当做一个顶层执行文件进行执行,只是使用方式不一样而已。

1、当成lib库使用时,只需要在其他模块中使用import导入该模块即可(module_2)2、当成执行模块时,通过python解释器直接运行该模块,然后在模块文件中最后写上上面例子中的if判断语句段即可(__main__)通过__name__变量来区分是执行模块还是导入模块其实就非常类似java中的main函数了,不同的是java中是约定的方法名称,而python中约定是变量名称,异曲同工之效。

参数传递参数传递主要是指作为执行模块时需要传递的参数,通过python解释器执行某一个执行模块传递参数的使用如下:对于上面给定的例子执行就是:[python] view plaincopyprint?2. __main__3. module_2.py4. 5python解释器会将所有传递的参数存储在sys.argv这个列表中,所有的参数都被当成字符串进行处理。

同时即使不传递任何参数,也会有一个默认的参数sys.argv[0]标识当前模块的名称(如module_2.py),所以我们自己使用的参数都是从sys.argv[1]开始的,下标1表示第一个传递的参数,依次类推(如 2 3)。

模块包和搜索路径一个python文件就是一个模块,使用独立的命名空间,但实际使用过程中单单用模块来定义python功能显然还不够。

因为一个大型的系统几千上万个模块是很正常的事情,如果都聚集在一起显然不好管理并且有命名冲突的可能,因此python中也出现了一个包的概念。

包(package),通过使用“点模块名称”创建python模块命名空间的一种方法。

例如,模块名称 a.b 表示一个在名为 a的包下的名为b的子模块。

就像使用模块让不同模块的作者无需担心彼此全局变量名称(冲突)一样,点模块名称让多模块包的作者无需担心彼此的模块名称(冲突)。

模块包在文件系统中的表示就是一系列目录的集合,通过目录的层级结构形成模块包的层级结构,最终的模块文件就位于最后的目录中。

比如定义一个简单的模块在包pkg下,那么执行如下步骤:1、在f:\pro-files\workspace\目录下建立一个目录,名称是mypython [python] view plaincopyprint? 1. # -*- encoding:utf-8 -*-2. pkg.module_3.py模块的内容3.4. print(hello world)5.6. def func1():7. print(this is funciton one)注意第2步,必须要在每一个包目录下建立一个__init__.py的模块,这个是python的规定,用来告诉python解释器将该目录当成一个内容包,即该目录是一个包,里面包含了python模块的。

这个是必须的,如果不指定,则我们在python的交互模式下导入module_3.py这个模块时会报如下错误: [python] view plaincopyprint?2. traceback (most recent call last):3. file <stdin>, line 1, in <module>4. importerror: no module named pkg.module_3因此,包目录下的__init__.py模块是必须的,但内容是可选的,可以为空内容,也可以写一些代码或作其他用途。

pvm在导入某个包下的模块时会先导入这个包下的__init__.py模块,比如我们在__init__.py模块里添加内容:1. print(this is __init__ module)然后,在交互模式下重新导入这个包,则输出效果如下:[python] view plaincopyprint?2. this is __init__ module3. hello world4. >>>可见,pvm首先加载的是__init__.py模块,然后才是找该目录下的其他模块并进行加载。

相关主题