前言
在以前我们存放功能的地方在函数内,可以将各个功能写好存入函数内,那我们开发程序仅仅只用一个文件吗。并不是,学习使用模块可以很好的帮我们解决功能分类,使程序的组织结构变得清晰,维护起来更加方便。
目录
Python模块
在Python中,一个py文件对应一个模块,模块根据文件名去掉后缀导入,如:文件名为test.py,那么我们导入模块使用test导入即可。模块是存放我们写好的功能。比如写好了登录、注册、修改密码、忘记密码等功能,我们可以将它们存放在一个py文件内。那么它可以称之为模块,且模块是可以重复调用的。
我们可以自定义模块,也可以导入使用内置或第三方模块的现有功能,这种用法极大提高了程序的开发效率。
模块的使用
首次导入模块会产生三件事情:
1、执行模块的源代码
2、产生一个新的名称空间用于存放模块执行过程中产生的名字
3、在当前执行文件所在的名称空间得到一个名字(也就是模块的名字),该名字指向的就是模块名称空间。我们引入模块的代码加上模块名即可。
我们使用import导入写好的py文件,在同目录定义两个文件
# test文件
name = 'tom'
age = 18
# run文件
# 导入test模块
import test # 有可能会发现导入时会划红线,别担心,这是编辑器的原因,我们正常调用即可
print(test.age) # 引用test模块下面的age变量
> 18
注意:我们定义的变量不能与模块名冲突了,如果定义相同的名字,等于覆盖了模块名。
我们使用模块进行的操作不会对当前文件的代码产生影响,我们也可以直接改变模块内变量值
import test
test.age = 300
print(test.age)
> 300
我们在test文件内定义一个函数,然后通过调用这个函数看看是否会产生影响
# test文件
age = 30
def change():
global age
age = 130
# run文件
import test
age = 100 # run文件内定义的变量
test.change() # 是否会对当前age变量产生影响?
# 答案是不会的,因为名称空间与作用域在定义的时候已经产生了,怎么调用它都是到对定义时的值进行操作,也就是test文件内的age变量
print(age)
> 100
需要强调一点:第一次导入模块已经将其加载到内存了,之后再导入名称相同的模块会直接引用内存中已存在的模块,不会再重复执行。
# test文件
print('my file_name is test') # 增加一个打印内容
# run文件
import test
> 'my file_name is test' # 可以看到已经将test模块载入内存了
import test
# 并不会再打印内容了,因为第一次已经调用过,第二次调用等于复用第一次调用的模块
使用sys模块的modules会打印内存中已经加载的模块
import sys
print(sys.modules)
使用import语句可以导入多个模块,可以写多行import语句
import test
import test1
import test2
也可以一行导入多个模块,使用逗号进行分隔
import test,test1,test2
但其实第一种更为规范,可读性更好,推荐使用,而且我们导入的模块中可以含有python内置的模块、第三方模块、自定义模块,为了更方便区分它们,我们通常在文件开头导入,并且分类导入,每个类型之间的模块进行空行隔开。
# python内置模块,常见内置模块
import sys
import os
import time
import random
# 第三方模块
# 自定义模块
import test
当然,我们也可以在函数内导入模块,在文件开头导入的模块属于全局作用域,而在函数内导入的模块则属于局部作用域。
form … import 语句
from 与 import 基本一致。但是不同的是:使用import test导入模块后,我们在使用时必须以模块名为前缀使用。而使用from test import 可以引入模块内的代码,直接调用引入进来的代码使用
# test文件
def func():
print('Hello')
# run文件
#