[Python学习日记-45] Python 中模块的介绍与导入

news2024/11/24 15:33:55

[Python学习日记-45] Python 中模块的介绍与导入

简介

模块的概念与好处

模块的分类

模块导入和调用

自定义模块

模块的查找路径

简介

        在前面的学习当中偶尔我们会看到 import ... 一个什么东西的,或者 from ... import ...,那时候并没有进行介绍,主要是那个时候还不会用到,其实我们做这个动作的时候就是引入一个模块,而 from ... import ... 是类似从一个工具包里面引入里面其中一个工具(模块),在后面的文章当中我们会介绍一下一些常用的模块,大概会有十来个偏向于基础的,更多的会在后面面向对象当中有更多的讲述,下面我们将好好的介绍一下到底什么是模块,以及应该如何导入模块吧。

模块的概念与好处

一、什么是模块?

        在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。为了编写可维护的代码,我们会把很多函数分组,并分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在 Python 中,一个 .py 文件就可以称之为一个模块(Module)。

二、使用模块有什么好处?

  1. 最大的好处是大大提高了代码的可维护性。其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括 Python 内置的模块和来自第三方的模块。
  2. 使用模块还可以避免函数名和变量名冲突。每个模块有独立的命名空间,因此相同名字的函数和变量完全可以分别存在不同的模块中,所以我们自己在编写模块时,不必考虑名字会与其他模块冲突

模块的分类

        模块根据不同的来源分为三种,分别是:

  • 内置标准模块(又称标准库)执行 help('modules') 可以查看所有 Python 自带模块的列表,如下所示

help('modules') 的输出

Please wait a moment while I gather a list of all available modules...

test_sqlite3: testing with SQLite version 3.45.3
__future__          _testinternalcapi   functools           rlcompleter
__hello__           _testmultiphase     gc                  runpy
__phello__          _testsinglephase    genericpath         sched
_abc                _thread             getopt              secrets
_aix_support        _threading_local    getpass             select
_ast                _tkinter            gettext             selectors
_asyncio            _tokenize           glob                shelve
_bisect             _tracemalloc        graphlib            shlex
_blake2             _typing             gzip                shutil
_bz2                _uuid               hashlib             signal
_codecs             _warnings           heapq               site
_codecs_cn          _weakref            hmac                smtplib
_codecs_hk          _weakrefset         html                sndhdr
_codecs_iso2022     _winapi             http                socket
_codecs_jp          _wmi                idlelib             socketserver
_codecs_kr          _xxinterpchannels   imaplib             sqlite3
_codecs_tw          _xxsubinterpreters  imghdr              sre_compile
_collections        _zoneinfo           importlib           sre_constants
_collections_abc    abc                 inspect             sre_parse
_compat_pickle      aifc                io                  ssl
_compression        antigravity         ipaddress           stat
_contextvars        argparse            itertools           statistics
_csv                array               json                string
_ctypes             ast                 keyword             stringprep
_ctypes_test        asyncio             lib2to3             struct
_datetime           atexit              linecache           subprocess
_decimal            audioop             locale              sunau
_elementtree        base64              logging             symtable
_functools          bdb                 lzma                sys
_hashlib            binascii            mailbox             sysconfig
_heapq              bisect              mailcap             tabnanny
_imp                builtins            marshal             tarfile
_io                 bz2                 math                telnetlib
_json               cProfile            mimetypes           tempfile
_locale             calendar            mmap                test
_lsprof             cgi                 modulefinder        textwrap
_lzma               cgitb               msilib              this
_markupbase         chunk               msvcrt              threading
_md5                cmath               multiprocessing     time
_msi                cmd                 netrc               timeit
_multibytecodec     code                nntplib             tkinter
_multiprocessing    codecs              nt                  token
_opcode             codeop              ntpath              tokenize
_operator           collections         nturl2path          tomllib
_osx_support        colorsys            numbers             trace
_overlapped         compileall          opcode              traceback
_pickle             concurrent          operator            tracemalloc
_py_abc             configparser        optparse            tty
_pydatetime         contextlib          os                  turtle
_pydecimal          contextvars         pathlib             turtledemo
_pyio               copy                pdb                 types
_pylong             copyreg             pickle              typing
_queue              crypt               pickletools         unicodedata
_random             csv                 pip                 unittest
_sha1               ctypes              pipes               urllib
_sha2               curses              pkgutil             uu
_sha3               dataclasses         platform            uuid
_signal             datetime            plistlib            venv
_sitebuiltins       dbm                 poplib              warnings
_socket             decimal             posixpath           wave
_sqlite3            difflib             pprint              weakref
_sre                dis                 profile             webbrowser
_ssl                doctest             pstats              winreg
_stat               email               pty                 winsound
_statistics         encodings           py_compile          wsgiref
_string             ensurepip           pyclbr              xdrlib
_strptime           enum                pydoc               xml
_struct             errno               pydoc_data          xmlrpc
_symtable           faulthandler        pyexpat             xxsubtype
_testbuffer         filecmp             queue               zipapp
_testcapi           fileinput           quopri              zipfile
_testclinic         fnmatch             random              zipimport
_testconsole        fractions           re                  zlib
_testimportmultiple ftplib              reprlib             zoneinfo

