东尧爱分享
这是东尧每天一篇文章的第30天
东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福。
模块和包是python中经常用到的概念,那么python模块究竟是什么意思,如何安装和下载模块呢?常用的python模块又有哪些?
1
模块的概念
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。当代码量变得相当大的时候,我们最好把代码分成一些有组织的代码段,前提是保证他们的彼此交互。这些代码片段相互间有一定的联系,可能是一个包含数据成员和方法的类,也可能是一组相关但彼此独立的操作函数。
这些代码段是共享的,所以python允许“调入”一个模块,允许使用其他模块的属性来利用之前的工作成果,实现代码重用。这个把其他模块中属性附加到你的模块中的操作叫做导入(import)。那些自我包含并且有组织的代码片段就是模块(module)。在Python中,一个.py文件就称之为一个模块(Module)。
01
模块的命名空间(名称空间)
要使用一个模块中的属性和方法,那么就必须在属性和方法的前面使用模块名加点(.)操作符来使用它们。比如之前用到过的random模块,要使用random模块的randint方法,我们需要使用random.randint()的方式来使用。
import random
random.randint(1,100)
02
模块的搜索路径
当我们导入一个模块的时候,python首先会搜索当前路径(导入模块的路径)下有没有该模块,如果没有的话那么就会去系统的环境变量中搜索,如果都搜索不到,就会报ImportError异常。
如果当前路径下有模块名跟系统的模块名重名,那么当前的模块会覆盖掉系统的模块(所以尽量不要跟系统的模块重名,否则就无法使用系统的模块的功能)。
模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。
import sys
print(sys.path)
备注:如果我们自己有写模块和包,那一定要记得将自定义的模块文件夹复制到Python文件路径的Lib文件夹下,这样才会避免出现根据加载路径找不到模块的错误。如果没有复制过去的话,我们可以用sys.path.append()的方法,将自定义模块的加载路径添加进去。
sys.path.append('D:\learning\python\learning')
2
导入模块
01
import语句
# 一行导入一个模块
import urllib
import re
# 一行导入多个模块
import urllib, sys, random
02
python导入模块的顺序
python标准库模块
python第三方模块
自定义模块
每个部分用一个空行分开
03
python模块作用域
解析器执行到这条语句(import),如果在搜索路径中找到了指定模块,就会加载它。该过程遵循作用域原则,如果在一个模块的顶层导入,那么它的作用域就是全局的;如果在函数中导入,它的作用域是局部的。
将re模块导入的顺序和hello()函数调换之后就可以正常执行了:
import urllib # urllib模块在之后的代码中均能使用
def hello():
re.findall('','')
import random
print(random.randint(1,100))
import re
hello() # 如果hello()函数在导入re模块后才调用的话,函数内的re.findall()就可以执行
让我们再来看一个模块在函数体内导入的情况。如果在函数中导入,它的作用域是局部的,如果在函数外部再调用,会报NameError错误:
import urllib # urllib模块在之后的代码中均能使用
def hello():
import random
print(random.randint(1,100)) # 这里可以执行
hello()
random.randint(1,100) # 这里不能再使用了,因为函数内导入的模块作用域只在函数体内
结果是函数内部的random执行成功,外部的报错了:
31
Traceback (most recent call last):
File "D:/learning/python/learning/test1.py", line 10, in
random.randint(1,100) # 这里不能再使用了,因为函数内导入的模块作用域只在函数体内
NameError: name 'random' is not defined
除了模块有作用域以外,模块间涉及到的函数也有其作用域。比如在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。那这个具体该如何实现呢?
明天的教程中将继续为您讲解。明天的教程内容预告,欢迎继续关注:
·模块变量的作用域;
·如何导入一个模块的部分方法;
·导入的模块如何重命名;
·如何安装第三方模块来提高工作效率;;
·“包”相关知识;