python3基础:模块

说明

模块的作用是分类管理,可以帮助我们更有逻辑的组织自己的代码。模块就是一个python文件,里面可以有函数/类/变量/可执行代码等等。模块可以由两个语句和一个函数reload()导入;

  1. import:导入一个整体的模块
  2. from:从一个模块中获取一些特定的内容
  3. reload:在不中止Python程序的情况下,重新导入模块文件内容的方法。

模块和包的区别

模块:是一个python文件
包:是一个目录,可以包含多个模块,注意还必须有__init__.py文件

命名空间和作用域

命名空间是一个包含了变量名称(键)和它们各自相应的对象(值)的字典。一个Python表达式可以访问局部命名空间和全局命名空间里的变量。如果局部变量和全局变量重名,则局部变量会覆盖全局变量。
每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python会将在函数内赋值的任何变量都当作局部的,如果要想在函数中给一个全局变量赋值的话(注意是修改,如果是访问的话不会有问题),必须使用global关键字将声明该变量为全局变量,否则就会认为是局部变量而重新开辟一段空间。
代码示例1:在函数中访问全局变量

a=10
def f():
      print(a)
f()

在这里插入图片描述
代码示例2:在函数中修改全局不可变对象的变量

a=10
def f():
      a+=1
      print(a)
f()

python3基础:模块_第1张图片

代码示例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导入的是整个模块的内容。
语法格式
import module1[, module2[,… moduleN]
说明: 可以在一行中导入多个模块,每个模块之间用逗号隔开
注意

  1. 被导入的模块,非块语句都会被执行;导入模块时所有的代码都会被执行。如果当做模块导入时有些代码不想被执行时就将其放到if name == “main”:下。因为当文件本身被执行时__name__ = “main”,如果是当做模块导入时__name__ =文件名
  2. 一个模块只会被导入一次,不管执行多少次import;
  3. 使用import导入的模块是存放在模块的命名空间中,所以想使用模块中的方法和属性时,必须用以下格式:模块名.方法()/属性

代码示例:import导入同一目录下的模块
a.py
python3基础:模块_第2张图片
test.py

import a
print(a.b)
print(a.add(1,20))
print(a.P.value)

print(b)

python3基础:模块_第3张图片

可以看到a模块中后面的语句被打印出来了,其实a模块中所以的语句都执行了只是没有输出而已;如果没有加模块名称直接使用a模块中的属性或方法时会抛出变量没有定义的异常

导入模块(from…import)

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)

在这里插入图片描述
代码示例2:from…import 导入同一目录下的模块

from a import b,P,add
print (b)
print(add(100,200))

在这里插入图片描述

导入模块(reload())

reload()需要从imp中引入,表示重新导入已导入过的模块。
语法如下
from imp import reload
reload(module_name)
比如:reload(math)
说明:使用reload的时候是有一些要求的

  1. 模块必须是使用import导入的;
  2. 模块必须被成功导入;
  3. reload()参数必须是模块名自身,而不是模块名的字符串
  4. reload()再次导入的模块,会再次被执行,跟import不同。

代码示例1:load() 导入同一目录下的模块

import a
from imp import reload
print("*"*50)
reload(a)#a模块中的内容会再执行一遍

在这里插入图片描述
代码示例2:reload执行的条件不满足之:不是import导入的模块
python3基础:模块_第4张图片

代码示例3:reload执行的条件不满足之:reload不是模块文件名本身

python3基础:模块_第5张图片

import和from…import的区别

  1. import是将模块中所有的内容导入,而from…import只是导入指定的内容;
  2. import导入的属性或方法使用时前面必须加上模块名,而from…import导入的不需要,直接用即可
  3. import导入的内容仍然在模块的命名空间中,而from…import导入的内容是在当前文件的命名空间中,这样的话如果有同名的函数或者属性,后导入的内容会将之前的覆盖,引起不必要的麻烦。

说明:导入模块语句一般放在文件的顶端,也可以在需要的时候导入,比如说在函数中,但是出了函数的作用域导入的模块也就不能使用了。

定位模块:

当导入一个模块时,python解析器会去搜索该模块存在的位置,其搜索顺序为:
1 相同目录
2 sys.path.append来添加
3 环境变量的pythonpath指定路径,必须重启cmd
python3基础:模块_第6张图片
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)

你可能感兴趣的:(python)