【Python模块】

Python模块是一个包含Python定义和语句的文件。

  • 模块可以定义函数、类和变量。 模块也可以包含可执行的代码。
  • 一个模块就是一个包含Python代码的文件,文件后缀是.py。
  • 模块可以被其他程序引入(import),以使用该模块中的函数等功能。这也是使用Python标准库的方法。

一、Python模块的作用

1、代码重用:

模块的主要目的是提供代码重用。将一组相关的函数和类组织到一个模块中,在需要的地方导入并使用这个模块。

2. 组织代码:

通过模块化,将复杂的程序分解为多个更小、更易于管理的部分。有助于提高代码的可读性和可维护性。

3. 扩展Python功能:

Python的强大功能部分归功于其丰富的标准库和大量的第三方库。这些库都是以模块的形式提供的,它们可以扩展Python的基本功能,使其能够处理各种复杂的任务。

二、导入模块的方式

使用import语句来导入一个模块,使得模块中的函数、类和变量可以在你的代码中使用。

1 导入整个模块

import math  # 使用模块中的函数  
print(math.sqrt(16))  # 输出:4.0

2 导入模块并为其指定别名

若模块名较长或者可能与你的代码中的其他部分发生冲突,可为模块指定一个别名。
import math as m  # 使用别名来访问模块中的函数  
print(m.sqrt(16))  # 输出:4.0

3 从模块中导入特定的函数或变量

from math import sqrt  # 直接使用函数  
print(sqrt(16))  # 输出:4.0

4 从模块中导入多个特定的函数或变量

from math import sqrt, pow  # 直接使用这些函数  
print(sqrt(16))  # 输出:4.0  
print(pow(2, 3))  # 输出:8.0

5 导入模块中的所有内容(不推荐)

使用from module import *可以导入模块中的所有内容,但这通常不是一个好的做法,因为它可能导致命名冲突,使得代码难以理解和维护。

from math import *  # 可以直接使用模块中的所有函数和变量,但不建议这样做  
print(sqrt(16))  # 输出:4.0  
print(pi)  # 输出:3.141592653589793

6 导入自定义模块

如果你有一个自定义的Python模块(即一个.py文件),你可以像导入标准库模块一样导入它。只需确保自定义模块的文件名(不包括.py后缀)是有效的Python标识符,并且该文件位于Python可以搜索的路径中。通常,这意味着它应该在你的脚本所在的同一目录下,或者在Python的site-packages目录中。

例如,如果你有一个名为sum1.py的文件,并且它位于你的脚本所在的同一目录中,你可以这样导入它:

#sum1.py模块def sum1(var1,var2):total = var1+var2print("输出两数之和:",total)return total

在同一目录的另外一个function1.py里进行导入使用:

import sum1
sum1.sum1(2,3) # 输出两数之和: 5

一个模块只会被导入一次,不管你执行了多少次import。这样可以防止导入模块被一遍又一遍地执行。

注意:
Python解释器会按照特定的搜索路径来查找模块。如果你遇到“ModuleNotFoundError”,那么可能是因为模块不在搜索路径中。你可以通过修改sys.path或者将模块移动到合适的位置来解决这个问题。

三、命名空间和作用域

变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。

一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。

每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。

(1)Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。

(2)如果要给函数内的全局变量赋值,必须使用 global 语句。global Var 的表达式会告诉 Python, Var 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。

示例:

number = 100
def num():# 想改正代码就取消以下注释:#global numbernumber = number + 1print(number)
num()
print(number)

运行结果:

UnboundLocalError: cannot access local variable 'number' where it is not associated with a value

全局命名空间定一个了一个全局变量number ,在函数内给number 赋值,python会认为number 是一个局部变量。但我们并没有声明一个局部变量number ,所以会报错:UnboundLocalError。此时只需要在函数内声明:global number。表示number第一个全局变量。
打开 函数内的global number,运行结果:

100
101

四、模块中的函数使用

1、dir()函数

dir() 函数一个排好序的字符串列表,内容是一个模块里定义过的名字。
返回的列表容纳了在一个模块里定义的所有模块,变量和函数。

