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,一经查实,立即删除!

相关文章

Python笔记 - generator方法

深入理解Python生成器(Generators) 在Python编程中,生成器(Generators)是一个非常强大且灵活的工具。它们提供了一种创建迭代器的简便方法,使得我们能够高效地处理大量数据。本文将深入探讨Python生成器&a…

【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…

chargpt: 用纯c 写一9*9数独程序

Chatgpt 真的可以写出完美的代码&#xff0c;学计算机编程没有前途。还有2天就要高考了&#xff0c;大家加油考出好成绩。但不要报编程专业了。 下面是一个完整的9x9数独求解程序&#xff0c;使用C语言实现。这个程序包括读取数独棋盘、解决数独问题并打印解决方案的功能。数独…

一篇最容易入门和经典Python库,看这篇就够了

1.NumPy 简介:用于处理大型多维数组和矩阵的库,以及一系列高级数学函数. import numpy as np a np.array([1, 2, 3, 4]) b np.array([[1, 3], [3, 4]]) print(np.dot(a, b))2.Pandas 简介:用于数据分析和操作的库,提供了主要数据结构为数据框&#xff08;DataFrame&#xf…

Python报错:AttributeError: <unknown>.DeliveryStore 获取Outlook邮箱时报错

目录 报错提示&#xff1a; 现象描述 代码解释&#xff1a; 原因分析&#xff1a; 报错提示&#xff1a; in get_outlook_email return account.DeliveryStore.DisplayName line 106, in <module> email_address get_outlook_email() 现象描述 获取outlook本地邮箱…

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

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

LightDB PLSQL介绍(第一篇)

文章目录 概述开发工具ltsql PL/SQL基础程序结构匿名块存储过程函数 数据类型 控制语句条件语句IF 条件语句CASE条件语句 循环语句简单LOOPFOR LOOPWHILE循环循环退出循环继续 循序控制 静态语句动态语句游标隐式游标隐式游标属性隐式游标的异常处理 显式游标声明显式游标打开显…

【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;给表…

pytorch学习day5

一、权值初始化 在深度学习中&#xff0c;权值初始化是神经网络训练中关键的一步。正确的权值初始化可以帮助加速收敛速度&#xff0c;提高模型的稳定性和泛化能力。在PyTorch中&#xff0c;我们可以通过torch.nn.init模块中的函数来实现不同的权值初始化方法。 1.常规初始化 P…

算法刷题笔记 判断子序列(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 给定一个长度为n的整数序列a1,a2,…,an以及一个长度为m的整数序列b1,b2,…,bm。请你判断a序列是否为b序列的子序列。子序列指序列的一部分项按原有次序排列而得的序列&#xff0c;例如序列{a1,a3,a5}是序列{a1,a2,a3,a4,a5}的一个…

MATLAB 函数 function

函数定义函数调用局部函数匿名函数函数句柄子函数函数文件的位置函数的文档函数的参数函数的返回值总结 在 MATLAB中&#xff0c;函数是一个执行特定任务的代码块&#xff0c;可以被重复调用。 MATLAB函数可以执行计算、数据操作、文件处理等任务&#xff0c;并且可以接收输入…

AI市场驱动HBM持续爆火

随着人工智能市场的蓬勃发展&#xff0c;对AI处理器的需求激增&#xff0c;内存制造巨头正积极扩大高带宽内存&#xff08;HBM&#xff09;的产能&#xff0c;并努力提高其良率和竞争力。最新的动态是美光在日本广岛县计划建设新工厂&#xff0c;旨在最早于2027年开始生产芯片和…

关于 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…

C#之位运算符

位运算符 位运算符 主要是用于数值类型计算运算方式: 将数值转换为二进制 在进行位运算返回的是一个二进制转十进制的数值如果二进制数 不够位置 则在前面补零 位与 & 符号 &#xff1a;& 链接两个数值进行运算 将数值转换为二进制 对位运算 有1则1 用法: 先将a和…

逆天面试题-

扪心自问&#xff0c;不借助第三变量实现两个变量value的交换&#xff0c;你怎么做&#xff1f; 3 2 1 看两种思路&#xff1a; 一.联想运算 不多说&#xff0c;试着去感受它的奇妙 #include<iostream> using namespace std; int main(){int a 3;int b 5;a a …