Enter any module name to get more help.  Or, type "modules spam" to search
for modules whose name or summary contain the string "spam".

其实上面的输出就是 pycharm 中看到着这个目录里面的文件

该目录在 linux/mac 上会有差异,但是都大同小异,其实这个目录就在我们安装 Python 的根目录下

  • 第三方开源模块,可通过 pip install 模块名联网安装
  • 自定义模块,其实就是自己写的模块,后面会细说

模块导入和调用

        在前面我们在看标准库的时候可以看到很多并不是只是一个 .py 文件,而是有很多个文件夹,这里我们要说说这个文件夹和 .py 文件到底是什么关系,在 Python 中,一个文件夹被称为一个包(模块),一个 .py 文件其实就是一个模块(子模块)。

        理清这个关系之后我们一起来看看到底该如何导入模块到自己的代码当中吧

impot module_a    # 导入模块(这个模块可以是一个文件夹或者只是一个 .py 文件)

from module import xx    # 导入模块中的一个子模块或者函数

from module.xx.xx import xx    # 导入多层结构的模块

from module.xx.xx import xx as rename    # 导入后重命名

from module.xx.xx import *    # 导入一个模块下的所有方法,不建议使用


modlue_a.xxx    # 调用

注意:模块一旦被调用,即相当于执行了另外一个 .py 文件里的代码 

        在这里我们要解释一下为什么不建议使用 from module.xx.xx import *,我们先看看下面示例的代码

from os import *

print(name)     # 不能使用 os.name
name = "Jove"
print(name)

代码输出如下:

        从上面的代码的操作和输出结果可以看出,如果使用了  from module.xx.xx import * 这种调用方式是会少了上面提到的好处中的第二点避免函数名和变量名冲突,有一些模块会存在一些很常用的单词,例如上面代码中的 name 一样。

        除了这一点,如果调用的两个模块存在相同名字的函数也会引起冲突,最终是后导入的模块会覆盖先导入的模块,这样有可能回到不到你开发的预期。

自定义模块

        自定义模块是最简单的,我们创建一个 .py 文件,就可以把它称之为一个模块,就可以在另外一个程序里导入它,代码如下

建立一个自定义模块 my_module.py:

name = "Jove"
print("hello", name)

def say_hi(n):
    print("hi,", n)

然后在同一目录下创建一个名为 use_module.py 的文件来调用该模块:

import my_module

my_module.say_hi("jok")

 代码输出如下:

        从输出里面可以看出,只要我调用了模块就会运行模块里面的代码了。好了,现在我们学会了如何调用模块了,随着我们代码规模的不断扩大,硬盘空间开始不够了,这个时候我们决定把一部分代码迁移出去,但是发现迁移过后的代码就无法调用 my_module.py 了,这是为什么呢?在上面的自定义模块代码中提议使用加粗字体强调了是在同一目录的环境下,而在同一目录环境下就可以顺利的调用,在其他目录下并不能调用,其实这个就跟 Python 的模块查找路径有关系。

模块的查找路径

        在前面我们对为什么自己写的模块只能在当前路径下的程序里才能导入,换一个目录再导入自己的模块就抛出 ModuleNotFoundError 说找不到了,我们只要在命令行中打开 Python 来调用自己写的模块就能模拟另一个路径下调用了,错误如下图所示

        关于这一个问题我们可以从内置模块 sys 哪里得到答案,我们先看看如下代码

import sys

print(sys.path)

代码输出如下(注意:不同的电脑可能输出的不太一样):

在命令行中(在 C:\Users\Administrator 下执行 Python):

[

'',

'D:\\2_Professional Software\\Python\\Python 3.12.4\\python312.zip',

'D:\\2_Professional Software\\Python\\Python 3.12.4\\DLLs',

'D:\\2_Professional Software\\Python\\Python 3.12.4\\Lib',

'D:\\2_Professional Software\\Python\\Python 3.12.4',        # 标准库

'D:\\2_Professional Software\\Python\\Python 3.12.4\\Lib\\site-packages'        # 第三方模块库

]

