python的模块

news2024/11/17 3:34:13

什么是模块(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.14159265359

def half(x):
  return x / 2

# main.py
import other  # 导入 other 模块

print(other.pi)
# 输出:3.14159265359

print(other.half(4))
# 输出:2.0

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

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

导入部分模块

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

# other.py
pi = 3.14159265359

def half(x):
  return x / 2

# main.py
from other import pi, half  # 从 other 模块导入 pi 和 half

print(pi)
# 输出:3.14159265359

print(half(4))
# 输出:2.0

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

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

# other.py
pi = 3.14159265359

def half(x):
  return x / 2

# main.py
from other import pi, half

print(pi)
# 输出:3.14159265359

print(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
代码块 A

if __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 other

print('我是 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.coloradmin.cn/o/1788575.html

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

相关文章

Xcode中给UIView在xib中添加可视化的属性

给UIView在xib中添加可视化的属性 效果如下图&#xff1a; 可以直接设置view 的 borderColor 、borderWidth、cornerRadius&#xff0c;也可以单独指定view的某个角是圆角。减少了代码中的属性。 完整代码&#xff1a; UIViewBorder.h #import <UIKit/UIKit.h>inter…

Python - 深度学习系列38 重塑实体识别5-预测并行化改造

说明 在重塑实体识别4中梳理了数据流&#xff0c;然后我发现pipeline的串行效率太低了&#xff0c;所以做了并行化改造。里面还是有不少坑的&#xff0c;记录一下。 内容 1 pipeline 官方的pipeline看起来的确是比较好用的&#xff0c;主要是实现了比较好的数据预处理。因为…

【全网唯一】触摸精灵iOS版纯离线本地文字识别插件

目的 触摸精灵iOS是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。但触摸精灵的图色功能比较单一&#xff0c;无法识别屏幕上的图像&#xff0c;根据图像的变化自动执行相应的操作。本篇文章主要…

电脑没电关机,wsl和docker又挂了,附解决过程

如题&#xff0c;开了个会没带笔记本电源&#xff0c;点啊弄关机后docker打不开&#xff0c;我以为是docker坏了&#xff0c;结果docker报错&#xff1a; An unexpected error occurred while executing a WSL command. Either shut down WSL down with wsl --shutdown, and/or…

day32--Spring(一)

一、Spring简介 1 Spring课程介绍 问题导入 我们为什么要学习Spring框架&#xff1f; 1.1 为什么要学 Spring技术是JavaEE开发必备技能&#xff0c;企业开发技术选型命中率>90% 专业角度 简化开发&#xff0c;降低企业级开发的复杂性框架整合&#xff0c;高效整合其他技…

概率分布、回归分析、假设检验……用 DolphinDB 函数库快速实现概率统计分析

在金融和物联网等领域&#xff0c;概率统计与分析扮演着至关重要的角色。DolphinDB 作为一款强大的时序数据库&#xff0c;提供了一系列内置的概率统计与分析函数&#xff0c;能够满足用户的各种需求。 金融领域 风险管理&#xff1a;通过概率统计分析&#xff0c;金融机构可…

python数据分析——逻辑回归

参考资料&#xff1a;活用pandas库 逻辑回归 当响应变量为二值响应变量时&#xff0c;经常使用逻辑回归对数据建模。 # 导入pandas库 import pandas as pd # 导入数据集 acspd.read_csv(r"...\data\acs_ny.csv") # 展示数据列 print(acs.columns) # 展示数据集 pri…

进程间通信(27000字超详解)

&#x1f30e;进程间通信 文章目录&#xff1a; 进程间通信 进程间通信简介       进程间通信目的       初识进程间通信       进程间通信的分类 匿名管道通信       认识管道       匿名管道       匿名管道测试       管道的四种…

免费,Scratch蓝桥杯比赛历年真题--第15届蓝桥杯STEMA真题-2024年3月份(含答案解析和代码)

第15届蓝桥杯STEMA真题-2024年3月份 一、单选题 答案&#xff1a;D 解析&#xff1a;y坐标正值表示上&#xff0c;负值表示下&#xff0c;故答案为D。 答案&#xff1a;C 解析&#xff1a;18<25为真&#xff0c;或关系表示一真即为真&#xff0c;故答案为C。 答案&#xff…

2024蓝桥杯初赛决赛pwn题全解

蓝桥杯初赛决赛pwn题解 初赛第一题第二题 决赛getting_startedbabyheap 初赛 第一题 有system函数&#xff0c;并且能在bss上读入字符 而且存在栈溢出&#xff0c;只要过掉check函数即可 check函数中&#xff0c;主要是对system常规获取权限的参数&#xff0c;进行了过滤&…

linux部署运维3——centos7下导入导出mysql数据库的sql文件以及查询数据量最大的表信息

在实际项目开发或者项目运维过程中&#xff0c;数据库的导入导出操作比较频繁&#xff0c;如果可以借助第三方工具那当然算喜事一桩&#xff1b;但是如果不允许外部访问&#xff0c;那么就只能使用数据库自带的命令&#xff0c;也是相当方便的。 一.导入sql文件 1.在linux命令…

Asp.Net Core 实现分片下载的最简单方式

技术群里的朋友遇到了这个问题&#xff0c;起初的原因是他对文件增加了一个属性配置 fileResult.EnableRangeProcessing true;这个属性我从未遇到过&#xff0c;然后&#xff0c;去F1查看这个属性的描述信息也依然少的可怜&#xff0c;只有简单的描述为(获取或设置为 启用范围…

CCIG 2024:大模型技术及其前沿应用论坛深度解析

一、CCIG论坛介绍 中国图象图形大会&#xff08;CCIG 2024&#xff09;是一场备受瞩目的学术盛会&#xff0c;近期在陕西省西安市曲江国际会议中心举行。这次会议以“图聚智生&#xff0c;象合慧成”为主题&#xff0c;由中国图象图形学学会主办&#xff0c;旨在汇聚图像图形领…

一篇文章讲透数据结构之树and二叉树

一.树 1.1树的定义 树是一种非线性的数据结构&#xff0c;它是有n个有限结点组成的一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根在上&#xff0c;叶在下的。 在树中有一个特殊的结点&#xff0c;称为根结点&#xff0c;根结点…

从0开始制作微信小程序

目录 前言 正文 需要事先准备的 需要事先掌握的 什么是uniapp 平台应用的分类方式 什么是TypeScript 创建项目 项目文件作用 源码地址 尾声 &#x1f52d; Hi,I’m Pleasure1234&#x1f331; I’m currently learning Vue.js,SpringBoot,Computer Security and so on.&#x1…

大数据之CDH对Hdfs做Balance数据均衡/数据平衡/数据倾斜

问题的来源: 由于在hive工具运行sql,出现sql卡顿的情况,去cdh上查看yarn资源的分布情况,发现了整个cdh平台中hdfs和yarn资源分布不均匀,大量的爆红显示: 以下 DataNode 数据目录 位于小于其可用空间 10.0 吉字节 的文件系统中。 /data1/dfs/dn&#xff08;可用&#xff1a;7.2 …

(九)Spring教程——ApplicationContext中Bean的生命周期

1.前言 ApplicationContext中Bean的生命周期和BeanFactory中的生命周期类似&#xff0c;不同的是&#xff0c;如果Bean实现了org.springframework.context.ApplicationContextAware接口&#xff0c;则会增加一个调用该接口方法setApplicationContext()的步骤。 此外&#xff0c…

气膜建筑的施工对周边环境影响大吗?—轻空间

随着城市化进程的加快&#xff0c;建筑行业的快速发展也带来了环境问题。噪音、灰尘和建筑废料等对周边居民生活和生态环境造成了不小的影响。因此&#xff0c;选择一种环保高效的施工方式变得尤为重要。气膜建筑作为一种新兴的建筑形式&#xff0c;其施工过程对周边环境的影响…

python——网络编程

流程图 面向连接的套接字 面向连接的通信提供序列化的、可靠的和不重复的数据交付&#xff0c;而没有记录边界。主要的协议是传输控制协议&#xff08;TCP&#xff09;; TCP套接字&#xff0c;在python中&#xff0c;必须使用SOCK_STREAM作为套接字类型 tcp的特点 面向连接…

工业机器视觉系统如何实现精准检测?

机器视觉系统是指利用机器替代人眼做出各种测量和判断。一种比较复杂的系统。大多数系统监控对象都是运动物体&#xff0c;系统与运动物体的匹配和协调动作尤为重要&#xff0c;所以给系统各部分的动作时间和处理速度带来了严格的要求。在某些应用领域&#xff0c;例如机器人、…