1.1 模块
模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。
1.2 导入模块
import 模块1, 模块2, ...
定义一个模块:calc.py,里面放一个函数。
# filename: calc.py
def calc_sum(*args) -> float:
tmp = 0
for value in args:
tmp += value
return tmp
用import导入
# filename: main.py
import calc # 导入模块
result = calc.calc_sum(1,2,3,4,5,6) #使用模块中的calc_sum函数
print(result) # 21
1.2.1 python在哪儿搜索这些模块文件?
>>> import sys
>>> sys.path
['', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/fish/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
先导入sys模块,打印sys.path会发现这是搜索路径,第一个表示当前目录。
如何把自己的路径添加到搜索路径中?
sys.path.insert(0,"/home/users/mypaths")
可以在操作系统中配置环境变量PYTHONPATH
,python会在这个指定的路径中查找。
如:
fish@home:~$ export PYTHONPATH=$PYTHONPATH:/home/fish/pythons
fish@home:~$ python3
Python 3.10.6 (main, Nov 2 2022, 18:53:38) [GCC 11.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.path
['', '/home/fish', '/home/fish/pythons', '/usr/lib/python310.zip', '/usr/lib/python3.10', '/usr/lib/python3.10/lib-dynload', '/home/fish/.local/lib/python3.10/site-packages', '/usr/local/lib/python3.10/dist-packages', '/usr/lib/python3/dist-packages']
1.2.2 模块中添加测试代码
# filename: calc.py
def calc_sum(*args) -> float:
tmp = 0
for value in args:
tmp += value
return tmp
# print(calc_sum(3,4,5))
print(__name__)
if __name__ == '__main__':
print(calc_sum(3, 4, 5))
测试代码在导入模块的时候会执行,这不是我们想要的,需要用 if __name__ == '__main__':
来判断一下。
- 如果当前执行的是calc.py文件则
__name__
的值是__main__
- 如果当前calc做为模块被导入,则
__name__
的值是文件名calc
通过这样的判断,可以防止模块被导入时执行测试代码。
1.3 导入模块中的函数
from 模块名 import 函数名, 函数名, ...
模块中的类也是这样导入,方法一样。
定义模块:
# filename: calc.py
def calc_sum(*args) -> float:
tmp = 0
for value in args:
tmp += value
return tmp
class Dog:
def __init__(self):
print("Dog Class")
导入:
# filename: main.py
from calc import calc_sum, Dog
result = calc_sum(1,2,3,4,5,6)
print(result) # 21
Dog() # Dog Class
在导入的时候,可以一次性导入:
from 模块 import *
1.4 为模块或模块中的成员指定别名
import 模块 as 别名
from 模块 import 函数 as 别名, 类 as 别名
用别名可以防止命名冲突
# filename: calc.py
def trace():
print("calc -> trace")
# filename: main.py
from calc import trace
def trace(): # 定义trace把导入的覆盖了
print("main -> trace")
trace()
# filename: main.py
from calc import trace as calc_trace # 定义别名
def trace():
print("main -> trace")
trace()
calc_trace()
两种导入方式的区别:
使用import语句导入模块时,会创建一个新的命名空间,而from .. import则才成员导入到当前命名空间中。但可能会覆盖当前空间中的成员。
1.5 查看模块中的成员
dir (模块名)
>>> import random
>>> dir(random)
['BPF', 'LOG4', 'NV_MAGICCONST', 'RECIP_BPF', 'Random', 'SG_MAGICCONST', 'SystemRandom', 'TWOPI', '_ONE', '_Sequence', '_Set', '__all__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', '_accumulate', '_acos', '_bisect', '_ceil', '_cos', '_e', '_exp', '_floor', '_index', '_inst', '_isfinite', '_log', '_os', '_pi', '_random', '_repeat', '_sha512', '_sin', '_sqrt', '_test', '_test_generator', '_urandom', '_warn', 'betavariate', 'choice', 'choices', 'expovariate', 'gammavariate', 'gauss', 'getrandbits', 'getstate', 'lognormvariate', 'normalvariate', 'paretovariate', 'randbytes', 'randint', 'random', 'randrange', 'sample', 'seed', 'setstate', 'shuffle', 'triangular', 'uniform', 'vonmisesvariate', 'weibullvariate']
标签:__,trace,lib,PYTHON,模块,import,calc
From: https://www.cnblogs.com/three-sheep/p/16988089.html