PYTHON 模块

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']
posted @   叁只小羊  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示