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 utilsprint(utils.greeting("Alice"))  # 输出:Hello, Alice!# 或者使用别名导入
import utils as utprint(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 MoneyMoney=Money+1print(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 AddMoneyMoney=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.mzph.cn/diannao/9606.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

这是一关于DSC相关的文档

这是一关于DSC相关的文档 上面这幅图清晰的展示了somewhat flat的像素图示

机器学习算法应用——关联规则分析(4-4)

关联规则分析&#xff08;4-4&#xff09; 关联规则分析&#xff08;Association Rule Mining&#xff09;是一种基于频繁项集的分析方法&#xff0c;它以最常出现在一起的元素之间的关系作为分析对象&#xff0c;主要用于发掘大数据中隐藏的关联规则&#xff0c;是数据挖掘技术…

JAVA_1

JAVA_1 一、JAVA8种数据类型二、JAVA数据类型自动和强制转换三、JAVA运算符 一、JAVA8种数据类型 1.byte 1字节 2.short 2字节 3.int 4字节 4.long 8字节 5.float 4字节 6.double 8字节 7.char 2字节 8.boolean true和false import java.util.Scanner;public class test1_dat…

Python教程:一文了解PageObject模式

PageObject 模式是一种用于测试自动化的设计模式&#xff0c;它将页面的功能和页面的实现分开&#xff0c;提高了代码的可维护性和可重用性。本文将从基础概念开始&#xff0c;逐步介绍 Python 中的 PageObject 模式&#xff0c;并提供详细的代码示例。 1. 什么是 PageObject 模…

小众行业风口:Q1季度擦窗机器人行业线上市场销售数据分析

今天给大家分享一个2024年的小众行业增长风口——擦窗机器人。 作为家居自动化里的重要一员&#xff0c;擦窗机器人可以简称为擦窗神器&#xff0c;是为了解决大户型家庭的外窗清洁痛点而存在。而目前&#xff0c;擦窗机器人行业正在走向成熟&#xff0c;且市场需求量居高不下…

Linux专题-Makefile(1)

1.Makefile中的注释使用 # 2. Makefile中的静默执行。 makefile中&#xff0c;默认情况下执行一行命令前会先把这一行命令打印出来&#xff0c;然后再执行这条命令。如果不想看到打印的命令&#xff0c;则可以使用静默执 行的功能&#xff0c;即仅打印出命令执行的结果。使用方…

苹果公司因iPad广告争议而道歉,承认“未达标”|TodayAI

周二&#xff0c;苹果公司发布了一则新的iPad Pro广告&#xff0c;引起了广泛争议&#xff0c;该公司随后发表道歉声明&#xff0c;承认这则广告“未达标”。这则名为“压碎&#xff01;”的广告意图展示全新的M4芯片iPad Pro的创意潜力&#xff0c;但却因其表现方式而备受批评…

设计模式学习笔记 - 回顾总结:在实际软件开发中常用的设计思想、原则和模式

概述 本章&#xff0c;先来回顾下整个专栏的知识体系&#xff0c;主要包括面向对象、设计原则、编码规范、重构技巧、设计模式五个部分。 面向对象 相对于面向过程、函数式编程&#xff0c;面向对象是现在最主流的编程范式。纯面向过程的编程方法&#xff0c;现在已经不多见了…

android——关于app性能优化篇

前言 应用性能优化是指通过各种技术手段和优化策略&#xff0c;提高应用程序的性能&#xff0c;使其能够更高效地运行和响应用户操作。 下面介绍一些常见的应用性能优化方法 一、布局优化 1、减少嵌套 嵌套层数尽量少&#xff0c;使用ConstaintLayout能使层级大大降低尽量使…

浅谈如何利用 AI 提高内容生产效率?|TodayAI

在数字化时代&#xff0c;内容的创建和分发速度变得尤为关键。人工智能&#xff08;AI&#xff09;技术提供了加速这一过程的可能性&#xff0c;不仅提升了生产效率&#xff0c;还改善了内容的质量和受众的接受度。本文深入探讨AI如何在内容生成、分发与推广&#xff0c;以及内…

LangChain连接国内大模型测试|智谱ai、讯飞星火、通义千问

智谱AI 配置参考 https://python.langchain.com/v0.1/docs/integrations/chat/zhipuai/ZHIPUAI_API_KEY从https://open.bigmodel.cn/获取 from langchain_community.chat_models import ChatZhipuAI from langchain_core.messages import AIMessage, HumanMessage, SystemMes…

超越机械抓手:看多指机器人如何灵活运用触觉?

论文标题&#xff1a; Learning Visuotactile Skills with Two Multifingered Hands 论文作者&#xff1a; Toru Lin, Yu Zhang, Qiyang Li, Haozhi Qi, Brent Yi, Sergey Levine, and Jitendra Malik 1. 机器人新挑战&#xff1a;多指手指操作 在自动化和智能化日益普及的…

mybatis useGeneratedKeys=“true“ keyProperty=“id“的作用

useGeneratedKeys“true” keyProperty"id"的作用 <insert id"save" parameterType"User" useGeneratedKeys"true" keyProperty"id"></insert>作用为&#xff1a;保存成功后往User类中的id属性赋值&#xff0c;…

深度学习中超参数设置

1、batchsize 在训练深度学习模型时&#xff0c;batch size&#xff08;批大小&#xff09;和 epochs&#xff08;迭代次数&#xff09;之间的关系取决于您的数据集大小、模型复杂度、计算资源等因素。下面是一些一般性的指导原则&#xff1a; 较大的 Batch Size&#xff1a;通…

idea导入jar包、打jar包

一、导入jar包 1.在工程下面新建一个lib目录&#xff0c;将jar包放在lib目录下面 2.按步骤导入jar包 -接下来选择jar包所在的位置进行导入 -下图中标红框位置就是刚刚导入的jar包 二、直接用idea打jar包 -下图中Main Class就是选择程序中的Main函数 -右侧标红框位置表示…

VSCode Python 自动格式化代码(black)不生效

弄了很长时间&#xff0c;各种尝试&#xff0c;就想实现保存后自动格式化代码&#xff0c;用户设置&#xff0c;工作区设置&#xff0c;因为环境较多以为有啥冲突&#xff0c;就是没找到。后来看到一条评论说Python版本低&#xff0c;想到了版本问题。然后就看到以下描述 记录…

Spring如何控制Bean的加载顺序

前言 正常情况下&#xff0c;Spring 容器加载 Bean 的顺序是不确定的&#xff0c;那么我们如果需要按顺序加载 Bean 时应如何操作&#xff1f;本文将详细讲述我们如何才能控制 Bean 的加载顺序。 场景 我创建了 4 个 Class 文件&#xff0c;分别命名为 FirstInitialization Se…

maven 分离式打包

pom中插件配置&#xff1a; <!-- Maven Jar 插件配置 --> <plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><configuration><archive><!-- 将类路径添加到 MANIFEST.MF 文…

python数据分析——数据的选择和运算

数据的选择和运算 前言一、数据选择NumPy的数据选择一维数组元素提取示例 多维数组行列选择、区域选择示例 花式索引与布尔值索引布尔索引示例一示例二 花式索引示例一示例二 Pandas数据选择Series数据获取DataFrame数据获取列索引取值示例一示例二 取行方式示例loc() 方法示例…

人脸图像生成(DCGAN)

一、理论基础 1.什么是深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;&#xff09; 深度卷积对抗网络&#xff08;Deep Convolutional Generative Adversarial Network&#xff0c;DCGAN&#xff09;是一种生成对抗网络&#xf…