# 导入内置math模块
import math
content = dir(math)
print(content)

运行结果:

['__doc__', '__loader__', '__name__', '__package__', '__spec__', 'acos', 'acosh', 
'asin', 'asinh', 'atan', 'atan2', 'atanh', 'cbrt', 'ceil', 'comb', 'copysign', 
'cos', 'cosh', 'degrees', 'dist', 'e', 'erf', 'erfc', 'exp', 'exp2', 'expm1','fabs', 'factorial', 'floor', 'fmod', 'frexp', 'fsum', 'gamma', 'gcd', 'hypot','inf', 'isclose', 'isfinite', 'isinf', 'isnan', 'isqrt', 'lcm', 'ldexp', 'lgamma', 'log', 'log10', 'log1p', 'log2', 'modf', 'nan', 'nextafter','perm', 'pi', 'pow', 'prod', 'radians', 'remainder', 'sin', 'sinh','sqrt', 'sumprod', 'tan', 'tanh', 'tau', 'trunc', 'ulp']

2、globals() 和 locals() 函数

globals() 和 locals() 是 Python 中的内置函数,它们分别用于返回当前全局和局部符号表的字典。全局符号表包含了所有的全局变量,而局部符号表包含了当前作用域中的局部变量。

globals()示例

print("-----全局变量------")
# 定义一些全局变量
global_var1 = "Hello"
global_var2 = 42def show_globals():# 打印全局变量for name, value in globals().items():if name.startswith('global_var'):  # 只显示以 'global_var' 开头的全局变量print(f"{name} = {value}")# 调用函数以查看全局变量
show_globals()# 修改全局变量
global_var1 = "大山很山"
global_var2 = 18# 再次调用函数以查看修改后的全局变量
show_globals()

运行结果:

-----全局变量------
global_var1 = Hello
global_var2 = 42
global_var1 = 大山很山
global_var2 = 18

locals()示例

print("-----局部变量------")
def show_locals(x, y):# 定义一个局部变量local_var = "I'm a local variable"# 在函数内部调用 locals()print("Locals inside the function:")for name, value in locals().items():print(f"{name} = {value}")# 访问函数参数print(f"Function parameters: x = {x}, y = {y}")# 调用函数
show_locals(10, 20)

运行结果:

-----局部变量------
Locals inside the function:
x = 10
y = 20
local_var = I'm a local variable
Function parameters: x = 10, y = 20

五、Python中的包

在Python中,包(package)是一个包含多个模块的目录,即一个分层次的文件目录结构。它允许你组织代码,将相关的模块分组在一起,并且提供了一个命名空间来避免命名冲突。包还可以包含子包,这样你可以创建复杂的代码组织结构。

简单来说,包就是文件夹,但该文件夹下必须存在 init.py 文件, 该文件的内容可以为空。init.py 用于标识当前文件夹是一个包。

1、创建包

  • 创建一个目录,该目录的名称将成为包的名称。
  • 在该目录中,创建一个__init__.py文件(这个文件可以是空的,但它告诉Python这个目录应该被视为一个包)。
  • 在该目录中,添加你的模块文件(即.py文件)。
    示例;
    要求:
    创建一个名为mypackage的包,其中包含两个模块:module1.py和module2.py。目录结构如下:
mypackage/  __init__.py  module1.py  module2.py

2、使用包

要使用包中的模块,你需要导入它们。这可以通过使用import语句,并指定包的名称和模块名称来完成。

import mypackage.module1  # 使用mypackage.module1中的函数或变量  
mypackage.module1.some_function()

如果你想从包中导入特定的函数或变量,可以使用from … import …语句:

from mypackage.module1 import some_function  # 直接使用函数,不需要前缀  
some_function()

3、init.py 文件的作用

init.py 文件对于包来说非常重要,即使它是空的。
它告诉Python这个目录是一个包,而不是一个普通的目录。

