文章目录
模块概念
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码越来越长,越来越不容易维护,为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码相对较少,很多编程语言都采用这种组织代码的方式,在Python
中,一个.py
文件就被称之为一个模块(Module)
使用模块有什么好处:
- 提高了代码的可维护性
- 编写代码不必从零开始,当一个模块编写完毕,就可以被其他地方引用
模块一共三种:
python
标准库- 第三方模块
- 应用程序自定义模块
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突
模块导入方法
import
语句
在使用模块之前需要使用import
语句导入模块
当我们使用import
语句的时候,Python
解释器是怎样找到对应的文件的呢?答案就是解释器有自己的搜索路径,存在sys.path
里
import:
1.执行对应文件
2.引入变量名
我们建立一个模块包,并建立cal
和test
两个脚本
在cal
建立函数:
...........cal.py
print('ok1')
def add(x,y):
return x+y
def sub(x,y):
return x-y
print('ok2')
在test
建立执行语句:
要想两个文件有联系,我们就需要用import
导入
在test
文件里输入:
..........test.py
import cal
print(cal.add(2,3))
print(cal.sub(2,3))
运行结果
ok1
ok2
5
-1
这时我们会发现,import cal
会把cal
里面的文件执行一遍,然后再把cal
拿给当前的文件test
使用
from…import 语句
我们也可以直接调用,不需要再输入cal
.
#..............text.py
from cal import add
from cal import sub
print(add(2,3))
print(sub(2,3))
运行结果
ok1
ok2
5
-1
这个声明不会把整个cal
模块导入到当前的命名空间中,只会将它里面的add
或sub
单个引入到执行这个声明的模块的全局符号表
但是如果这样使用的话,如果定义函数很多的话,就不是很方便了,因此,我们可以用 *
代替所有的函数
from…import* 语句
这提供了一个简单的方法来导入一个模块中的所有项目
............test.py
from cal import *
print(add(2,3))
print(sub(2,3))
运行结果
ok1
ok2
5
-1
然而这种声明不该被过多地使用。大多数情况, Python
程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义
.............test.py
from cal import *
print(add(2,3))
运行结果
ok1
ok2
5
...........test.py
from cal import *
def add(x,y):
return x+y+100
print(add(2,3))
运行结果
ok1
ok2
105
这就存在一个函数覆盖,在调用了cal
之后下面又有一个add
函数,这样它会把test
里面add
运行的结果覆盖到cal
文件中add
函数运行的结果
接下来我们在建立一个my_module
包,把cal
文件放到这个包里
这时我们会发现我们使用刚刚以上所有的调用方法都是不可行的
举一个列子
..........test.py