Python学习笔记|模块

Bruce
2023-12-26 / 0 评论 / 12 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2023年12月26日,已超过146天没有更新,若内容或图片失效,请留言反馈。
AI摘要:本文介绍了Python中模块和包的基本概念。模块是一个.py文件,使用模块可以提高代码的可维护性和重用性。包是按目录组织模块,避免模块名冲突。每个包目录下都必须有一个`__init__.py`文件,它可以是空文件或包含Python代码。模块和包的命名要遵循规范,不要与系统模块名冲突。文章还介绍了如何使用模块和包,以及模块的作用域和模块搜索路径。

一、模块的基本概念

模块:在Python中,一个.py文件就称之为一个模块(Module)

使用模块的好处:(1)提高了代码的可维护性。(2)编写代码不必从零开始。(3)使用模块还可以避免函数名和变量名冲突。

注意:尽量不要与Python的内建函数冲突。Python内建函数介绍:https://docs.python.org/3/library/functions.html

二、包的基本概念

为了避免模块名冲突,引入按目录组织模块,避免冲突。方法是选择一个顶层的包名,比如mycompany,按照如下目录存放:

mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py

引入包名后,只要顶层的包名不与别人冲突,那么所有模块都不会与别人冲突。abc.py模块的名称就变为了mycompany.abcxyz.py的模块名就变为了mycompany.xyz

每一个包名目录下都会有一个__init__.py文件,这个文件必须存在,否则Python就会把这个目录当做普通目录,而不是一个包。

__init__.py文件可以是空文件,也可以有Python代码。它本身就是一个模块,而它的模块名就是mycompany

类似的,可以有多级目录,组成多层级的包结构。

mycompany
 ├─ web
 │  ├─ __init__.py
 │  ├─ utils.py
 │  └─ www.py
 ├─ __init__.py
 ├─ abc.py
 └─ utils.py

文件www.py的模块名就是mycompany.web.www,两个文件utils.py的模块名分别是mycompany.utilsmycompany.web.utils

总结:模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用。在此模块。

创建自己的模块时,要注意:

模块名要遵循Python变量命名规范,不要使用中文、特殊字符;

模块名不要和系统模块名冲突,最好先查看系统是否已存在该模块,检查方法是在Python交互环境执行import abc,若成功则说明系统存在此模块。

三、使用模块

以内建的sys为例,写一个hello的模块。

#!/user/bin/env python3     #第一行注释让hello.py文件可以直接在Unix/Linux/Mac上运行
# -*- coding: utf-8 -*-     #第二行注释表示.py文件本身使用UTF-8编码

'a test module'     # 字符串,表示模块的文档注释。任何模块代码的第一个字符串都被视为模块的文档注释

__author__ = 'Bruce Wang'     # __author__变量把作者写进去

#以上是一个Python模块的标准文件模板,也可以全部删掉不写。
# 后面是真正的代码

import sys

def test():
    args = sys.argv
    if len(args) == 1:
        print("Hello, world!")
    elif len(args) == 2:
        print("Hello, %s!" % args[1])
    else:
        print("Too many arguments!")

if __name__ == '__main__':
    test()
Too many arguments!

四、作用域

类似__xxx__这样的变量(__author____name__)是特殊变量,可以被直接引用但是有特殊用途,我们自己的变量一般不要用这种变量名;

类似_xxx和__xxx这样的函数或变量是非公开的(private),不应该被直接引用。

def _private_1(name):
    return 'Hello, %s' % name

def _private_2(name):
    return 'Hi, %s' % name

def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

print(greeting("Bruce"))
Hello, Bruce

我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。

五、模块搜索路径

加载一个模块时,Python会在指定的路径下搜索对应的.py文件,默认情况下Python解释器会搜索(1)当前目录;(2)所有已安装的内置模块(3)第三方模块。搜索路径存放在sys模块的path变量中:

import sys
sys.path
['D:\\pythonProject\\05 模块',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\DLLs',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310',
 '',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\win32',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\win32\\lib',
 'C:\\Users\\Bruce\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages\\Pythonwin']
1

评论 (0)

取消