python的模块

什么是模块(Module)

在计算机程序的开发过程中,随着程序代码越写越多,写在一个文件里的代码就会越来越长,越来越不容易维护。

为了让代码方便维护,我们将代码进行分类,分别放到不同的文件里。这样,所有的代码都按照一定的规则分布在各个文件里,需要使用的时候只要导入相应的文件即可。在 Python 中,这样的文件被称之为模块(Module)。

在我们的教学环境中,其实我们每次运行代码,都是在运行一个名为 main.py 的程序文件,相当于我们在命令行中执行 python main.py 去运行 main.py 里的代码。

在我们的教学环境中,除了默认的 main.py 外,我们还可以点击右边的 + 来添加新的文件。像这样,每一个单独的 .py 文件,本质上都是一个模块。

和函数一样,模块也能提高代码复用率。就像我们把多次用到的代码块封装成函数一样,我们可以把经常用到的函数、变量等代码封装成一个模块,在需要的时候导入这个模块。

Python 提前帮我们把一些常用的函数和变量写到了内置模块中,比如数学计算中常用的开根号方法——math.sqrt() 方法,圆周率 π 的数值——math.pi 等。关于内置模块的更多知识我们下一关会学到。

最后我们来总结一下模块的作用:

导入模块

当我们需要使用模块的时候,只需使用 import 语句导入对应的模块即可。我们来看一个例子,这个例子中有两个模块,一个是 other.py 文件,另一个是 main.py 文件。

# other.py
print('带你打开编程世界的大门')# main.py
import other  # 导入 other 模块
# 输出:带你打开编程世界的大门

我们使用 import 模块名(不需要 .py 后缀)导入模块,相当于我们在 main.py 里借用并运行了 other.py 文件里的代码,因此运行结果是 带你打开编程世界的大门。你可以理解为 Python 会将 import other 语句替换成 other.py 里的代码。

其实在执行 import other 后,import other 被替换成 other.py 里的代码,main.py 里的代码就相当于下面这样:

print('hi')
print('带你打开编程世界的大门')
print('bye')

上面的代码是为了让你理解 import 的作用,其实一般模块里的代码大都是定义好的变量和函数等。我们再来看一个例子:

# other.py
pi = 3.14159265359def half(x):return x / 2# main.py
import other  # 导入 other 模块print(other.pi)
# 输出:3.14159265359print(other.half(4))
# 输出:2.0

我们可以看到,当导入模块后,要使用模块中的变量、函数,需要通过 模块名.变量名 和 模块名.函数名() 的方式。. 表明了从属关系,表示某个模块里面的某个变量或函数。

import 语句还有一种用法是 import ... as ...,比如我们觉得 other 这个模块名太长,就可以用 import other as o,相当于给 other 取了一个别名为 o,之后我们就可以使用 o 来替代 other

导入部分模块

import 语句一次性将整个模块导入进来,我们还可以使用 from ... import ... 语句只导入我们需要的变量、函数等。举个例子:

# other.py
pi = 3.14159265359def half(x):return x / 2# main.py
from other import pi, half  # 从 other 模块导入 pi 和 halfprint(pi)
# 输出:3.14159265359print(half(4))
# 输出:2.0

可以看到,执行 from other import pi, half 后可以直接使用 other.py 里的 pi 和 half,不再需要在前面加 other.。并且同时导入多个变量或函数时,两两之间要用逗号隔开。

需要注意的是:使用 from ... import ... 的方式导入就不能再用 模块名.变量名 和 模块名.函数名 的方式访问模块内的变量或函数了,否则代码将会报错:

# other.py
pi = 3.14159265359def half(x):return x / 2# main.py
from other import pi, halfprint(pi)
# 输出:3.14159265359print(other.half(4))
# 报错:NameError: name 'other' is not defined on line 6

最后我们来总结一下 from ... import ... 语句:

程序入口

当在做复杂项目的时候,我们会将代码拆分到各个模块中。这样,我们就需要一个程序入口,通过这个入口文件将整个项目的代码串联运行起来。

