Python模块(python模块本质为什么文件)
off999 2024-09-21 20:56 32 浏览 0 评论
模块
你已经看到了如何在你的程序中重复使用代码——只需定义一次函数就可以对其重复调用了。如果你想在其他程序中复用你写的大量的函数时,怎么办?可能你已经猜到了,答案就是模块。
编写模块的方式有很多,但是最简单的方式就是创建一个包含很多方法和变量并以 .py 为扩展的文件。
另一种方法就是用编写 Python 解释器的语言来编写模块。例如,你可以用C语言来写模块,在使用标准 Python 解释器中进行编译时,这些模块会从你的 Python 代码中调用。
一个模块会被引入到一个程序来使用它的功能。这就是我们使用 Python 标准库的方法。首先,我们会了解如何使用标准库模块。
例子(保存为 module_using_sys.py ):
输出:
它是如何工作的:
首先,我们利用 import 引入 sys 模块,这基本上会告诉 Python ,我们想使用这个模块。 sys 模块包含着与 Python 解释器和它的环境(即系统)有关的函数。
当 Python 执行 import sys 语句时,它会查找 sys 模块。在这种情况下,它是一个内置模块,因此 Python 知道在哪里找到它。
如果它不是一个编译模块(即用 Python 编写的模块),那么 Python 解释器会在它的 sys.path 变量中列出来的目录中寻找它。如果模块被找到,则运行该模块主体中的语句,这个模块就会被设为 可用 供你使用。 注意,初始化在我们 第一次 引入这个模块时就会完成。
如果使用IDE编写和运行这些程序,请查找在菜单中为程序指定命令行参数的方法。
当我们执行 python module_using_sys.py we are arguments 命令的时候,我们使用 python 命令行运行模块 module_using_sys.py。后面的字符串 we are arguments 被作为参数传递给模块。Python 会把这些参数储存在 sys.argv 变量里以供后续使用。
记住,当前运行的模块名总储存在 sys.argv 列表的第一个元素中。所以执行以上语句后,sys.argv[0] 中存放着 'module_using_sys.py','we' 放在 sys.argv[1], 'are' 放在 sys.argv[2] 而 'arguments' 放在 sys.argv[3]。注意到 Python 中,数组索引从 0 开始计数而不是从 1 开始。
sys.path 是模块导入时要搜索的目录列表。我们可以看到 sys.path 的第一个字符串是空的,空字符串意味着当前目录也是 sys.path 的一部分,这与 PYTHONPATH 环境变量是相同的。这意味着你可以直接从当前目录下导入模块。不然你还需要把你要导入的模块放到 sys.path 中的一个目录里。
注意:当前目录指的是你的程序启动的目录。你可以通过执行 import os; print(os.getcwd()),来查看你的程序的当前目录。
字节码文件 .pyc
导入模块是一个相对而言开销较大的操作,因此,Python 试用了一些手段来使得导入模块的操作更加快速。其中一个方法,就是创建以 .pyc 为扩展名的 字节码 文件,它是一种中间形式,Python 会把程序代码转换成这样的形式,当你下一次想要在另外一个程序代码中导入模块的时候,这个 .pyc 文件就很有用 —— 导入操作会很快完成,这是因为导入模块所必须的一部分操作已经被事先完成了。此外,这些字节码文件都是平台无关的。
注意:这些 .pyc 文件一般会被创建在与它对应的 .py 文件相同的文件目录下。如果 Python 没有在该文件夹下写文件的权限,那么 .pyc 文件将不会被创建。
from..import 语句
如果你希望直接把 argv 变量导入到你的程序中(以避免每次都要键入 sys.),那么你就可以使用 from sys import argv 语句。
警告:原则上来说,还是要 避免 使用 from..import 语句,而是使用 import 语句。这是因为如果使用 import 语句的话,你的程序会避免出现命名冲突的问题,并且代码的可读性更高。
例:
模块的 __name__
每一个模块都有一个名称,在模块中我们可以通过判断语句来确定模块的名称。这在一种情形下特别有用:确定模块被导入了?还是在独立地运行。如之前提到过的,当模块第一次被导入的时候,模块的代码将被执行。我们可以通过这一点,让模块在被导入和独立运行时执行不同的操作。通过模块的 __name__ 属性可以实现这个功能。
示例(另存为 module_using_name.py):
输出:
代码是如何工作的?
每一个 Python 模块都定义了各自的 __name__。如果其值为 '__main__',这说明用户正在单独运行这个模块,这时我们可以进行合适的操作
创建你自己的模块
创建你自己的模块还是很容易的,你从一开始就在做这件事!这是因为每一个 Python 程序都是一个模块。你只需要保证这个程序以 .py 作为扩展名就行了。下面这个例子将会说明这件事。
例 (保存为 mymodule.py):
上面这个是一个 模块 的例子。正如你所看见的这样,比起我们普通的 Python 程序,它并没有什么特别不一样的地方。我们接下来将看到我们如何在另一个 Python 程序中使用到这个模块。
需要记住的是,这个模块的位置有两种选择:1、导入它的程序所处的文件夹下;2、sys.path 所列出的文件夹下。
另一个模块 (保存为 mymodule_demo.py):
输出:
它是如何工作的
需要注意的是,我们仍然还是使用 . 符号来访问模块的成员。Python 能够很好地复用同一个符号来让 Python 自身具有一种独特的「Pythonic」 感,从而这样一来我们就不需要不停地学习新的方法了。
下面是一个你用 from..import 语法的版本(保存为 mymodule_demo2.py)
mymodule_demo2.py 的输出和 mymodule_demo.py 是相同的。
需要注意的是,如果导入 mymodule 的模块中已经被有一个 __version__ 名称被声明了的话,那么这里就会产生命名冲突。这种情况是很可能出现的,因为一种常见的实践方式就是对每一个模块都使用这个名称来声明它自己的版本号。因此,尽管 import 语句可能会让你的程序代码稍微有点冗长,但是我们更加推荐你使用它。
你也可以使用:
这将会导入所有的诸如 say_hi 这样的公开名称(public names),但是不会导入 __version__,因为它以 2 个下划线作为前缀。
警告:记住,你应该避免使用 * 导入,比如像 from mymodule import * 这样。
Python 之禅
Python 的指导原则之一,就是「显式优于隐式」。你可以运行 import this 来了解更多的相关内容。
dir 函数
内置的 dir() 函数能以列表的形式返回某个对象定义的一系列标识符。如果这个对象是个模块,返回的列表中会包含模块内部所有的函数、类和变量。
这个函数接收一个可选的参数。当参数是模块名时,函数会返回对应模块的标识符列表。没有参数时则会返回当前模块的标识符列表。
例子:
代码是如何工作的?
首先我们用 dir 查看重要的 sys 模块。你可以看见这个模块包含的非常多的属性列表。
接下来,我们直接无参数调用 dir 函数。默认地,它会返回当前模块的属性列表。注意到上面导入的 sys 模块也是列表的一部分。
为了观察 dir 函数的行为,我们定义了一个变量 a,并给它随便赋了一个值,然后调用 dir 函数,我们可以看到列表中加入了同名的值。当我们通过 del 语句在当前模块中移除变量后,再次调用 dir 函数,可以发现输出列表也改变了,'a' 被移出了列表。
关于 del 的一点注释:这行语句执行后用于 删除 一个变量或标识符。在执行了 del a 之后,你就再也不能访问变量 a 了,它就像从未存在过一样。
注意 dir 函数对 任何 对象都有效。例如:dir(str) 会列出 str (String) 类的属性。
还有一个vars()函数,它有时能给你对象的属性和它们的值,但这个函数并不总是有效。
程序包
现在你一定已经开始观察组织程序的结构层次了。变量通常在函数的内部。全局变量和函数通常在模块的内部。如何组织模块呢?这就是程序包出场的时候了。
程序包就是一个装满模块的文件夹,它有一个特殊的 __init__.py 文件,这个文件告诉 Python 这个文件夹是特别的,因为它装着 Python 的模块。
让我们假设你想创建一个叫做 world 的程序包,它有很多子程序包 asia、africa 等。这些子程序包依次包含 india、madagascar 等模块。
以下是一种组织文件夹的方式:
程序包是分层组织模块的一种简便方式。你会在 标准库中找到许多程序包的实例。
如果说函数是程序的可重用部分,那么模块就是可重用的程序。程序包则是组织模块的另一个层次。Python 附带的标准库就是一组程序包,其中包括了许多模块。
我们已经学会了如何使用和编写自己的模块。
下一章我们会学习叫做数据结构的有趣概念。
喜欢请关注我,每天中午持续更新!
相关推荐
- ip检测网站(ip地址测试)
-
IP检测工具(IPNetChecker)V1.5.2是一个简易实用,功能强大的网络监控软件,使您可以检查互联网和局域网上的IP主机的网络状态。IP检测工具(IPNetChecker)V1.5....
- 云电脑app哪个好(手机云电脑app哪个最好)
-
答:以下是一些比较好的云电脑应用程序推荐:1.AnyDesk-支持Windows、MacOS、Linux、Android和iOS,可用于远程访问和控制PC或移动设备。2.Splashtop...
- 怎样注册邮箱163免费(怎样注册邮箱163免费账号)
-
一、工具:电脑(联网)、浏览器二、操作步骤:【1】打开浏览器,找到“163邮箱”,点击。【2】点击右边的“注册”。【3】网站默认注册手机号码邮箱,填写信息,点击“注册”。若不想泄漏手机号码或不想使用手...
- 微软surface pro 6(微软surface pro 6可以扩容吗)
-
SurfacePro6的接口包含:1个标准尺寸USB3.0端口,3.5mm耳机插孔,MiniDisplayPort,1个SurfaceConnect端口,Surface专业键盘盖端口,microSDX...
- 电源已接通未充电怎么回事(电源已接通未充电 真正解决办法)
-
原因分析:出现这样的原因有可能是长时间没有充电,导致电池的内部电量耗完后亏电严重,只是电脑充电的保护,不让过充而已,只要设置一下电池选项一般就可以解决问题了。解决方法:1、关机,拔下电源,拔出电池,...
- 华为云会议app下载(华为云会议下载)
-
华为云会议可以在PC客户端或者手机客户端上一键发起立即会议,1秒创会。然后在会中选择企业通讯录中的人加入,系统会自动呼叫这些与会人,接听后即加入会议。ZOOM是一个云会议服务平台,为客户提...
- 路由器重置方法(路由器重置方法详细步骤)
-
路由器靠近WAN口边上的有一个小孔用于路由器的重置,路由器配置完成后,我们可能会忘记他的用户名或者是密码,那么我们可以把它恢复到出厂设置,再靠近万口或电源之间,有一个小孔,用一个尖锐的金属查一下大约五...
- 100个有效qq号以及密码(有效qq号和密码大全)
-
如果你的电脑知识好的话,不妨用一些复合密码!SHIFT+一些特殊符号,字母,数字!虽然麻烦了点,但总比被人盗号了的好,是吧!最好还用手机绑定一下,这样的话方便改密码也不怕QQ被盗了哦。。。QQ密码找回...
- win10家庭中文版下载官网(windows10家庭中文版下载)
-
你好,激活Win10家庭中文版的方法:1.购买正版Win10家庭中文版激活码,然后在计算机上输入激活码,即可完成激活。2.如果您已经安装了Win10家庭中文版,但尚未激活,可以通过以下步骤激活:-...
- 电脑截图在哪里找(电脑截图在哪里找图片win10)
-
截图默认会保存在电脑的剪贴板中,可以通过以下步骤将其保存到本地:1.打开任意一款图片软件,如Paint、Photoshop、Word等。2.按下键盘上的Ctrl+V,或者在软件菜单栏中选择...
- 电脑里一堆microsoft visual
-
按照系统向下兼容原理,保留2010就可以了.1)你安装的时候是不是把创建快捷键的选项框都没选上,导致在开始菜单中没有找到相应的链接?2)去你的安装目录下,找到Microsoftvisualc++...
-
- windows无法识别usb(windows无法识别usb设备)
-
Windows无法识别USB,解决办法如下右键开始菜单打开设备管理器,在通用串行总线控制器中右键点击设备选择“卸载”,完成后重新启动计算机即可解决问题。这有可能是在组策略中禁用了USB口,可以使用快捷键【Win+R】运行gpedit.msc...
-
2025-11-10 11:51 off999
- bios能看到硬盘 开机找不到硬盘
-
bios里可以看到硬盘,说明硬盘已经被主板识别。进系统找不到,可能硬盘没分区,或者硬盘是动态磁盘,还没有导入或激活。按win+r,输入diskmgmt.msc回车,就打开磁盘管理了,在里面可以给新硬盘...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
慕ke 前端工程师2024「完整」
-
失业程序员复习python笔记——条件与循环
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
