简明 Python 教程(第6章 模块)

模块是Python中组织代码的一种方式,它允许开发者将代码分解为可重用的单元,便于管理和维护。开发者可以有效地利用Python的模块系统来构建复杂的应用程序。模块是一个包含Python定义和声明的文件,文件名就是模块名加上.py扩展名。模块可以包含函数、类、变量以及可执行的代码。

使用sys模块

sys模块是Python标准库中的一个核心模块,它提供了一系列有关Python解释器和其环境的函数和变量。使用sys模块,你可以访问与系统相关的功能,如命令行参数、导入的模块、系统路径等。sys模块提供了许多有用的功能,可以帮助你编写更加强大和灵活的Python程序。通过使用sys模块,你可以更好地控制程序的行为,以及与操作系统进行交互。

  • 导入sys模块

要使用sys模块,首先需要导入它:

import sys
  • 命令行参数(sys.argv

sys.argv是一个列表,包含了从命令行传递给Python脚本的参数。sys.argv[0]是脚本的名称,sys.argv[1:]包含了所有的命令行参数。

# 打印命令行参数 for arg in sys.argv: print(arg)
  • 系统路径(sys.path

sys.path是一个列表,包含了Python解释器搜索模块的路径。你可以修改这个列表来添加新的搜索路径。

# 打印系统路径 
print(sys.path) 
# 添加新的路径 
sys.path.append('/path/to/your/module')
  • 退出程序(sys.exit()

sys.exit()函数用于退出程序,并返回一个可选的状态码给操作系统。

# 退出程序 
sys.exit() 
# 带状态码退出 
sys.exit(1)
  • 获取系统信息(sys.platform

sys.platform是一个字符串,表示正在运行Python的平台类型。

# 打印系统平台 
print(sys.platform)
  • 获取Python解释器版本(sys.versionsys.version_info

sys.version是一个字符串,包含了Python解释器的版本信息。

sys.version_info是一个命名元组,提供了更详细的版本信息。

# 打印Python版本 
print(sys.version) 
# 打印更详细的版本信息 
print(sys.version_info)
  • 标准输入输出错误(sys.stdinsys.stdoutsys.stderr

sys.stdinsys.stdoutsys.stderr分别是标准输入流、标准输出流和标准错误流。

# 读取标准输入 
input_data = sys.stdin.readline().strip() 
# 写入标准输出 
sys.stdout.write('Hello, World!\n') 
# 写入标准错误 
sys.stderr.write('An error occurred.\n')
  • 环境变量(sys.getenv()

sys.getenv()函数用于获取环境变量的值。

# 获取环境变量 
path_env = sys.getenv('PATH')
  • 设置和获取对象的属性(sys.executable

sys.executable属性包含了调用Python解释器的路径。

# 打印Python解释器的路径 
print(sys.executable)

字节编译的.pyc文件

在Python中,.pyc文件是Python源代码(.py文件)的编译版本。这些文件是字节码(bytecode)的集合,它们是Python解释器执行.py源文件之前的中间形式。.pyc文件的存在是为了提高程序的加载速度,因为编译后的字节码可以直接由Python虚拟机(CPython)执行,而不需要再次编译源代码。

  • 如何生成.pyc文件

当Python解释器首次导入一个.py模块时,它会检查是否有对应的.pyc文件。如果没有,或者.pyc文件比.py源文件旧,解释器会自动编译源代码并创建或更新.pyc文件。这个过程是自动进行的,通常不需要用户手动干预。

  • .pyc文件的位置

.pyc文件默认存储在Python的 __pycache__ 目录下。在Unix-like系统中,这个目录通常位于模块的源代码旁边。例如,如果有一个名为mymodule.py的文件,那么对应的.pyc文件将会是__pycache__/mymodule.cpython-XX.pyc,其中XX是Python解释器的版本号。

在Windows系统中,.pyc文件通常存储在当前用户目录下的__pycache__文件夹中,路径类似于C:\Users\YourUsername\AppData\Local\Programs\Python\PythonXX\__pycache__

  • 为什么使用.pyc文件

  1. 提高性能:由于.pyc文件已经是编译过的字节码,它们可以更快地加载和执行,减少了每次运行程序时的编译开销。
  2. 保护源代码.pyc文件不包含源代码,这可以在一定程度上保护源代码不被轻易查看,尽管它们可以通过反编译工具还原,但这增加了一定的难度。
  • 清理.pyc文件

有时,你可能需要手动清理或删除.pyc文件,特别是在开发过程中,当源代码发生变化时,旧的.pyc文件可能不再适用。你可以使用以下命令来清理.pyc文件:

find . -name '*.pyc' -exec rm -f {} +

这个命令会在当前目录及其子目录中查找所有.pyc文件,并将它们删除。

  • 注意事项

  1. .pyc文件是平台相关的,不同平台上编译的.pyc文件可能不兼容。

  2. 在某些情况下,.pyc文件可能不会自动生成,例如,当使用某些IDE或编辑器时,你可能需要检查它们的设置。

  3. 如果你想要确保程序总是从最新的源代码编译,可以在.py文件的第一行添加如下声明:

    # -*- coding: source-encoding -*-

    这将告诉Python解释器忽略.pyc文件,每次都重新编译源代码。

.pyc文件是Python运行时的一个重要组成部分,它们使得程序的加载和执行更加高效,同时提供了一定程度的源代码保护。理解.pyc文件的工作原理有助于更好地管理Python项目。

from..import语句

from ... import ... 语句在Python中用于从模块中导入特定的部分到当前的命名空间。这种导入方式比简单的import语句提供了更高的灵活性,因为它允许你选择性地导入模块中的函数、类、变量等,而不是导入整个模块。

  • 基本语法

语句的基本语法如下:

from module_name import name1[, name2[, ...]]

这里,module_name是你想要导入的模块的名称,而name1name2等是你想要从该模块中导入的具体名称(可以是函数、类、变量等)。

  • 示例

假设你有一个名为math的模块,它包含了多个数学相关的函数,如sqrtsincos等。如果你只需要使用sqrt函数,你可以这样做:

from math import sqrt # 现在你可以直接使用sqrt函数,而不需要通过math前缀 
result = sqrt(16) # 输出: 4.0
  • 导入多个名称

你可以在一次from ... import ...语句中导入多个名称:

from math import sqrt, sin, cos # 使用导入的函数 
radius = 5 
area = sqrt(2 * sin(2 * radius) * cos(radius)) 
print(area) # 输出: 15.707963267948966
  • 导入所有名称

虽然不推荐这样做,因为你可能会不小心导入模块中的所有内容,但如果你需要导入模块中的所有公开名称,可以使用星号(*):

from math import * # 现在math模块中的所有函数都可以直接使用 
print(sqrt(4)) # 输出: 2.0 
print(sin(π / 2)) # 输出: 1.0

请注意,使用星号导入所有名称可能会导致命名空间污染,特别是当导入的名称与当前作用域中的其他名称冲突时。

  • 导入模块中的子模块

你还可以使用from ... import ...语句导入模块中的子模块:

from package import submodule # 现在可以直接使用submodule中的内容
  • 别名导入

有时,导入的名称可能与当前作用域中的其他名称冲突,或者名称太长不易于输入。在这种情况下,你可以为导入的名称指定一个别名:

from math import sqrt as sq # 使用别名 
result = sq(16) # 输出: 4.0
  • 注意事项

  1. 当你导入模块中的特定部分时,尽量使用有意义的名称,以便于代码的阅读和维护。
  2. 避免使用星号导入所有名称,除非在特定情况下你确信这样做不会引起问题。
  3. 导入别名时,确保别名不会与现有的名称冲突,并且它们是有意义的。

from ... import ...语句是Python中管理模块导入的强大工具,它提供了一种灵活的方式来组织和使用模块中的功能。通过合理使用这种导入方式,你可以编写更加清晰和高效的代码。

模块的__name__

在Python中,每个模块都有一个名为__name__的特殊属性,它用于表示模块的名称。这个属性在模块的生命周期中扮演着重要的角色,并且对于理解模块如何被导入和使用至关重要。__name__属性是Python模块系统中的一个关键特性,它提供了模块名称的自动确定和条件执行代码的能力。通过合理使用__name__,你可以编写出更加灵活和可重用的模块代码。

  • 模块名称的确定

当你直接运行一个Python脚本时,该脚本的模块名称会被设置为'__main__'。例如:

# myscript.py print(__name__)

如果你在命令行中运行python myscript.py,输出将会是'__main__'

当模块被导入到另一个模块中时,__name__属性将被设置为模块的文件名(不包括.py扩展名)。例如:

# mymodule.py 
print(__name__)

如果你在另一个脚本中使用import mymodule,那么在mymoduleprint(__name__)的输出将会是'mymodule'

  • 模块运行控制

__name__属性通常用于控制模块的行为,以便在直接运行模块时和作为库导入时采取不同的行动。例如,你可能希望模块在被导入时不执行某些代码,而在直接运行时执行。这可以通过检查__name__属性来实现:

# mymodule.py 
def some_function(): print("Function is called") if __name__ == '__main__':some_function()

在这个例子中,some_function()只有在直接运行mymodule.py时才会被调用。如果mymodule.py被另一个脚本导入,some_function()将不会被执行。

  • 模块重命名

__name__属性还可以用于在模块内部引用模块本身。这在模块需要导入自身或者需要在模块内部使用其名称时非常有用。例如:

# mymodule.py__name__ = 'my_new_name' 
# 重命名模块 print(__name__) 
# 输出: my_new_name

在这个例子中,模块的名称被动态地更改为'my_new_name'。然而,这种用法并不常见,因为它可能会导致代码难以理解和维护。

制造你自己的模块

制造你自己的模块是Python编程中的一个重要方面,它允许你将代码组织成可重用的单元,便于维护和分享。创建自定义模块是Python编程中的一个基本技能。以下是创建和使用自定义Python模块的详细步骤:

  • 步骤1:创建模块文件

一个Python模块是一个包含Python代码的.py文件。你可以使用任何文本编辑器或集成开发环境(IDE)来创建一个新的文本文件,并将其保存为.py扩展名。例如,你可以创建一个名为mymodule.py的文件。

  • 步骤2:编写模块代码

mymodule.py文件中,你可以定义函数、类、变量和执行任何其他Python代码。例如:

# mymodule.py 
def greet(name): """Print a greeting message.""" print(f"Hello, {name}!") class Counter: """A simple counter class.""" def __init__(self): self.count = 0 def increment(self): self.count += 1 def get_count(self): return self.count
  • 步骤3:保存模块文件

将文件保存在Python的搜索路径之一的目录中。Python会搜索包含在sys.path中的目录以查找模块。通常,这意味着你可以将模块保存在当前工作目录中,或者在Python安装的site-packages目录中。

  • 步骤4:导入和使用模块

一旦你的模块文件准备好了,你可以在另一个Python脚本中导入并使用它。例如,创建一个名为main.py的文件,并导入mymodule

# main.py 
import mymodule # 使用模块中的函数和类 
mymodule.greet('Alice') 
counter = mymodule.Counter() 
counter.increment() 
print(counter.get_count()) # 输出: 1
  • 步骤5:处理模块的__name__

在模块内部,你可以使用__name__属性来控制模块的行为。例如,如果你想要在模块被直接运行时执行某些代码,可以这样写:

# mymodule.py 
def __name__ == '__main__': greet('World') # 只有在直接运行模块时才会调用
  • 步骤6:创建模块的__init__.py文件(可选)

如果你想让你的模块成为一个包(即一个包含多个模块的目录),你需要在该目录中创建一个__init__.py文件。这个文件可以为空,但它的存在告诉Python这个目录应该被视为一个Python包。

例如,如果你有一个名为mypackage的目录,其中包含mymodule.py,你可以在mypackage目录中创建一个空的__init__.py文件,这样mypackage就可以作为一个包被导入。

  • 步骤7:安装模块(可选)

如果你想要更广泛地分享你的模块,你可以将其打包并上传到Python包索引(PyPI),这样其他人就可以通过pip安装你的模块了。

使用dir()函数

dir() 是Python中的一个内置函数,它用于返回一个对象的属性、方法列表。当你对一个对象调用 dir() 函数时,它会列出对象的所有属性和方法,包括内置的和自定义的。这个函数对于探索和理解对象的接口非常有用,尤其是在处理不熟悉的类或模块时。它可以帮助你更好地理解和使用对象。通过熟悉这个函数,你可以更有效地进行调试和代码探索。

  • 基本用法

dir() 函数的基本用法很简单,你只需要传入一个对象作为参数:

my_list = [1, 2, 3] 
print(dir(my_list))

这将输出列表对象 my_list 的所有属性和方法的列表。

  • 无参数调用

如果你不传入任何参数调用 dir(),它将返回当前作用域中定义的所有名称的列表:

a = 1 
b = 2 
print(dir())

这将列出变量 ab 以及其他在当前作用域中定义的名称。

  • 查看模块内容

dir() 函数也常用于查看模块中定义的所有内容。例如,要查看 sys 模块中有哪些属性和方法,你可以这样做:

import sys 
print(dir(sys))
  • 结合 help() 使用

dir() 函数通常与 help() 函数结合使用,以获取有关对象属性和方法的更多信息。例如,如果你对列表的 append() 方法感兴趣,你可以这样做:

print(help(list.append))
  • 过滤结果

dir() 函数返回的列表可能包含一些你不想看到的内置属性,如 __class____doc__ 等。如果你想过滤掉这些内置属性,可以使用列表推导式或 getattr() 函数:

# 获取对象的所有自定义属性和方法 
[aname for aname in dir(my_list) if not aname.startswith('__')]
  • 注意事项

  • dir() 函数返回的列表是按照字母顺序排列的。
  • 某些属性可能被定义为“私有”的(使用双下划线前缀),这意味着它们通常被视为内部使用,不应该直接访问。
  • dir() 函数可以帮助你了解对象的结构,但它不会告诉你每个属性或方法的具体功能。为了获取这些信息,你应该查看文档或使用 help() 函数。

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

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

相关文章

python的数据容器通用操作

常用方法 len统计个数 max最大元素 min最小元素 my_list[1,2,3,4,5] my_tuple(1,2,3,4,5) my_str"abcdefg" my_set{1,2,3,4,5} my_dict{"key1":1,"kye2":2,"key3":3,"key4":4,"key5":5}print(f"列表 元素个…

[Netty实践] 请求响应同步实现

目录 一、介绍 二、依赖引入 三、公共部分实现 四、server端实现 五、client端实现 六、测试 一、介绍 本片文章将实现请求响应同步,什么是请求响应同步呢?就是当我们发起一个请求时,希望能够在一定时间内同步(线程阻塞&am…

FPGA高端项目:解码索尼IMX327 MIPI相机转HDMI输出,提供FPGA开发板+2套工程源码+技术支持

目录 1、前言2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案 3、本 MIPI CSI-RX IP 介绍4、个人 FPGA高端图像处理开发板简介5、详细设计方案设计原理框图IMX327 及其配置MIPI CSI RX图像 ISP 处理图像缓存HDMI输出工程源码架构 6、工程源码…

Java中SPI机制简单演示

Java中SPI机制简单演示 写一个SpiService接口 public interface SpiService {void run();}写两个实现类,注意:实现类可以跨包 Slf4j public class SpiServiceImpl1 implements SpiService {Overridepublic void run() {log.warn("SpiServiceImpl…

简单破除github的2FA验证

简单破除github的2FA验证 文章目录 简单破除github的2FA验证👨‍🏫Authenticator工具 👨‍🏫Authenticator工具 最近使用github的时候发现要搞一个2FA的验证才可以 验证的途径有两种:一种是用手机电话验证,…

使用easyYapi生成文档

easyYapi生成文档 背景1.安装配置1.1 介绍1.2 安装1.3 配置1.3.1 Export Postman1.3.2 Export Yapi1.3.3 Export Markdown1.3.4 Export Api1.3.6 常见问题补充 2. java注释规范2.1 接口注释规范2.2 出入参注释规范 3. 特定化支持3.1 必填校验3.2 忽略导出3.3 返回不一致3.4 设置…

关于JavaScript常用命令

JS(JavaScript)是一种用于构建交互式网页的脚本语言,常用于前端开发。以下是一些常用的JS命令及其简要说明,希望能够帮助您更好地了解JS的基础知识。 1. **变量声明与赋值** - var, let, const: 用于声明变量,var在…

第二证券|高速连接概念再度活跃,沃尔核材5日涨近60%,胜蓝股份等走高

高速连接概念26日盘中再度走强,到发稿,胜蓝股份涨超13%,沃尔核材涨停,华丰科技、奥飞数据涨超5%。 值得注意的是,沃尔核材近5个交易日已收成4个涨停板,累计大涨近60%。公司近来在投资者互动平台表示&#…

Disruptor消费线程等待策略

以下按等待最快到最慢策略排序 BusySpinWaitStrategy BusySpinWaitStrategy相当于while(true)不停的轮询,跑动起来会迅速把CPU打满,适合延迟要求苛刻的业务场景,但是缺点是非常吃CPU YieldingWaitStrategy 轮询完成使用yield函数让出CPU资…

宽光谱SOA光芯片设计(一)

-本文翻译自由Geoff H. Darling于2003年撰写的文章。尽管文章较早,但可以了解一些SOA底层原理,并可看到早期SOA研究的思路和过程,于今仍有很高借鉴价值。 摘要 本文介绍一种新型宽光谱半导体光放大器(SOA)技术&#x…

【数据分享】中国土壤有机质数据集(免费获取)

中国土壤有机质数据集对于农业、生态环境保护等领域具有重要意义。通过对土壤有机质等多项指标的统计和分析,可以更好地了解土壤的特性,指导合理的土壤管理和保护措施的制定,从而促进农业生产的可持续发展,并为生态环境保护提供科…

数据结构与算法之美学习笔记:《数据结构与算法之美》学习指导手册

目录 前言 前言 本节课程思维导图: 在设计专栏内容的时候,为了兼顾不同基础的同学,我在内容上做到了难易结合,既有简单的数组、链表、栈、队列这些基础内容,也有红黑树、BM、KMP 这些难度较大的算法。但是,…

利用云手机高效运营多个海外社媒账户

随着全球化进程的不断推进,中国出海企业和B2B外贸企业日益重视海外社媒营销,将其视为抢占市场份额的关键策略。在海外社媒营销中,企业通常会在多个平台上批量开通账户,搭建自己的社媒内容矩阵。本文将会介绍如何用云手机高效运营多…

格雷希尔G25F系列快速接头,在新能源电池包气密性测试时的各种电气接插件的应用

一些大的新能源电池制造商如:比亚迪、宁德时代、国轩高科、亿纬锂能、东方时代等,在全球的新能源电池市场上占据着重要的地位。新能源PACK电池包在生产时,需要经过一些严苛的测试,用以检测产品的品质是否达到合格标准,…

基于React的低代码平台开发实践

💂 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】🤟 一站式轻松构建小程序、Web网站、移动应用:👉在线地址🤟 基于Web端打造的:👉轻量化工具创作平台💅 想寻找共同学习交…

宝塔设置限制ip后,ip改了之后 ,登陆不上了

前言 今天作死,在宝塔面板设置界面,将访问面板的ip地址限制成只有自己电脑的ip才能访问,修改之后直接人傻了,“403 forbidden”。吓得我直接网上一通搜索,还好,解决方法非常简单。 解决方法 打开ssh客户…

探索AI大模型学习:挖掘技术的无限可能

标题: 探索AI大模型学习:挖掘技术的无限可能 在当今技术环境中,AI大模型学习已成为研究者和工程师们的热门话题。不仅需要深厚的数学基础和编程能力,还需要对特定领域的业务场景有深入的了解。通过不断优化模型结构和算法&#xf…

skimage求凸包、包络

给一幅分割 label,求某个物体的凸包(convex hull)[1]和包络(polygon)[2],所得是一幅 0/1 的 mask。凸包、包络都是包含物体的,分别在于包络不要求凸,可以更细致地勾勒物体形状。例&a…

【OpenModelica】4命令行大全

命令行大全 文章目录 命令行大全一、Summary of Commands for the Interactive Session Handler二、Running the compiler from command line 一、Summary of Commands for the Interactive Session Handler 以下是交互式会话处理器中当前可用命令的完整列表。 • simulate(mo…

中国500米逐年植被净初级生产力(NPP)数据集(2000-2022)

净初级生产力(NPP)是指植物在单位时间单位面积上由光合作用产生的有机物质总量中扣除自养呼吸后的剩余部分,是生产者能用于生长、发育和繁殖的能量值,反映了植物固定和转化光合产物的效率,也是生态系统中其他生物成员生存和繁衍的物质基础。其…