此外,init.py 文件还可以用来初始化包的状态,或者定义__all__变量来指定当使用from package import *时应该导入哪些模块或变量。
例如,在__init__.py文件中,你可以这样定义__all__:

# __init__.py  __all__ = ['module1', 'module2']

然后,当其他代码使用from mypackage import *时,只会导入module1和module2。

4、嵌套包

包也可以包含子包。子包就是包内部的另一个包。例如:

mypackage/  __init__.py  submodule/  __init__.py  submodule1.py  submodule2.py  module1.py  module2.py
在这个例子中,submodule是mypackage的一个子包,它包含自己的模块。
你可以通过import语句访问这些子模块,如import mypackage.submodule.submodule1。

注意事项

  • 包应该有一个清晰、描述性的名称,以避免与其他包冲突。
  • 避免循环导入,即包或模块之间相互导入对方,这会导致难以追踪的错误
  • 使用相对导入时要小心,确保你的导入语句与你的包结构相匹配。

包是Python中组织大型项目代码的关键工具,它们帮助你将代码分解为可管理的部分,并提供了一种方式来避免命名冲突和重复代码。

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

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

相关文章

【JAVA】Springboot集成Proguard完成jar包混淆

目录 一、需求背景 二、具体实现 一、需求背景 某些情况下需要将jar包交付给第三方,担心第三方会将代码进行反编译,故需要将jar包进行处理。 jar包源码混淆工具有多种,但真正能投入使用的产品并不多。 比如 ClassFinal (ClassFinal: Jav…

三星工厂突发大火···  | 百能云芯

据韩媒报道,三星SDI位于韩国京畿道龙仁市基兴区的器兴工厂发生火灾。火灾发生在当地时间周四下午15:37左右,持续约20分钟后被扑灭。 幸运的是,此次火灾并未造成人员伤亡,但火场附近的一些帐篷已经被烧毁。消防部门目前正在调查火灾…

Windows 11 安装 WSL2

一、 概述 之前公司的服务器版本一直是ubuntu 16.04,然后再拉取新项目代码时编译报错找不到GLIBCXX_3.4.22 查看版本:strings /usr/lib/x86_64-linux-gnu/libstdc.so.6 | grep GLIBC ubuntu 16.04版本太低,更换20.04版本,所以就…

【JDBC编程】Java连接MySQL的五个步骤

目录 JDBC编程 1.JDBC的使用 2.数据库连接Connection 3.Statement对象 4.ResultSet对象 JDBC编程 JDBC编程运用了MySQL提供的 Java 的驱动包 mysql-connector-java ,需要基于 Java 操作 MySQL 即需要该驱动包。同样的, 要基于 Java 操作 Oracle 数据库…

5.1.7.1、【AI技术新纪元:Spring AI解码】Mistral AI函数调用

Mistral AI函数调用 Mistral AI允许您用Java自定义函数注册到MistralAiChatClient,并由Mistral AI模型智能选择输出一个包含调用一个或多个注册函数的参数的JSON对象。这允许您将LLM功能与外部工具和API连接。mistral_small_latest和mistral_large_latest模型经过训练,能够检…

demo版多人聊天系统

目录 ​编辑 一,引入 二,在Server端修改的代码 1,保存用户信息功能实现 2,拼接消息 3,广播消息 三, Client端要修改的代码 四,效果演示 一,引入 在上一篇文章udp网络服务器中&a…

MySQL索引优化

示例 CREATE TABLE employees (id int(11) NOT NULL AUTO_INCREMENT,name varchar(24) NOT NULL DEFAULT COMMENT 姓名,age int(11) NOT NULL DEFAULT 0 COMMENT 年龄,position varchar(20) NOT NULL DEFAULT COMMENT 职位,hire_time timestamp NOT NULL DEFAULT CURRENT_TI…

PyTorch深度学习:如何提升遥感影像的地物分类精度?

我国高分辨率对地观测系统重大专项已全面启动,高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成,将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB,遥感大数据时…

【算法杂货铺】分治

目录 🌈前言🌈 📁 快速排序 📂75. 颜色分类 - 力扣(LeetCode) 📂 912. 排序数组 - 力扣(LeetCode) 📂 215. 数组中的第K个最大元素 - 力扣(Lee…

力扣由浅至深 每日一题.10 最后一个单词的长度

日子都是崭新的,我们下一章见 ——24.3.21 最后一个单词的长度 给你一个字符串 s,由若干单词组成,单词前后…

突然发现!原来微信批量自动加好友这么简单!

你知道如何更好地管理和利用微信资源,实现客户拓展和沟通吗?下面就教大家一招,帮助大家实现统一管理多个微信号以及批量自动加好友。 想要统一管理多个微信号,不妨试试微信管理系统,不仅可以多个微信号同时登录&#…

数据分析概述、Conda环境搭建及JupyterLab的搭建

1. 数据分析职责概述 当今世界对信息技术的依赖程度在不断加深,每天都会有大量的数据产生,我们经常会感到数据越来越多,但是要从中发现有价值的信息却越来越难。这里所说的信息,可以理解为对数据集处理之后的结果,是从…

【Selenium(五)】

一、鼠标事件 from selenium import webdriver # 导入ActionChains类进行鼠标悬停操作 from selenium.webdriver.common.action_chains import ActionChains import time# 打开一个浏览器 # 法一、添加环境变量重启电脑 # 法二、填写浏览器驱动的绝对路径 driver webdriver.E…

vue中v-if和v-show的区别

手段:v-if是动态的向DOM树内添加或者删除DOM元素;v-show是通过设置DOM元素的display样式属性控制显隐;编译过程:v-if切换有一个局部编译/卸载的过程,切换过程中合适地销毁和重建内部的事件监听和子组件;v-s…

ARM IHI0069F GIC architecture specification (3)

1.2 术语 本手册中的架构描述使用与 Armv8 架构相同的术语。 有关此术语的更多信息,请参阅 Arm 架构参考手册 Armv8 A 部分的介绍,了解 Armv8-A 架构配置文件。 此外,在适当的情况下使用 AArch64 系统寄存器名称,而不是同时列出 A…

位运算算法

文章目录 预备知识判断字符是否唯⼀丢失的数字两整数之和只出现⼀次的数字只出现⼀次的数字II消失的两个数字 预备知识 给一个数n,确定它的二进制表示中的第x位是0还是1 (n>>(x-1)) & 1 1 true是1,false是0 将一个数n的二进制表示的第x位修改成1 n | (1<<(x-1…

vmare17 安装不可启动的iso镜像系统

由于要测试一个软件&#xff0c;要安装一个Windows11_InsiderPreview_Client_x64_zh-cn_26058.iso 于是在虚拟机里捣鼓一下。但是这个iso好像不能直接启动 这样就无法直接安装了&#xff0c;怎么办呢&#xff0c;可以先用个pe系统引导进去&#xff0c;再在PE系统里安装这个iso…

实验4 词向量训练

必做题: 数据准备:数据集包含100个文件,每个文件里面有多个从维基百科上爬取的内容,每一条以字典形式保存,分为id,url,title,text四个字段,使用text字段的文本训练词向量。读取‘text’字段的文本,并使用jieba进行分词。使用Gensim工具训练词向量,训练方法为Skip-gr…

【链表】Leetcode 23. 合并 K 个升序链表【困难】

合并 K 个升序链表 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表。 示例 1&#xff1a; 输入&#xff1a;lists [[1,4,5],[1,3,4],[2,6]] 输出&#xff1a;[1,1,2,3,4,4,5,6] 解释&#xff1…

【免费】如何考取《鲸鸿动能广告初级优化师》认证(详细教程)

鲸鸿动能广告初级优化师认证考试PC网址 初级&#xff1a;鲸鸿动能广告初级优化师认证-华为开发者学堂 (huawei.com) 注&#xff1a;免费认证&#xff0c;里面包含免费的课程&#xff0c;浏览器用Edge。 文章目录 鲸鸿动能广告初级优化师认证考试网址 前言 一、备考流程 二…