Python学习之模块基础
模块就是程序
编写以下简单代码
print('hello python')
并将py文件保存在c盘的python(假设新建)文件下,通过pycharm的Terminal 或者windom命令窗口调出python解释器并输入以下代码
import sys
sys.path.append('c:/python')
import hello
将看到以下输出结果
hello python
用py内置函数dir演示此行代码是如何被打印的。

可以看到初次调用python解释器时会显示一个列表。当导入内置模块sys时再次调用dir()函数会发现列表中多了一个元素sys。但这并不是我们想要的,继续向下看。

当通过sys的path函数拼接出我们在c盘python文件路径后,使用import 导入hello 后 python解释器将打印我们想要的结果'hello python',至此我们再次使用dir()函数会发现此时的列表多了一个以hello命名的元素。由此推断,我们只所以能使用sys.path.append函数和打印出'hello python'是因为我们分别导入一个sys文件和hello文件。这种文件就是python中的模块,文件名就是模块名。
当我们沉浸在理解了什么是python模块时,不小心又敲了一下回车。为什么hello python不见了,难道是py解释器坏了吗?再次打开py解释器重复以上操作会发现只有当第一次import hello时候打印hello python。难道是每按一次回车就打印一次hello python吗?仔细观察代码,我们只写了一行hello python.你可能会想,那我多写几行hello python不就行了吗。试试看,会发生什么。一次性输出了多条hello python 这明显不是你想要的结果。假设你写了一个存储人事信息的系统,每来一个新同事,你都要为他写一个录入程序吗。很显然我们希望只写一次程序,当再有新同事入职时,只需要调用我们写好的程序就可以为新同事办理入职。同理,我们改善我们的代码。
def Register():
print('hello python')
在c:/python文件下替换更新后的hello.py文件。重启python解释器后会发现,按以下步骤操作后发现。hello python终于多次出现了,这就是模块中代码重用。

现在我们知道什么是模块中代码的重用。目前为止,我们只是在一个py文件中定义了一个函数。但一个真实的项目不可能把所有的代码都写在一个模块中对吧。如果你真的要这样做也不是不可以。假设这样一个场景,你写好了一套人事系统,有一天你出国旅游了,老板希望改一下系统的代码,你打电话给同事希望他能帮下忙。但你的代码是由几千甚至上万行组成的。如果你还记得待改的地方和行数,把这两个信息告诉他,他会很乐意帮你完成任务。如果你不记得这些,那你同事就需要把代码通读一遍甚至多遍。如果这样的话,我想没几个人会愿意帮你了,同事恨不得自己重写一遍代码。如果你在编码时将代码封装在多个模块中(比如 数据库连接模块ConnectDB、注册模块Register),你告诉同事你需要在数据库连接模块中把数据库A切换成数据库B。五分钟过后你接到同事的电话,告诉你改好了。这就是接下来要介绍的模块的封装和调用。
检查你的代码是作为程序运行还是被导入到别的程序
在hello1.py中编写以下代码
def hello():
print('I\'m hello1')
hello()
得到输出结果
I'm hello1
此时我们的代码是作为程序运行,并调用hello()函数输出结果,这不难理解。如果我们需要在另外一个程序hello4.py执行时调用hello3.py中的hello()函数,你会怎么做?还记得以下代码的执行过程吗?
import sys
sys.path.append('c:/python')
import hello
现在我们编写hello3.py和hello4.py
hello3.py
def hello():
print('I\'m hello3')
hello4.py
import sys
sys.path.append('E:\PythonStudy\博客专用\模块学习')
import hello3
hello3.hello()
运行hello4程序,得到想要的结果。
I'm hello3
用内置__name__变量判断程序的入口。
修改以上代码,将内置变量__name__添加到hello3中去,查看测试结果。
def hello():
print('I\'m hello3')
print('hello3 name is :', __name__)
右键执行hello3.py 输出结果如下
hello3 name is : __main__
此时右键执行hello4.py输出结果如下
hello3 name is : hello3
I'm hello3
会发现什么?相同的__name__值不一样了。在右键执行hello3和右键执行hello4时,输出的__name__变成了__main__和hello3
这就是模块名和主函数,主函数也就是程序的入口。 得出以下结论,我们在hello3中右键执行程序时程序的入口(主函数)是hello3.py输出结果 hello3 name is : __main__
,而在hello4.py中执行的入口是hello4,输出结果是 hello3 name is : hello3 在hello4.py中被引入的hello3.py的名称被作为模块名使用。此时得到一个新的关键词 __main__。
因此我们可以通过启动程序时判断哪个模块的__name__是__main__来判断程序的入口。
在hello3.py中修改以下代码
def Register():
print('注册用户')
hello4.py中修改以下代码
import sys
sys.path.append('E:\PythonStudy\博客专用\模块学习')
import hello3 if __name__=='__main__':
hello3.Register()
在hello4.py中右键运行,将会看到hello3.py中输出内容。要知道 一个复杂的程序是由很多个模块构成,模块间又互相调用。那么我们在启动程序时,程序的入口在哪。案例中我们用条件判断if __name__=='__main__':时 才开始执行注册函数,也就是程序的入口。
让程序能找到你的模块
现在我们知道,一个写好的模块被导入到其他程序后,可以通过模块名.函数名使用。被导入的前提就是要找到这个模块。下面介绍两种办法找到写好的模块。
一:同目录下模块直接导入。
二:不同目录下模块间使用sys拼接导入。
打开python解释器安装路径》lib》sit-packages文件夹,将写好的模块存放在这个文件夹后,自定模块就可以像import sys一样直接导入而不用拼接存储路径。
但是如果这样做的话,我们的安装文件夹会随着存放的自定义模块的增加而变的越来越大,我们并不想这样做。因此理想的解决办法是将模块的存放路径放在我们的python环境变量中。这样我们就可以将自定义模块存放在任何位置且不影响我们python默认安装文件夹。
三:不同目录下模块间使用pth文件引入模块(常用)
实现目标,导入父包下的模块和父包下子包的模块。 准备工作:
1:工作目录下创建父包 father_package
2:在父包下创建父模块fatherModule 并编写测试代码
def callFatherModule():
print('成功调用父包FatherPackage下的fatherModule')
3:在父包下创建子包childPackage之后在创建子包模块childModule 并编写测试代码
def callChildModule():
print('成功调用父包father_package下子包child_Package的childModule模块')
四:随便创建一个测试py文件,使用site包查看python解释器工作目录
import site
print(site.getsitepackages())
五:创建pth文件存储刚才创建的父包路径,如图使用下面的。