在 pycharm 中:

[

'G:\\joveProject',

'G:\\joveProject',

'D:\\2_Professional Software\\Python\\PyCharm\\PyCharm 2024.2\\plugins\\python-ce\\helpers\\pycharm_display',

'D:\\2_Professional Software\\Python\\Python 3.12.4\\python312.zip',

'D:\\2_Professional Software\\Python\\Python 3.12.4\\DLLs',

'D:\\2_Professional Software\\Python\\Python 3.12.4\\Lib',

'D:\\2_Professional Software\\Python\\Python 3.12.4',

'G:\\joveProject\\venv',

'G:\\joveProject\\venv\\Lib\\site-packages',

'D:\\2_Professional Software\\Python\\PyCharm\\PyCharm 2024.2\\plugins\\python-ce\\helpers\\pycharm_matplotlib_backend',

'D:\\2_Professional Software\\Python\\PyCharm\\PyCharm 2024.2\\plugins\\python-ce\\helpers\\pycharm_plotly_backend'

]

        从输出可以看到,我这里显示了两种输出,分别是命令行和 pycharm 的,可以看到无论是数量和内容都会有不同。下面我们来说说这两个地方的输出不一样是什么原因:

  • 首先,为什么 pycharm 输出的会是那么多项呢,这是因为 pycharm 为了让软件更好用它会加入一些自定义的库,所以才会多了那么多项
  • 其次想必大家都注意到第一项的差别了,第一项其实就是当前目录的路径,pycharm 它会自己帮你把当前执行的目录的绝对路径放入到第一项中,而命令行则不会,只会显示'',而''就代表了当前目录 C:\Users\Administrator

        接下来我们来说说模块超找路径的顺序,当你导入一个模块时,Python 解释器会按照上面列表顺序去依次到每个目录下去匹配你要导入的模块名,只要在一个目录下匹配到了该模块名,就立刻导入,不再继续往后找。

注意:列表第一个元素为空,即代表当前目录,所以你自己定义的模块在当前目录会被优先导入。

        我们自己创建的模块若想在任何地方都能调用,那就得确保你的模块文件至少在模块路径的查找列表中。我们一般把自己写的模块放在一个带有“site-packages”字样的目录里,我们从网上下载安装的各种第三方的模块一般都放在这个目录。以 Windows 为例,下图为该目录的路径

在 pycharm 下:

在 Windows 下:

路径为:Python 安装的根目录\Lib\site-packages

导入后在命令行可以成功调用自己写的 my_module.py 模块了:

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

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

相关文章

react+ts+vite 别名一直爆红问题

已经配置如下代码安装了types/node import path from "path"; // https://vitejs.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {"/api": {target: "http://localhost:3000",changeOrigin: true,rewrite: (pa…

如何选择安全的谷歌浏览器插件

在数字时代,浏览器插件为我们提供了极大的便利,增强了我们的浏览体验。然而,随着便利性的增加,安全性问题也日益凸显。选择安全的谷歌浏览器插件是保障个人信息安全的重要步骤。以下是详细的教程,帮助你选择和使用安全…

81 NAT-静态NAT

一 NAT 出口方向实验 1 配置接口的IP地址 2 配置nat 静态映射 3 测试 无法ping 通 202.38.1.100 4 接口上开启静态Nat映射规则 [FW-Router-BJ-GigabitEthernet0/1]nat static enable 6 5 查看配置 [FW-Router-BJ]display nat static 6 测试 7 查看NAT 会话状态 8 静态…

Qt自定义一个圆角对话框

如何得到一个圆角对话框? 步骤: 1、继承自QDiaglog 2、去掉系统自带的边框 3、设置背景透明,不设置4个角会有多余的部分出现颜色 4、对话框内部添加1个QWidget,给这个widget设置圆角,并添加到布局中让他充满对话框 5、后续对…

Redis协议详解及其异步应用

