模块
模块
用模块管理函数,Python中每个文件就代表了一个模块(module),
Python会将所有 .py 结尾的文件认定为Python代码文件。
在使用函数的时候我们通过import关键字导入指定的模块:
module1.py
def foo():
print('hello, world!')
module2.py
def foo():
print('goodbye, world!')
test.py
from module1 import foo
# 输出hello, world!
foo()
from module2 import foo
# 输出goodbye, world!
foo()
name 属性
有时候我们想将一个 .py 文件既当作脚本,又能当作模块用, 这个时候可以使用 name 这个属性。
PI = 3.14
def get_sum(lst):
"""
Sum the values in the list
:param lst:
:return:
"""
total = 0
for v in lst:
total = total + v
return total
上文保存为ex.py
with open('ex.py', 'w') as f:
f.write("""
PI = 3.14
def get_sum(lst):
total = 0
for v in lst:
total = total + v
return total
""")
使用 ! 调用shell命令:
!cat ex.py
可以从ex模块中导入函数get_sum和变量:
from ex import PI, get_sum
print(PI) # 3.14
print(get_sum([2, 3])) # 5
# 可以使用 * 导入所有变量, 不提倡,因为可能覆盖一些已有的函数
# 删除文件:
import os
os.remove('ex.py')
模块导入顺序
通常情况下,当使用 import 语句导入模块后,Python 会按照以下顺序查找指定的模块文件:
前目录,即当前执行的程序文件所在目录下查找;
到 PYTHONPATH(环境变量)下的每个目录中查找;
到 Python 默认的安装目录下查找。
以上所有涉及到的目录,都保存在标准模块 sys 的 sys.path 变量中,通过此变量我们可以看到指定程序文件支持查找的所有目录。换句话说,如果要导入的模块没有存储在 sys.path 显示的目录中,那么导入该模块并运行程序时,Python 解释器就会抛出 ModuleNotFoundError(未找到模块)异常。
解决“Python找不到指定模块”的方法有 3 种,分别是:
向 sys.path 中临时添加模块文件存储位置的完整路径;
将模块放在 sys.path 变量中已包含的模块加载路径中;
设置 path 系统环境变量。
垃圾回收机制
如果持续不断加载数据,调用函数模块,计算机的内存会溢出,Python的垃圾回收机制。是计数机制,当一个对象的引用数为0时,它就会被垃圾回收机制回收。
import sys
# 生以下四种情况的时候,该对象的引用计数器+1
a= 999 # 对象被创建
b=a # 对象被引用
def func(a):
return
func(a) # 对象被作为参数,传到函数中
List=[a,"a","b",2] # 对象作为一个元素,存储在容器中
sys.getrefcount(a)
# python系统内部很多地方都在使用一些常用的对象,这些对象在python解释器启动时就被创建出来。
#发生以下四种情况时,该对象的引用计数器**-1**
#该对象的别名被显式销毁时
del a
#该对象的引别名被赋予新的对象,
a = 999
#个对象离开它的作用域,例如 func函数执行完毕时,函数里面的局部变量的引用计数器就会减一(但是全局变量不会)
#该元素从容器中删除时,或者容器被销毁时。
b = a # 当前计数器为2
del b # 删除变量b:b对应的对象的引用计数器-1 (此时计数器为1)
del a # 删除变量a:a对应的对象的引用计数器-1 (此时引用计数器为0)
# 当引用计数器为0 时,意味着没有人再使用这个对象,这个对象就变成垃圾,垃圾回收。
# 回收:1.对象从refchain的链表移除。
#.将对象进行销毁,内存归还给操作系统,可用内存就增加。
sys.getrefcount(a)