一,模块
1, 什么是模块?
1 使用python编写的.py文件
2 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
2,为什么用模块?
#1、从文件级别组织程序,更方便管理
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用
#2、拿来主义,提升开发效率
同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率
#ps:
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
3,模块的使用
1) 使用
import +模块名
第一次导入的三件事:(重复导入只会饮用之前加载好的结果)
1)产生一个新的名称空间,要导用的那个ph文件
2)运行要导入的模块代码,产生的名字存放于1的名称空间,运行过程中global关键字指向的就是该名称空间
3)在当前名称空间拿到一个名字spam,改名字指向1的名称空间
2) 示例
2.1) 模块基础使用
spam.py内容如下:
# 一个模块就是一个包含了一组功能的python文件,比如spam.py,
# 模块名为spam,可以通过import spam使用。
money=10
def read1():
print('spam模块',money)
def read2():
print('spam')
read1()
def change():
global money
money=0
打开一个新文件,导入spam.py
import spam
print(spam.money)
#10
#被导入的模块在执行过程中使用自己独立的 名称空间作为全局名称空间
import spam
money=666 #在当前空间定义money(spam里也有money变量)
print(spam.money) # 调用的依然是spam模块的变量,不受影响
#10
2.2) 起别名
import spam as f
f.read1()
# spam模块 10
2.3) 只调用模块的部分功能
from spam import read1
read1()
# spam模块 10
# # 调用没有指定的功能会报错
from spam import read1
read2()
# NameError: name 'read2' is not defined
PS:
优点:引用时简单,不用加前缀
缺点:容易与当前名称空间起冲突,未导入的名字不能用
from spam import read1
def read1():
print('aaaa')
read1()
# aaaa
2.4) 导入多个名字
from spam import read1,read2
read1()
read2()
# spam模块 10
# spam
# spam模块 10
2.5) all的使用
# *的使用(如果不想让*导入的名字,在定义名字前面加一个_下划线)
spam.py内容如下:
_money=10
# 调用(不推荐使用,可读性差,可能会与当前空间名混淆)
from spam import *
print(money)
print(money)
# NameError: name 'money' is not defined
# __all__的使用
__all__=['read1','money'] # 指定说明*只能导入的名字
money=10
def read1():
print('spam模块',money)
def read2():
print('spam')
read1()
def change():
global money
money=0
# 以上只指定了read1和money,则read2和change都不可以调用使用
from spam import *
read1()
# spam模块 10
read2() # 报错,因为在spam指定了__all__
# NameError: name 'read2' is not defined
3) py文件的2种用途
1.当作脚本执行
money=10
def read1():
print('spam模块',money)
def read2():
print('spam')
read1()
def change():
global money
money=0
print(__name__)
# __main__
2.当作模块执行
# 导入模块执行
import spam
# spam
3.使用
if __name__ == '__main__':
foo.py被当做脚本执行时运行的代码
else:
foo.py被当做模块导入时运行的代码
money=10
def read1():
print('spam模块',money)
def read2():
print('spam')
read1()
def change():
global money
money=0
if __name__ == '__main__':
read1()
read2()
change()
print('调试功能')
# spam模块 10
# spam
# spam模块 10
# 调试功能
import spam
spam.read1()
# spam
# spam模块 10
4,模块的搜索路径
优先级:
内存 --> 内置模块 --> 自定义(sys.path)
如果调用的模块与执行的py不在同一路径下,会报错
# 查看当前加载到内存的变量
import sys
print(sys.modules)
#如果导入的模块和执行py不在同一级别的文件夹下,会报错,需要自定义环境变量,如下:
示例:(文件夹如下图)
# 方式一
import sys
sys.path.append(r'/Users/sg/PycharmProjects/py-study/模块与包')
import spam
print(spam.money)
# 10
# 方式二
#执行程序会把执行程序的文件夹加载到环境比那里中,所以也可以直接执行以下:
from 模块与包 import spam
print(spam.money)
# 10
模块搜索路径
二,包
1,包的定义
什么是包?
--包就是一个包含了__init__.py文件的文件夹(可以往该文件夹下防疫队模块)
1)一个包下面的文件调用
#例1 (如图1)
import package
print(package.x)
# 1
在init里的内容为x=1
图1
2)不同的包路径调用(加入环境变量)
不同的包路径互相调用,需要加上路径,如下pack3这个包下面的test.py去调用package1包下面的m1里面的mu
加入环境变量即可
不同的包路径调用
网友评论