模块就是程序

编写以下简单代码

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学习之模块基础的更多相关文章

  1. Python学习day16-模块基础

    <!doctype html>day16 - 博客 figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { ...

  2. Python学习笔记之基础篇(-)python介绍与安装

    Python学习笔记之基础篇(-)初识python Python的理念:崇尚优美.清晰.简单,是一个优秀并广泛使用的语言. python的历史: 1989年,为了打发圣诞节假期,作者Guido开始写P ...

  3. python学习日记(基础数据类型及其方法01)

    数字 int 主要是用于计算的,常用的方法有一种 #既十进制数值用二进制表示时,最少使用的位数i = 3#3的ASCII为:0000 0011,即两位 s = i.bit_length() print ...

  4. Python学习--Selenium模块

    1. Python学习--Selenium模块介绍(1) 2.Python学习--Selenium模块学习(2) 其他: 1. Python学习--打码平台

  5. Python学习--Selenium模块学习(2)

    Selenium的基本操作 获取浏览器驱动寻找方式 1. 通过手动指定浏览器驱动路径2. 通过 `$PATH`环境变量找寻浏览器驱动 可参考Python学习--Selenium模块简单介绍(1) 控制 ...

  6. Python学习---重点模块的学习【all】

    time     [时间模块] import time # print(help(time)) # time模块的帮助 print(time.time()) # 时间戳 print(time.cloc ...

  7. Python学习day12-函数基础(2)

    <!doctype html>day12博客 figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { pos ...

  8. Python学习day11-函数基础(1)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  9. Python学习课程零基础学Python

    python学习课程,零基础Python初学者应该怎么去学习Python语言编程?python学习路线这里了解一下吧.想python学习课程?学习路线网免费下载海量python教程,上班族也能在家自学 ...

随机推荐

  1. blog test

    try my first blog by cnblog. i will record my learn experence in the future.

  2. C语言 scanf函数

    #include <stdio.h> void test1() { // 1.提示用户输入数据 printf("请输入一个整数:"); // 2.接收用户输入的数据 i ...

  3. EXCRT

    是个好东西,可以处理在模数不互质的同余方程组 核心就是用扩欧来合并方程 如果我们有两个形如\(x\equiv b_1(mod\ a_1)\) \(x\equiv b_2(mod\ a_2)\)的方程我 ...

  4. where are you going ? 反序为:going you are where

    一个反序小算法,就是首尾替换,生成新的反序后的数组

  5. HashMap的工作原理-hashcode和equals原理的再次深入

    前言 首先再次强调hashcode (==)和equals的真正含义(我记得以前有人会说,equals是判断对象内容,hashcode是判断是否相等之类): equals:是否同一个对象实例.注意,是 ...

  6. MyBatis的settings设置描述

    settings 中的设置是非常关键的,它们会改变 MyBatis 的运行时行为.下表描述了设置中各项的意图.默认值等. 设置参数 描述 有效值 默认值 cacheEnabled 该配置影响的所有映射 ...

  7. Blog 使用Jsoup解析出html中的img元素

    Jsoup主页:http://jsoup.org/ 在Blog.java 加入 private List<String> imageList=new LinkedList<Strin ...

  8. Jquery 1.8全选反选删除选中项实现

    JQuery1.6以后,Prop的出现,让1.6以下的全选反选效果全部失效了.以下是修正后的版本: 全选反选效果: $(".checkbox").click(function () ...

  9. Entity Framework 五

    连接情景中的CRUD操作: 连接场景中的CRUD操作是一项相当简单的任务,因为默认情况下,上下文会自动跟踪实体在其生命周期中发生的更改,前提是AutoDetectChangesEnabled为true ...

  10. Angularjs实例4

    <!DOCTYPE html><html lang="zh-cn" ng-app=""><head><meta htt ...