模块的作用是分类管理,可以帮助我们更有逻辑的组织自己的代码。模块就是一个python文件,里面可以有函数/类/变量/可执行代码等等。模块可以由两个语句和一个函数reload()导入;
模块:是一个python文件
包:是一个目录,可以包含多个模块,注意还必须有__init__.py文件
命名空间是一个包含了变量名称(键)和它们各自相应的对象(值)的字典。一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果局部变量和全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python会将在函数内赋值的任何变量都当作局部的,如果要想在函数中给一个全局变量赋值的话(注意是修改,如果是访问的话不会有问题),必须使用global关键字将声明该变量为全局变量,否则就会认为是局部变量而重新开辟一段空间。
代码示例1:在函数中访问全局变量
a=10
def f():
print(a)
f()
代码示例2:在函数中修改全局不可变对象的变量
a=10
def f():
a+=1
print(a)
f()
代码示例3:在函数中修改全局可变对象的变量
a=[]
def f():
a.append('1')
print(a)
f()
代码示例4:在函数中定义和全局变量同名的局部变量
a=10
def f():
a=100
a+=1
print(a)
f()
代码示例5:使用global在函数中修改全局不可变对象的变量
a=10
def f():
global a
a+=10
print(a)
f()
import导入的是整个模块的内容。
语法格式:
import module1[, module2[,… moduleN]
说明: 可以在一行中导入多个模块,每个模块之间用逗号隔开
注意:
代码示例:import导入同一目录下的模块
a.py
test.py
import a
print(a.b)
print(a.add(1,20))
print(a.P.value)
print(b)
可以看到a模块中后面的语句被打印出来了,其实a模块中所以的语句都执行了只是没有输出而已;如果没有加模块名称直接使用a模块中的属性或方法时会抛出变量没有定义的异常
from语句可以从模块中导入指定的部分到当前的命名空间中,也就是当前要执行的python文件。
语法一:
from modname import name1[, name2[,… nameN]]
如:from math import sqrt
作用:这样声明只会把math模块中的sqrt函数导入到执行这个声明的模块的全局符号表中,而不是将整个math模块导入。
语法二:
from modname import *
作用:将模块中的所有内容全部导入到当前的命名空间中,相当于命名空间的合并,这样就可以直接使用模块中的方法或者属性,不用再加上模块名,使用起来更简单一些。
缺点:但是这种方法不推荐,因为如果后引入的模块和之前的模块中有同名的方法或者属性时,会覆盖之前同名的内容,这很可能不是我们想要的。
代码示例1:from…import 导入同一目录下的模块
from a import *
print (b)
print (add(1,2))
print(P.value)
from a import b,P,add
print (b)
print(add(100,200))
reload()需要从imp中引入,表示重新导入已导入过的模块。
语法如下:
from imp import reload
reload(module_name)
比如:reload(math)
说明:使用reload的时候是有一些要求的
代码示例1:load() 导入同一目录下的模块
import a
from imp import reload
print("*"*50)
reload(a)#a模块中的内容会再执行一遍
代码示例2:reload执行的条件不满足之:不是import导入的模块
代码示例3:reload执行的条件不满足之:reload不是模块文件名本身
说明:导入模块语句一般放在文件的顶端,也可以在需要的时候导入,比如说在函数中,但是出了函数的作用域导入的模块也就不能使用了。
当导入一个模块时,python解析器会去搜索该模块存在的位置,其搜索顺序为:
1 相同目录
2 sys.path.append来添加
3 环境变量的pythonpath指定路径,必须重启cmd
4 在python安装路径lib下的site-packages的目录下添加
代码示例1:两个文件在同一目录下
a.py:
b=1
def add(a,b):
return a+b
class P(object):
value=100
test.py
import a
print (a.b)
print (a.add(1,2))
print(a.P.value)
代码示例2:两个文件不在同一目录下
import sys
sys.path.append("d:\\")
import a
print (a.b)
print (a.add(1,2))
print(a.P.value)