当前位置: 首页 > news >正文

7 Python的模块和包

概述

        在上一节,我们介绍了Python的异常处理,包括:异常、异常处理、抛出异常、用户自定义异常等内容。在这一节中,我们将介绍Python的模块和包。Python的模块(Module)和包(Package)是Python的两个主要概念,它们都是用来组织和封装代码的机制。

什么是模块

        模块实际上就是一个Python文件,它包含了Python对象定义和Python语句。文件名是模块名加上“.py”后缀,比如:如果一个文件名为my_module.py,那么它就被称为my_module模块。模块让你能够有逻辑地组织你的Python代码段,把相关的代码分配到一个模块里能让你的代码更好用、更易懂。模块能定义函数、类和变量,模块里也能包含可执行的代码。模块可以被别的程序引入,以使用该模块中的函数、类等功能。

        Python中的模块可以分为两种:内置模块和第三方模块。内置模块是Python自带的模块,比如:datetime(日期和时间处理)、math(数学运算)、random(随机数生成)等。第三方模块则是由Python社区或开发者开发的模块,在Python的官方网站上可以找到。

        使用模块的好处有很多,主要包括:提高代码复用性、代码组织结构更加清晰、降低程序耦合性、提高程序的安全性等。

导入模块

        在Python中,可以使用import语句来导入模块,这使得你可以使用其他模块中定义的函数、类和变量。导入模块时,Python会执行该模块中的所有顶层代码。如果模块本身又导入其他模块,那么这些导入的模块也会一并被执行。

# 导入os模块
import os
# 导入math模块
import math# 使用os模块中的变量
print(os.curdir)# 使用math模块中的函数
print(math.pow(2, 4))

        在上面的示例代码中,os和math都是Python提供的标准库模块。os模块提供了与操作系统交互的函数,math模块则提供了许多与数学计算相关的函数。

        如果你只想导入模块中的特定函数和变量,可以使用from import的语法。如果你想导入模块中的所有内容,可以使用from import *的语法。

# 从math模块导入log10函数
from math import log10
# 从os模块导入所有内容
from os import *# 使用math模块的log10函数
print(log10(100))
# 使用os模块的cpu_count函数
print(cpu_count())

自定义模块

        除了导入系统的内置模块,还可以创建自定义模块,并导入这个自定义模块。比如:你有一个名为my_module.py的Python文件,其中定义了一个名为为my_func的函数。

# my_module.py文件def my_func(a):print(a)

        你可以在另一个Python文件main.py中导入my_module模块,并使用该模块中的函数。

# main.py文件
import my_modulemy_module.my_func('hello CSDN')

__name__

        在Python中,__name__是一个特殊变量,用于表示一个模块的名称。当一个模块被直接运行时,__name__的值为__main__。当该模块被导入为库或者子模块时,__name__的值将是该模块的名称。

        这个变量常用于在模块中执行特定的代码,只有当该模块被直接运行时才执行。在一个模块中,可以使用if __name__ == "__main__"来确保后面的代码只在该模块被直接运行时执行,而在其他模块中被导入时则不执行。比如:有一个模块my_sky,对应的my_sky.py文件如下。

# my_sky.pydef sky_blue():print('sky blue')if __name__ == '__main__':sky_blue()

        直接运行my_sky.py时,会执行sky_blue函数并输出“sky blue”。但在另一个脚本中导入my_sky.py时,并不会执行sky_blue函数。这个特性常用于编写可执行脚本或测试脚本,只有在直接运行该脚本时,才会执行某些操作。

什么是包

        包是一个包含多个模块的目录,该目录下必须包含一个名为__init__.py的文件,该文件可以为空。包可以嵌套,即一个包可以包含多个子包。包提供了组织模块的机制,使得模块能够按照目录结构进行分类,便于管理和查找。包将相关的代码文件和资源文件打包在一起,从而形成一个独立的单元。

        Python的包可以包含:Python模块、其他包、包特定的数据文件和配置文件。