程序入口,指的就是你 直接运行 的那个 .py 文件。举个例子,main.py 中导入了其他的模块 other.py,接着,我们将 main.py 直接运行,这时 main.py 就是作为程序入口直接运行的,而 other.py 则是以导入的形式运行的。

程序入口的功能,是指明模块中某一段代码在何时才会被运行。如果想让 代码块 B 仅在 abc.py 作为程序入口时才能运行,那就可以在代码中这样写:

# abc.py
代码块 Aif __name__ == '__main__':代码块 B

上面代码的意思是当 __name__ 的值为 '__main__' 时执行 代码块 B,那这里的 __name__ 和 '__main__' 又都是什么呢?请听我慢慢道来:

__name__ 这个东西看起来很奇怪,但它的本质其实就是一个 变量。它是 Python 里一个特殊的内置变量,默认值是 模块名。

但当模块作为程序入口时,__name__ 的值会被改为 '__main__',总结对比一下:

如果 abc.py 以导入的方式被运行,那 abc.py 中的 __name__ 值就是 'abc';
如果 abc.py 被直接运行,那 abc.py 中 __name__ 的值会被改为 '__main__'。
注意:__name__ 和 '__main__' 前后都是两个下划线哦~

所以我们可以根据 __name__ 的这个特性来判断模块是以导入的方式使用,还是作为程序入口文件直接运行,从而执行相对应的操作。比如只有作为程序入口执行时才运行启动程序的代码,否则什么都不做。

def bootstrap():print('项目启动')if __name__ == '__main__':bootstrap()

上面这段代码只有在作为程序入口直接运行时才会自动执行 bootstrap(),打印出 项目启动

我们来看个例子加深一下理解。main.py 和 other.py 的内容如下,先不要看结果,根据上面的讲解猜猜看,直接运行 main.py 时会打印出什么。

# other.py
print('我是 other 模块')if __name__ == '__main__':print('other 模块被直接运行了')# main.py
import otherprint('我是 main 模块')if __name__ == '__main__':print('main 模块被直接运行了')

先不要看答案,先想想会输出什么呢??

代码输出如下,你猜对了吗?

我是 other 模块

我是 main 模块

main 模块被直接运行了

跟着我来逐行理解一下吧。我们直接运行了 main.py,第一行代码 import other 导入了 other.py 模块。

other.py 是以导入的方式被运行的,它并不是程序入口,所以,print('other 模块被直接运行了') 这行代码不会执行。屏幕上只会打印出 我是 other 模块

导入 other.py 后,接下来就是运行 main.py 中的代码啦。main.py 是程序入口,所以 print('main 模块被直接运行了') 这句代码会被执行。屏幕上逐行打印出 我是 main 模块 和 main 模块被直接运行了 这两句话。

现在是不是清晰很多了呢?如果还有哪里不明白,可以再回顾一下前面的讲解,好好理解一下哦~

本章练习题:

鸡兔同笼

鸡兔同笼问题是《孙子算经》中的经典题目,也是小学奥数题里的常客。

原书中是这么描述的:“今有雉兔同笼,上有三十五头,下有九十四足,问雉兔各几何?”

翻译成现代汉语就是:“鸡和兔放在一个笼子里,笼子里共有 35 个头,94 个爪,那鸡和兔各有多少只?”

请你根据下面的要求,用 Python 来完成这道数学题,和它一起“奥数”:

  1. 在 solution.py 中建立函数 calculate(),该函数能算出鸡和兔分别的数量;
  2. 在主程序 main.py 中导入函数 calculate(),根据题干中的“总头数”和“总脚数”输出问题的答案。
# main.py
# 请补全代码,导入 solution 模块
from solution import calculate
# 下面是老师写好的目标输出格式,请不要更改哦
# 多返回值函数返回的是【元组】,字符串格式化输出中,% 后跟的也是【元组】
# 
print('笼中有兔%d只,有鸡%d只' % calculate(35, 94))# solution.py
def calculate(head,foot):# 总数量不等于35# for i in range(head):# 假设i是兔,j是鸡,那么总头数 - 兔数 = 鸡数#   j = head - i# 如果4 * 兔数 + 2 * 鸡数 = 总足数#   if 4*i + 2*j == foot:#     return i,j# 方法二# 循环兔子数量for i in range(1,35):# 循环鸡的数量for j in range(1,35):if j * 2 + i * 4 == 94 and i + j == 35:return i,j# 输出结果为:「笼中有兔12只,有鸡23只」

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

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