之后就可以在刚才的测试py文件中使用以下方法输出想要的结果。
import fatherModule #引入父级包下模块
fatherModule.callFatherModule()
from childPackage import childModule #引入父级包下包含子包模块
childModule.callChildModule()
输出结果:
成功调用父包FatherPackage下的fatherModule
成功调用父包father_package下子包child_Package的childModule模块
Python学习之模块基础的更多相关文章
- Python学习day16-模块基础
<!doctype html>day16 - 博客 figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { ...
- Python学习笔记之基础篇(-)python介绍与安装
Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...
- python学习日记(基础数据类型及其方法01)
数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...
- Python学习--Selenium模块
1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台
- Python学习--Selenium模块学习(2)
Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...
- Python学习---重点模块的学习【all】
time [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...
- Python学习day12-函数基础(2)
<!doctype html>day12博客 figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { pos ...
- Python学习day11-函数基础(1)
figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...
- Python学习课程零基础学Python
python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...
随机推荐
- selendroid之toast处理
最近发现原来处理toast的操作失效了.仔细看了下原来的API.决定用switchTo来解决.driver.switchTo().defaultContent().findElement(By.id( ...
- Sharepoint日志文件增长巨大的解决办法/缩小日志/删除日志
前段时间为公司开发部门建立了TFS平台,其中包括WSS3(MOSS07也可,但是如果不是必须,建议使用轻量级的WSS3).TFS建成之后,程序员们用起来都很满意,总监也很关注. 但是今天早上忽然发现连 ...
- 排查在 Azure 中创建新 Linux 虚拟机时遇到的 Resource Manager 部署问题
本文内容 常见问题 收集活动日志 问题:自定义映像:预配错误 问题:自定义/库/应用商店映像:分配失败 后续步骤 尝试创建新的 Azure 虚拟机 (VM) 时,遇到的常见错误是预配失败或分配失败. ...
- css Media Query详解
Media Queries详解 Media Queries直译过来就是“媒体查询”,在我们平时的Web页面中head部分常看到这样的一段代码: 1 <link href="css/re ...
- android Listview 软引用SoftReference异步加载图片
首先说一下,android系统加载大量图片系统内存溢出的3中解决方法: (1)从网络或本地加载图片的时候,只加载缩略图.这个方法的确能够少占用不少内存,可是它的致命的缺点就是,因为加载的是缩略图,所以 ...
- 「SDOI2008沙拉公主的困惑」
题目 看着有点可怕 求 \[\sum_{i=1}^{n!}[(i,m!)=1]\] 考虑一下\(m=n\)的时候的答案 非常显然就是\(\varphi(m!)\) 而如果\(n>m\) 非常显然 ...
- Android学习笔记_59_清除sdcard缓存
对于手机来说,每个软件在安装时,都会在sdcard上创建一个目录,用于缓存文件.市场上针对这些软件,统一了它的sdcard上的目录,将缓存目录存放到数据库中.如果要清理,可以根据当前应用包的名称,到数 ...
- webpack的基本配置和一些理解
最近花了两周的休息时间学习了webpack,能够可以编写自己项目所需要的配置文件,总体来说webpack是一种非常优秀的前端模块化的打包工具,非常值得花时间来研究学习. 什么是webpack,它的出现 ...
- ECMAScript6
ECMAScript6介绍 # ECMAScript 和 JavaScript 的关系是,前者是后者的规格,后者是前者的一种实现 # 有利于保证这门语言的开放性和中立性. # 标准在每年的 6 月份正 ...
- Openresty最佳案例 | 汇总
转载请标明出处: http://blog.csdn.net/forezp/article/details/78616856 本文出自方志朋的博客 目录 Openresty最佳案例 | 第1篇:Ngin ...