创建包

        要创建一个Python包,需要创建一个文件夹,通常以该包的名称命名,并在该文件夹中包含一个__init__.py文件。这个__init__.py文件是一个特殊的文件,当一个包被导入时,该文件会自动执行,这可以用于初始化该包或定义在该包中导出的函数和变量。包中还可以包含其他的.py文件,这些文件中包含函数、类、变量等包的特定代码。

        创建一个Python包的具体步骤如下:

        1、创建一个文件夹,作为包的根目录,并命名为包的名字,包名通常使用小写字母和下划线。

        2、在该文件夹中创建一个名为__init__.py的文件。这个文件是一个特殊的文件,当一个包被导入时,该文件会自动执行。这个文件可以是空的,也可以包含一些初始化代码,或者定义在该包中导出的函数和变量。

        3、在该文件夹中创建其他的Python文件和文件夹,用于包含包的具体代码和资源。

        4、如果需要在包的元数据中使用一些特殊的标记或者依赖项,可以在该文件夹中创建一个名为setup.py的文件,用于描述该包的元数据和依赖项。

        下面是一个简单的示例,展示了如何创建一个包含两个模块的Python包。

        1、创建一个名为my_package的文件夹,作为包的根目录。

        2、在该文件夹中创建两个Python文件,分别为module1.py和module2.py。

        3、在module1.py中定义一个名为func1的函数。

# module1.py文件
def func1():  return "Hello from module 1"

        4、在module2.py中定义一个名为func2的函数。

# module2.py文件
def func2():  return "Hello from module 2"

        5、在my_package文件夹中创建一个名为__init__.py的文件,用于导出在模块中定义的函数。

# __init__.py文件
from .module1 import func1
from .module2 import func2

        6、现在,你可以在其他Python代码中使用这个包了。

import my_package# 输出:Hello from module 1
print(my_package.func1())
# 输出:Hello from module 2
print(my_package.func2())

导入包

        要使用一个Python包,需要使用import语句来导入该包,并使用.操作符来访问该包中的函数、类和变量等。比如:有一个名为my_package的包,其中包含一个名为my_module的模块,my_module模块中包含一个名为my_func的函数,可以使用下面的示例代码来使用该包。

import my_package.my_modulemy_package.my_module.my_func()

        在Python中,导入包的具体步骤如下:

        1、确保已经将包安装到你的Python环境中,可以使用pip命令来安装包,比如:pip install package_name。

        2、使用import语句导入包,可以使用点号来指定包的路径。在下面的示例代码中,将导入package包中的module模块。

import package.module

        3、如果只想导入包中的某个模块或函数,可以使用from import语句。在下面的示例代码中,将导入package包中的module模块,并可以直接使用该模块中的函数和变量。

from package import module

        4、如果需要导入包中的多个模块或函数,可以使用逗号分隔它们。在下面的示例代码中,将导入package包中的module1、module2、func1和func2。

from package import module1, module2, func1, func2

        注意:包和模块的名称,必须与文件系统中的目录结构相对应。如果包中没有包含__init__.py文件,则不能将其视为一个包。此时,需要手动将该目录添加到Python的模块搜索路径中才能正常使用。

相关文章:

7 Python的模块和包

概述 在上一节,我们介绍了Python的异常处理,包括:异常、异常处理、抛出异常、用户自定义异常等内容。在这一节中,我们将介绍Python的模块和包。Python的模块(Module)和包(Package)是…...

【JavaWeb 篇】使用Servlet、JdbcTemplate和Durid连接池实现用户登录功能与测试

在现代Web应用程序开发中,用户登录功能是基础中的基础。它为用户提供了安全访问系统的途径。本篇博客将引导您通过使用Servlet、Spring框架的JdbcTemplate以及Durid连接池,来构建一个完整的用户登录功能。我们将详细展示每个部分的代码,并解释…...

【Unity3D赛车游戏】【六】如何在Unity中为汽车添加发动机和手动挡变速?

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…...

【Go 基础篇】切片:Go语言中的灵活数据结构

在Go语言中,切片(Slice)是一种强大且灵活的数据结构,用于管理和操作一系列元素。与数组相比,切片的大小可以动态调整,这使得它成为处理动态数据集合的理想选择。本文将围绕Go语言中切片的引入,介…...

龙芯2K1000LA移植交叉编译环境以及QT

嵌入式大赛结束了,根据这次比赛中记的凌乱的笔记,整理了一份龙芯2K1000LA的环境搭建过程,可能笔记缺少了一部分步骤或者错误,但是大致步骤可以当作参考。 一、交叉编译工具链 下载连接:龙芯 GNU 编译工具链 | 龙芯开…...

javaee spring依赖注入之spel方式

spring依赖注入之spel方式 <dependency><groupId>org.springframework</groupId><artifactId>spring-expression</artifactId><version>4.3.18.RELEASE</version></dependency>package com.test.pojo;import java.util.List; …...

【Java集合学习1】ArrayList集合学习及集合概述分析

JavaArrayList集合学习及集合学习概述 一、Java集合概述 Java 集合&#xff0c; 也叫作容器&#xff0c;主要是由两大接口派生而来&#xff1a;一个是 Collection接口&#xff0c;主要用于存放单一元素&#xff1b;另一个是 Map 接口&#xff0c;主要用于存放键值对。对于Col…...

