Skip to main content

模块

模块

用模块管理函数,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)