python笔记(16)模块

模块是组织代码、实现复用、提升开发效率的关键元素。它们如同积木块一样,构成了Python程序的基石。本

一、理解Python模块:定义与基本特性

1. 定义

模块,简单来说,就是包含Python定义和语句的文件。它可以是一个.py文件,也可以是一个目录(含有__init__.py文件),甚至是一个自定义的C扩展。模块为代码提供了封装、复用和命名空间管理的功能,使得大型项目能够以更清晰、模块化的形式进行组织。

2. 基本特性

  • 代码复用:模块允许开发者将常用功能、类或函数封装在一个单独的文件中,便于在多个地方重复使用,避免代码冗余。
  • 命名空间管理:每个模块都有自己的命名空间,通过模块导入机制,可以有效避免变量名冲突,提高代码可读性和维护性。
  • 模块化设计:模块化使程序结构清晰,易于理解和分工协作,遵循“高内聚、低耦合”的原则,有利于复杂项目的开发和管理。
  • 系统资源隔离:模块有助于将不同功能的代码隔离开来,减少全局变量的使用,降低系统间的相互影响。

二、Python模块的结构与创建

1. 模块结构

一个典型的Python模块文件通常包含以下部分:

  • 文档字符串(docstring):位于模块文件开头,用于描述模块的功能、接口、使用方法等,可通过内置函数help()pydoc工具访问。
  • 变量定义:包括常量、数据结构等,供模块内部或外部使用。
  • 函数定义:实现特定功能的独立代码块,对外提供服务。
  • 类定义:定义对象的属性和行为,实现面向对象编程。
  • 模块级代码:在模块文件顶层执行的代码,如初始化工作、注册信号处理器等。

2. 创建模块

创建一个Python模块非常简单,只需按照上述结构编写.py文件即可。例如,创建一个名为utils.py的模块,内容如下:

"""
Utils module: Provides common utility functions.

Functions:
    greeting(name: str) -> str: Returns a personalized greeting message.
"""

def greeting(name: str) -> str:
    return f"Hello, {name}!"

# ... 其他函数和类定义

三、Python模块的导入与使用

1. 导入模块

Python提供了多种导入模块的方式,包括:

  • 常规导入import module_name,直接导入整个模块,通过module_name.访问其中的成员。
  • 别名导入import module_name as alias,为模块指定别名,方便调用。
  • 从模块导入特定成员from module_name import member,直接导入模块内的某个成员,无需通过模块名引用。
  • 星号(*)导入from module_name import *,导入模块的所有成员到当前命名空间。不推荐使用,易导致命名冲突和代码不易理解。

2. 使用模块

导入模块后,即可使用其提供的变量、函数、类等资源。例如,对于上文创建的utils模块:

如想要导入模块 utils.py,需要把命令放在脚本的顶端:

import utils

print(utils.greeting("Alice"))  # 输出:Hello, Alice!

# 或者使用别名导入
import utils as ut

print(ut.greeting("Bob"))  # 输出:Hello, Bob!

3. 定位模块

当你导入一个模块,Python 解析器对模块位置的搜索顺序是:

  • 当前目录
  • 如果不在当前目录,Python 则搜索在 shell 变量 PYTHONPATH 下的每个目录。
  • 如果都找不到,Python 会察看默认路径。UNIX下,默认路径一般为 /usr/local/lib/python/

模块搜索路径存储在 system 模块的 sys.path 变量中。变量里包含当前目录,PYTHONPATH 和由安装过程决定的默认目录。

4. 命名空间和作用域

变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。

一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。

每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。

Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

因此,如果要给全局变量在一个函数里赋值,必须使用 global 语句。

global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。

例如,我们在全局命名空间里定义一个变量 money。我们再在函数内给变量 money 赋值,然后 Python 会假定 money 是一个局部变量。然而,我们并没有在访问前声明一个局部变量 money,结果就是会出现一个 UnboundLocalError 的错误。取消 global 语句的注释就能解决这个问题。

 
Money = 2000
def AddMoney():
   # 想改正代码就取消以下注释:
   #global Money
   Money=Money+1
 