目录 一、Redis Pipeline(管道)概述优点使用场景工作原理Pipeline 的基本操作步骤C 示例(使用 [hiredis](https://github.com/redis/hiredis) 库) 二、Redis 事务概述事务的前提事务特征(ACID 分析)WATCH 命…

【HarmonyOS】HMRouter使用详解(二)路由跳转

路由跳转 HMRouter中使用HMRouterMgr的静态方法push()和replace()来实现路由跳转。使用pop()方法来实现页面返回 push :目标页面不会替换当前页,而是插入页面栈。可以使用pop实现页面的返回操作。replace:目标页面会替换当前页,并…

西门子828d的plc一些信息记录

1、虽然是200的plc但是引入了DB的形式替代原来的V存储区。 2、用户自定义DB块范围,DB9000-DB9063,共64个DB块。 可用地址范围如上图 机床MCP483面板地址表,其它类型的面板地址自己在828d简明调试手册里查看。 如何上载828d的plc程序: 1.通…

web-105linux权限提升

rsync未授权本地覆盖 Rsync 是 linux 下一款数据备份工具,默认开启 873 端口 https://vulhub.org/#/environments/rsync/common/ 借助 Linux 默认计划任务调用/etc/cron.hourly,利用 rsync 连接覆盖 前提条件就是需要知道rsync的密码或者存在未授权 -提…

【成品设计】基于Arduino平台的物联网智能灯

《基于Arduino平台的物联网智能灯》 整体功能: 这个任务中要求实现一个物联网智能灯。实际测试环境中要求设备能够自己创建一个热点,连接这个热点后能自动弹出控制界面(强制门户)。 功能点 基础功能 (60分) 要求作品至少有2个灯…

发布-订阅模式(Publisher-Subscriber)

实际上,发布-订阅模式只是观察者模式的一个别称。 但是经过时间的沉淀,似乎他已经强大了起来,已经独立于观察者模式,成为另外一种不同的设计模式。在现在的发布订阅模式中,称为发布者的消息发送者不会将消息直接发送给…

Linux下基本指令

Linux下基本指令 登录系统输入ssh root,在后面输入ip公用地址,按下enter键,会弹出一个密码框,输入密码即可登录成功。 Xshell下Altenter全屏,再重复操作是取消全屏。 clear清理屏幕。 01. ls 指令(用来…

[红队apt]文件捆绑攻击流程

免责声明:本文用于了解攻击者攻击手法,切勿用于不法用途 前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 本文整理黑客通过文件捆绑进行攻击的流程思路 文件捆绑原理 废话只多说这一句。 1.exe和2.exe被你捆绑为3.exe。 那么你点击了3.exe就等于点…

信息安全工程师(45)入侵检测系统组成与分类

前言 入侵检测系统(IDS)是一种网络安全设备或软件,能够监控和分析网络或系统活动,以检测和响应潜在的入侵行为。 一、入侵检测系统的组成 根据互联网工程任务组(IETF)的定义,一个典型的入侵检测…

文科类考研答题规范与卷面整洁度提升:高效备考的秘诀

随着考研竞争的日益激烈,考生们为了在众多竞争者中脱颖而出,纷纷寻求提升自己的备考策略,答题规范和卷面整洁度在文科类考研中显得尤为重要,本文将从答题规范和卷面整洁度两个方面,为广大文科类考研学子提供一些建议&a…

LeetCode刷题日记之回溯算法(一)

目录 前言组合组合总和III电话号码的字母组合总结 前言 今天开始学习回溯算法啦,虽然直接递归学习的时候有涉及到回溯但是没有系统性的学习,希望博主记录的内容能够对大家有所帮助 ,一起加油吧朋友们!💪💪…

飞腾X100适配Ubuntu说明

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

实践体验密集小目标检测,以小麦麦穗颗粒为基准,基于嵌入式端超轻量级模型LeYOLO全系列【n/s/m/l】参数模型开发构建智能精准麦穗颗粒检测计数系统

对于常规的目标检测任务来说,诸如:COCO、VOC这类基础的数据场景,涌现出来了一些列性能初衷的检测模型,YOLO系列就是其中的佼佼者,不断地刷榜取得了越来越好的效果,不过这些评测指标是基于COCO、VOC这类公开…

基于Python+sqlite3实现(Web)图书管理系统

项目名称:LibraryManagementSystem 一、系统目标 使用了Python作为语言,以django为后台,sqlite3作为数据库,UI基于bootstrap的图书管理系统,模拟图书管理的真实场景,考虑客观需求,界面简洁、操作方便&…

解决Kali直接使用root用户密码ssh远程登录不上问题

一、问题描述 当我们直接使用root用户和密码ssh远程登录时(ssh rootKali主机的IP地址)直接提示“SSH服务器拒绝了密码,请再试一次”或者“Permission denied, please try again.(权限被拒绝,请重试)”信息&…

腾讯云视立方Electron 相关问题

安装相关 trtc-electron-sdk 是否兼容官方 Electron v12.0.1 版本? 兼容的,trtc-electron-sdk 没有特别依赖 elecron 自身的 SDK,所以没有相关的版本依赖。 Electron 下载慢甚至卡住不动? 当开始下载tmp-3320-1-SHASUMS256.txt-6.1.9文件…