TouchGFX之调试

DebugPrinter类是一种在显示屏上打印调试消息的简单方法&#xff0c;无需向屏幕添加控件。 在使用DebugPrinter之前&#xff0c;需要分配一个实例并将其传递给Application类&#xff0c;且DebugPrinter实例必须兼容所使用的LCD类。 该表列出了DebugPrinter类名称&#xff1a; …...

C# winform加载yolov8模型测试(附例程)

第一步&#xff1a;在NuGet中下载Yolov8.Net 第二步&#xff1a;引用 using Yolov8Net; 第三步&#xff1a;加载模型 private IPredictor yolov8 YoloV8Predictor.Create("D:\\0MyWork\\Learn\\vs2022\\yolov_onnx\\best.onnx", mylabel); 第四步&#xff1a;图…...

浙大陈越何钦铭数据结构07-图6 旅游规划

题目: 有了一张自驾旅游路线图&#xff0c;你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序&#xff0c;帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的&#xff0c;那么需要输出最便宜的一条路径。 输入…...

VUE笔记(七)项目登录

1、安装elementui 在终端执行 vue add element 注册组件 如果要使用哪个组件&#xff0c;大家需要在plugins/element.js中注册该组件 import Vue from vue import { Button } from element-ui Vue.use(Button) 在页面组件中使用 <el-button type"primary"&…...

大语言模型之六- LLM之企业私有化部署

数据安全是每个公司不得不慎重对待的&#xff0c;为了提高生产力&#xff0c;降本增效又不得不接受新技术带来的工具&#xff0c;私有化部署对于公司还是非常有吸引力的。大语言模型这一工具结合公司的数据可以大大提高公司生产率。 私有化LLM需要处理的问题 企业内私有化LLM…...

Python3 列表

Python3 列表 序列是 Python 中最基本的数据结构。 序列中的每个值都有对应的位置值&#xff0c;称之为索引&#xff0c;第一个索引是 0&#xff0c;第二个索引是 1&#xff0c;依此类推。 Python 有 6 个序列的内置类型&#xff0c;但最常见的是列表和元组。 列表都可以进…...

OpenCV基础知识(8)— 图形检测

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。图形检测是计算机视觉的一项重要功能。通过图形检测可以分析图像中可能存在的形状&#xff0c;然后对这些形状进行描绘&#xff0c;例如搜索并绘制图像的边缘&#xff0c;定位图像的位置&#xff0c;判断图像中有没有直线、…...

Java虚拟机

文章目录 JVM运行时数据区域HotSpot虚拟机对象探秘实战&#xff1a;OutOfMemoryError异常 JVM 运行时数据区域 HotSpot虚拟机对象探秘 实战&#xff1a;OutOfMemoryError异常...

c++学习 之 函数重载注意事项

文章目录 引用作为函数重载的条件函数重载遇到默认参数 引用作为函数重载的条件 #include <iostream> using namespace std; void fun(int &a) {cout << "void fun(int & a)" << endl; }void fun(const int &a) {cout << "…...

2023-08-27 LeetCode每日一题(合并区间)

2023-08-27每日一题 一、题目编号 56. 合并区间二、题目链接 点击跳转到题目位置 三、题目描述 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#…...

C#,数值计算——调适数值积分法(adaptive quadrature)的计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// 调适数值积分法 /// adaptive quadrature /// </summary> public class Adapt { private double x1 { get; } 0.942882415695480; private …...

微信小程序发布迭代版本后如何提示用户强制更新新版本

在点击小程序发布的时候选择&#xff0c;升级选项 之前用户使用过的再打开小程序页面就会弹出升级弹窗modal...

星际争霸之小霸王之小蜜蜂(七)--消失的子弹

目录 前言 一、删除子弹 二、限制子弹数量 三、继续重构代码 总结 前言 昨天我们已经让子弹飞了起来&#xff0c;但是会面临一个和之前小蜜蜂一样的问题&#xff0c;小蜜蜂的行动应该限制在窗口内&#xff0c;那么子弹也是有相同之处&#xff0c;也需要限制一个移动范围&…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

测试markdown--肇兴

day1&#xff1a; 1、去程&#xff1a;7:04 --11:32高铁 高铁右转上售票大厅2楼&#xff0c;穿过候车厅下一楼&#xff0c;上大巴车 &#xffe5;10/人 **2、到达&#xff1a;**12点多到达寨子&#xff0c;买门票&#xff0c;美团/抖音&#xff1a;&#xffe5;78人 3、中饭&a…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...