print(Money)
AddMoney()
print(Money)

'''
执行会报错如下:
Traceback (most recent call last):
  File "f:\学习\python\测试\test2.py", line 9, in <module>
    AddMoney()
    ^^^^^^^^^^
  File "f:\学习\python\测试\test2.py", line 6, in AddMoney
    Money=Money+1
          ^^^^^
UnboundLocalError: cannot access local variable 'Money' where it is not associated with a value
PS F:\学习\python\测试> 
因为money在这里是局部变量没有定义
money到底是什么呢?当你读到这行代码时,完全不知道money是什么,money是整数呢?还是字符串呢?换用更专业的术语,也就是说,变量money没有被定义。
当去掉注释后可以当做全局变量不会报错,也可以在函数里写money=0,但是外面打印出来的结果还是2000,因为局部变量不能被外面的引用

'''

四、Python标准库与第三方模块

1. Python标准库

Python自带一系列丰富的标准库模块,涵盖了网络通信、文件操作、数据处理、算法实现、系统接口等诸多领域。如ossysdatetimejsonrequests等,这些都是Python编程的强大工具箱,极大地提高了开发效率。

2. 第三方模块

除了标准库外,Python生态还拥有庞大的第三方模块库,如numpypandas用于数据分析,tensorflowpytorch用于深度学习,flaskdjango用于Web开发等。这些模块可通过pip包管理器轻松安装,极大地扩展了Python的应用范围。

3.__name__

一个模块被另一个程序第一次引入时,其主程序将运行。如果我们想在模块被引入时,模块中的某一程序块不执行,我们可以用 __name__ 属性来使该程序块仅在该模块自身运行时执行。


#下面代码是test2.py下的代码
if __name__ == '__main__':
    print('程序自身在运行')
else:
    print('我被其他模块导入了,执行了else代码块')

#在test2.py里执行会输出:程序自身在运行

#下面是test.py里的代码
import test2 

#执行后会输出:我被其他模块导入了,执行了else代码块

说明:

  1. 每个模块都有一个 __name__ 属性,当其值是 '__main__' 时,表明该模块自身在运行,否则是被引入。
  2. __name__ 与 __main__ 底下是双下划线,是“_ _”去掉中间的空格。

4.dir()函数

会把模块下的函数都列出来

import sys
print(dir(sys))

#输出如下
['__breakpointhook__', '__displayhook__', '__doc__', '__excepthook__', '__interactivehook__', '__loader__', 
'__name__', '__package__', '__spec__', '__stderr__', '__stdin__', '__stdout__', '__unraisablehook__', '_base_executable', '_clear_type_cache', '_current_exceptions', '_current_frames', '_debugmallocstats', '_enablelegacywindowsfsencoding', '_framework', '_getframe', '_getquickenedcount', '_git', '_home', '_stdlib_dir', '_xoptions', 'addaudithook', 'api_version', 'argv', 'audit', 'base_exec_prefix', 'base_prefix', 'breakpointhook', 'builtin_module_names', 'byteorder', 'call_tracing', 'copyright', 'displayhook', 'dllhandle', 'dont_write_bytecode', 'exc_info', 'excepthook', 'exec_prefix', 'executable', 'exit', 'flags', 'float_info', 'float_repr_style', 'get_asyncgen_hooks', 'get_coroutine_origin_tracking_depth', 'getallocatedblocks', 'getdefaultencoding', 'getfilesystemencodeerrors', 'getfilesystemencoding', 'getprofile', 'getrecursionlimit', 'getrefcount', 'getsizeof', 'getswitchinterval', 'gettrace', 'getwindowsversion', 'hash_info', 'hexversion', 'implementation', 'int_info', 'intern', 'is_finalizing', 'maxsize', 'maxunicode', 'meta_path', 'modules', 'orig_argv', 
'path', 'path_hooks', 'path_importer_cache', 'platform', 'platlibdir', 'prefix', 'pycache_prefix', 'set_asyncgen_hooks', 'set_coroutine_origin_tracking_depth', 'setprofile', 'setrecursionlimit', 'setswitchinterval', 
'settrace', 'stderr', 'stdin', 'stdlib_module_names', 'stdout', 'thread_info', 'unraisablehook', 'version', 
'version_info', 'warnoptions', 'winver']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/610627.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zabbix监控中文乱码问题解决方法