相关文章

【OpenHarmony】ArkTS 语法基础 ④ ( ArkTS UI 渲染控制 | if else 条件渲染 | ForEach 循环渲染 )

文章目录 一、ArkTS UI 渲染控制1、if else 条件渲染2、ForEach 循环渲染 二、完整代码示例1、自定义组件代码2、主界面代码3、执行结果 参考文档 : <HarmonyOS第一课>ArkTS开发语言介绍 一、ArkTS UI 渲染控制 1、if else 条件渲染 在 Component 自定义组件 中的 build …

⌈ 传知代码 ⌋ 预测人物性别年龄

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

Javascript 数据类型详解:7种基本类型、3种引用类型

还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#xff0c;webgl&#xff0c;ech…

【CesiumJS入门】(12)Vite+Vue3+Cesium 简易安装与配置

步骤 vite 创建项目&#xff1a;yarn create vite安装 Cesium&#xff1a;yarn add cesium安装 vite-plugin-static-copy&#xff1a;yarn add -D vite-plugin-static-copy 配置 vite.config.js &#xff1a; import { defineConfig } from "vite"; import vue fro…

制作自己的 ButterKnife(使用 AutoService 和 APT 注解处理器在编译期生成 Java 代码)

ButterKnife 开发过 Android 的肯定都知道曾经有这么一个库&#xff0c;它能够让你不用再写 findViewById 这样的代码&#xff0c;这就是大名鼎鼎的 ButterKnife&#xff08;https://github.com/JakeWharton/butterknife&#xff09;。虽然现在这个库已经不再维护&#xff0c;…

LabVIEW实现汽车逆变器功能测试系统

​介绍了如何利用LabVIEW开发汽车逆变器&#xff08;包括功率板和控制板&#xff09;的自动测试设备&#xff08;ATE&#xff09;&#xff0c;实现对额定800V电压、300A电流的逆变器进行功能测试。系统通过CAN2.0通讯协议&#xff0c;实现电机控制、温度传感器监测、电压校验和…

Java程序策——Java连接数据库保姆级教程(超详细步骤)

【Java程序策】——连接数据库 目录 ​编辑 一&#xff1a;在数据库中建立一个表&#xff08;student表&#xff09; 1.1&#xff1a;进入mysql 1.2&#xff1a;建立一个“数据库成员” 1.3&#xff1a;建立一个表&#xff08;student表&#xff09; 1.4&#xff1a;给表…

关于 spring boot 的目录详解和配置文件

目录 配置文件 spring boot 的配置文件有两种格式&#xff0c;分别是 properties 和 yml&#xff08;yaml&#xff09;。这两种格式的配置文件是可以同时存在的&#xff0c;此时会以 properties 的文件为主&#xff0c;但一般都是使用同一种格式的。 格式 properties 语法格…

36. 【Java教程】输入输出流

本小节将会介绍基本输入输出的 Java 标准类&#xff0c;通过本小节的学习&#xff0c;你将了解到什么是输入和输入&#xff0c;什么是流&#xff1b;输入输出流的应用场景&#xff0c;File类的使用&#xff0c;什么是文件&#xff0c;Java 提供的输入输出流相关 API 等内容。 1…

eNSP学习——OSPF的DR与BDR

目录 相关命令 原理概述 实验内容 实验目的 实验拓扑 实验编址 实验步骤 1、基本配置 2、搭建基本的OSPF网络 3、查看默认情况下的DR/BDR状态 4、根据现网需求影响DR/BDR选举 需要eNSP各种配置命令的点击链接自取&#xff1a;华为&#xff45;NSP各种设备配置命令大…

小白级教程—安装Ubuntu 20.04 LTS服务器