一、问题描述 1.查看Zabbix仪表盘 在Zabbix的监控仪表盘界面&#xff0c;字体显示为“方框”&#xff0c;无法查看到具体的性能指标名称。 2.问题分析 Zabbix的web端没有中文字库&#xff0c;导致切换到中文页面&#xff0c;中文成了乱码这个问题&#xff0c;我们最需要把中文…

使用LlamaIndex构建能对文档进行推理;大模型自动执行基于浏览器的工作流;ElevenLabs宣布进军音乐创作领域

✨ 1: Building Agentic RAG with LlamaIndex 由Jerry Liu教授、专注于使用LlamaIndex构建能对文档进行推理和回答复杂问题的代理研究型RAG的新课程 我很高兴向大家介绍“使用&#xff08;RAG&#xff09;与Llamalndex构建主动性研究助理代理”的课程&#xff0c;这是由Llama…

XSS-Labs 靶场通过解析(下)

前言 XSS-Labs靶场是一个专门用于学习和练习跨站脚本攻击&#xff08;XSS&#xff09;技术的在线平台。它提供了一系列的实验场景和演示&#xff0c;帮助安全研究人员、开发人员和安全爱好者深入了解XSS攻击的原理和防御方法。 XSS-Labs靶场的主要特点和功能包括&#xff1a;…

关联系统-整车控制器VCU

整车驱动原理 如上图所示&#xff0c;电池组输出直流电给DC/AC逆变器&#xff0c;逆变器将直流电转化为交流电输入给电机&#xff0c;电机在电磁力的作用下转动&#xff0c;通过传动机构将驱动力输送到车轮&#xff0c;其中整车控制器VCU可以根据用户油门/刹车的输入控制输出功…

国际化业务、全球化团队沟通难?浅析跨文化沟通的挑战和应对措施

在全球化背景下&#xff0c;发展出海业务相比以往更具有巨大的前景和潜力&#xff0c;是企业寻找“第二增长点”和提升综合实力的优先选择。近几年“中企出海”大热&#xff0c;中国企业在世界各地开展业务拓展国际市场&#xff0c;获得更加国际化的营商经验与客户资源。与此同…

【数据结构】单链表和双链表

文章目录 一、链表的概念及结构二、链表的分类三、无头单向非循环链表1.单链表创建2.尾插和头插3.尾删和头删4.打印5.查找6.插入7.删除8.销毁 四、带头双向循环链表1.双链表的创建2.初始化3.判断链表是否为空4.尾插和头插5.尾删和头删6.查找7.插入8.删除9.销毁 五、总结链表和顺…

《窄门》安德烈·纪德

究竟会不会有这样一种爱情&#xff0c;即使毫无希望&#xff0c;一个人也可以将它长久地保持在心中&#xff1b;即使生活每天吹它&#xff0c;也始终无法把它吹灭……&#xff1f; 在《窄门》中&#xff0c;纪德将爱情中的神秘主义体验推向极致&#xff0c;为我们讲述了一段纯…

C语言(指针)3

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸各位能阅读我的文章&#xff0c;诚请评论指点&#xff0c;关注收藏&#xff0c;欢迎欢迎~~ &#x1f4a5;个人主页&#xff1a;小羊在奋斗 &#x1f4a5;所属专栏&#xff1a;C语言 本系列文章为个人学习笔记&#x…

YOLOv9改进策略 | 添加注意力篇 | 利用YOLO-Face提出的SEAM注意力机制优化物体遮挡检测(附代码 + 修改教程)

一、本文介绍 本文给大家带来的改进机制是由YOLO-Face提出能够改善物体遮挡检测的注意力机制SEAM&#xff0c;SEAM&#xff08;Spatially Enhanced Attention Module&#xff09;注意力网络模块旨在补偿被遮挡面部的响应损失&#xff0c;通过增强未遮挡面部的响应来实现这一目…

链表第4/9题--翻转链表--双指针法

LeetCode206&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5] 输出&#xff1a;[5,4,3,2,1]示例 2&#xff1a; 输入&#xff1a;head [1,2] 输出&#xff1a;[2,1]示例…

鸿蒙OpenHarmony开发板解析:【特性配置规则】

特性 特性配置规则 下面介绍feature的声明、定义以及使用方法。 feature的声明 开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 在部件的bundle.json文件中通过feature_list来声明部件的feature列…

生信技能45 - 基于docker容器运行生信软件

1. 获取docker镜像 以运行xhmm CNV分析软件为例。 # 搜索仓库镜像 sudo docker search xhmm# 拉取镜像 sudo docker pull ksarathbabu/xhmm_v1.0# 启动镜像,非后台 sudo docker run -it ksarathbabu/xhmm_v1.0 /bin/bash # -i: 交互式操作。 # -t: 终端。 # ksarathbabu/xhmm…

爆爽,英语小白怒刷 50 课!像玩游戏一样学习英语~

重点!!!(先看这) 清楚自己学英语的目的, 先搞清楚目标&#xff0c;再行动自身现在最需要的东西&#xff1a;词汇量&#xff1f;口语&#xff1f;还是阅读能力&#xff1f;找对应的书籍,学习资料往兴趣靠拢&#xff1a;网上有大量的推荐美剧学习、小说学习&#xff0c;不要被他…

机器学习算法应用——K近邻分类器(KNN)

K近邻分类器&#xff08;KNN&#xff09;&#xff08;4-2&#xff09; K近邻分类器&#xff08;K-Nearest Neighbor&#xff0c;简称KNN&#xff09;是一种基本的机器学习分类算法。它的工作原理是&#xff1a;在特征空间中&#xff0c;如果一个样本在特征空间中的K个最相邻的样…

【一刷《剑指Offer》】面试题 17:合并两个排序的链表

力扣对应题目链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 核心考点&#xff1a;链表合并。 一、《剑指Offer》内容 二、分析题目 这道题的解题思路有很多&#xff1a; 可以一个一个节点的归并。可以采用递归完成。 三、代码 1、易于理解的…

Linux-基础命令第三天

1、命令&#xff1a;wc 作用&#xff1a;统计行数、单词数、字符数 格式&#xff1a;wc 选项 文件名 例&#xff1a; 统计文件中的行数、单词数、字符数 说明&#xff1a;59代表行数&#xff0c;111代表单词数&#xff0c;2713代表字符数&#xff0c;a.txt代表文件名 选项…

c语言查找字符串中指定字符串的个数

目录 一、测试思路二、方式1三、方式2 一、测试思路 使用C语言来查找一个字符串中指定数量的子字符串&#xff0c;使用 strncmp 函数或者 memcmp 函数&#xff0c;遍历主字符串并计数子字符串出现的次数。或者使用 strstr 函数&#xff0c; strstr 函数是 C 语言标准库 <str…

Java 集合-List

集合主要分为两组(单列集合, 双列集合) Connection 接口有两个重要的子接口LIst 和 Set, 它们的实现子类都是单列集合, Map 接口的实现子类是双列集合, 存放的是 K-V Connection 接口 Collection 接口和常用方法 下面以 ArrayList 演示一下 add: 添加单个元素remove: 删除指…

基于GIS地理技术+智慧巡检解决方案(Word原件)

传统的巡检采取人工记录的方式&#xff0c;该工作模式在生产中存在很大弊端&#xff0c;可能造成巡检不到位、操作失误、观察不仔细、历史问题难以追溯等现象&#xff0c;使得巡检数据不准确&#xff0c;设备故障隐患得不到及时发现和处理。因此建立一套完善的巡检管理系统是企…

【C语言】——联合体与枚举

【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体   与…
最新文章