下载 本教程将使用20.04版进行教学 由于官方速度可能有点慢&#xff0c;可以下方的使用清华镜像下载 https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/ 点击20.24版本 选择 ubuntu-20.04.6-live-server-amd64.iso 新建虚拟机 下载好后 我们使用 VMware 打开它 这里选…

数组的详细介绍

数组是一组相同类型元素的集合&#xff0c;也就是说&#xff1a;数组至少包含两个及以上的元素&#xff0c;且元素类型相同。 数组包括一维数组和多维数组&#xff0c;其中二维数组最常见。下面我们一一介绍。 一维数组&#xff1a; 格式&#xff1a;type name [常量值]&…

2024开放式耳机怎么买才好?这里可以教你六招!

有不少人都在说“开放式蓝牙耳机无音质”&#xff0c;大多数的购买者往往既贪恋蓝牙耳机的便携性&#xff0c;又想要有线耳机的Hifi快感&#xff0c;对于我们来说最重要的就是确定预算和需求&#xff0c;这样才能定位到最适合自己的开放式蓝牙耳机。这么多年零零总总听下来的蓝…

【python】成功解决“ModuleNotFoundError: No module named ‘IPython’”错误的全面指南

成功解决“ModuleNotFoundError: No module named IPython’”错误的全面指南 一、引言 在Python编程中&#xff0c;ModuleNotFoundError是一种常见的错误类型&#xff0c;它通常表明Python解释器无法找到你试图导入的模块。特别是当你遇到“ModuleNotFoundError: No module…

求助!什么软件可以人声分离?手机上可以进行人声分离操作吗?

在数字时代&#xff0c;音频处理变得越来越重要&#xff0c;而人声分离技术则是其中的一项关键技术。很多人可能都有过这样的疑问&#xff1a;什么软件可以实现人声分离&#xff1f;手机上能否进行人声分离操作&#xff1f;今天&#xff0c;我们就来为大家解答这些问题&#xf…

MySql学习(一)——MySQL概述之MySQL的启动

文章目录 一、MySQl概述1.1 启动MySQL1.2 客户端连接1.3 关系型数据库1.4 总结 一、MySQl概述 数据库&#xff1a;存储数据的仓库&#xff0c;数据是有组织的进行存储&#xff0c;简称为&#xff08;DB&#xff09;数据库管理系统&#xff1a;操纵和管理数据库的大型软件&…

微型计算机公司 Raspberry Pi 也开始涉足人工智能领域,计划出售AI芯片

Raspberry Pi 与 Hailo 合作&#xff0c;为其微型计算机提供可选的 AI 插件。 随着AI热潮的持续&#xff0c;就连微型计算机公司Raspberry Pi也计划出售AI芯片。它与 Raspberry Pi 的相机软件集成&#xff0c;可以在微型计算机上本地运行聊天机器人等基于人工智能的应用程序。…

Maven实战: 创建自定义archetype

在手动创建SpringBoot应用中&#xff0c;我们讲过手动创建SpringBoot工程是比较麻烦的&#xff0c;尤其是公司内部不有自定义扩展和集成的情况下。利用Maven的archetype:generate能基于项目模板生成功能&#xff0c;自定义模板能让整个创建过程自动化&#xff0c;这样既能大大降…

【UML用户指南】-07-对基本结构建模-公共机制

目录 1、术语和概念 1.1、注解&#xff08;note&#xff09; 1.2、修饰 1.3、衍型 1.4、标记值 1.5、约束 1.6、标准元素 1.7、外廓&#xff08;profile&#xff09; 2、对新特性建模 3、对新语义建模 注解 &#xff08;note&#xff09;是附加在元素或元素集上用来表…

ICLR24大模型提示(2/11) | BatchPrompt:多样本批量提示事半功倍

【摘要】由于大型语言模型 (LLM) 的 token 限制不断增加&#xff0c;使得长上下文成为输入&#xff0c;使用单个数据样本进行提示可能不再是一种有效的方式。提高效率的一个直接策略是在 token 限制内对数据进行批处理&#xff08;例如&#xff0c;gpt-3.5-turbo 为 8k&#xf…