2020-08-09 模块

【什么是模块】

之前我们已经学过,类可以封装方法和属性,就像这样:

用书里的话说:模块是最高级别的程序组织单元。这句话的意思是,模块什么都能封装,就像这样:

在模块中,我们不但可以直接存放变量,还能存放函数,还能存放类。

更独特的是,定义变量需要用赋值语句,封装函数需要用def语句,封装类需要用class语句,但封装模块不需要任何语句。

之所以不用任何语句,是因为每一份单独的Python代码文件(后缀名是.py的文件)就是一个单独的模块

如果你使用过vscodepycharm等编程工具编写python程序,每次都需要先创建一个后缀名为.py的Python程序文件,才能运行程序:

在平时的课堂教学中,其实我们每次运行的代码,本质上都是在运行一个名为main.py的程序文件:(只不过被隐藏在了终端里)

像这样:每一个单独的py文件,本质上都是一个模块

封装模块的目的也是为了把程序代码和数据存放起来以便再次利用。如果封装成类和函数,主要还是便于自己调用,但封装了模块,我们不仅能自己使用,文件的方式也很容易共享给其他人使用。

所以,我们使用模块主要有两种方式,一种是自己建立模块并使用,另外一种是使用他人共享的模块。

【使用自己的模块】

建立模块,其实就是在主程序的py文件中,使用import语句导入其他py文件

是不是发现main.py文件借用并运行了test.py文件里的代码了?这就是import语句起作用了。

模块相关的常用语句主要有3个,我们接下来一个个来看。

【import语句】

我们使用import语句导入一个模块,最主要的目的并不是运行模块中的执行语句,而是为了利用模块中已经封装好的变量、函数、类

再来看一个案例。

麻雀虽小,五脏俱全。这段代码中基本上展现了所有的调用方式

现在我们要做的是把这段代码拆分成两个模块,把封装好的变量、函数、类,放到test.py文件中,把执行相关的语句放到main.py文件中。

你是否注意到,当我们导入模块后,要使用模块中的变量、函数、类,需要在使用时加上模块.的格式。

到这里,我们来做个练习。下面有一段代码:

请你把这段代码拆分到两个模块中,其中执行语句放到main.py文件,封装好的变量、函数和类放到story.py文件。

import语句还有一种用法是import…as…。比如我们觉得import story太长,就可以用import story as s语句,意思是为“story”取个别名为“s”

上面的案例中,main.py文件可以写成这样:

另外,当我们需要同时导入多个模块时,可以用逗号隔开。比如import a,b,c可以同时导入“a.py,b.py,c.py”三个文件。

【from … import … 语句】

from … import …语句可以让你从模块中导入一个指定的部分到当前模块。

我们来看一个例子:

当我们需要从模块中同时导入多个指定内容,也可以用逗号隔开,写成from xx模块 import a,b,c的形式。我们再看一个小案例。

对于from … import …语句要注意的是,没有被写在import后面的内容,将不会被导入

比如以下代码将会报错,因为使用了没有被导入的函数:

当我们需要从模块中指定所有内容直接使用时,可以写成【from xx模块 import *】的形式,*代表“模块中所有的变量、函数、类”,我们再运行一个小案例。

*不过,一般情况下,我们不要为了图方便直接使用【from xx模块 import *】的形式。

这是因为,模块.xx的调用形式能通过阅读代码一眼看出是在调用模块中的变量/函数/方法,而去掉模块.后代码就不是那么直观了。

再来做一个练习:

题目要求:在main.py文件导入story模块,将类Temple的属性'庙里有个老和尚,'打印出来。

*要直接使用Temple类的属性,我们需要在导入的时候指定Temple不能直接指定类属性)。

【if __name__ == '__main__'】

先给大家讲解一个概念“程序的入口”。

对于Python和其他许多编程语言来说,程序都要有一个运行入口

在Python中,当我们在运行某一个py文件,就能启动程序 ——— 这个py文件就是程序的运行入口

拿我们刚才的课堂练习为例:

更复杂的情况,我们也可以运行一个主模块,然后层层导入其他模块:

但是,当我们有了一大堆py文件组成一个程序的时候,为了【指明】某个py文件是程序的运行入口,我们可以在该py文件中写出这样的代码:

这里的【if __name__ == '__main__'】就相当于是 Python 模拟的程序入口。Python 本身并没有规定这么写,这是一种程序员达成共识的编码习惯。

第一种情况:加上这句话后,程序运行效果不会变化,我们来试试:

我们解释了“当xx.py文件被直接运行时,代码块②将被运行”,再解释一下“xx.py文件作为模块是被其他程序导入时,代码块②不被运行。”

我们来运行体验两段代码。这是第一段:

第一段代码没有使用if __name__ == '__main__',所有语句都会被运行

这是第二段:(如果你运行A.py文件,看到运行结果什么都没有,那就是对的)

现在我们运行代码的时候,会发现if __name__ == '__main__'下的语句不会被执行。这是因为B.py文件并不是我们现在的程序运行入口,它是被A.py文件导入的。

关于这一个点目前你只需有个印象即可。

【使用他人的模块】

在之前的项目实操中,我们常常用到这样的语句:

这两个例子中的第一句代码import timeimport random其实就是在导入timerandom模块。

【初探借用模块】

time模块和random模块是Python的系统内置模块,也就是说Python安装后就准备好了这些模块供你使用。

此外,Python作为一门胶水语言,一个强大的优势就是它拥有许多第三方的模块可以直接拿来使用。

如果是第三方编写的模块,我们需要先从Python的资源管理库下载安装相关的模块文件

下载安装的方式是打开终端,Windows用户输入pip install + 模块名;苹果电脑输入:pip3 install + 模块名,点击enter即可。(需要预装python解释器pip

比如说,爬虫时我们会需要用到requests这个是具有相关功能模块的集合),就需要在终端输入pip3 install requests(Mac用户)的指令。

第三方模块的使用我们会在之后的其他课程具体介绍,今天我们主要来学习Python的内置模块

如果内置模块是用Python语言编写的话,就能找到py文件

我们用命令random.__file__找出了random模块的文件路径,就可以去打开查看它的代码。

由于代码太长,我们就不展示了。不过可以看到,random模块的源代码是这样的结构:

我们熟悉的函数random.choice(list),功能是列表中随机抽取一个元素并返回。它的代码被找到了:

另一个熟悉的函数random.randint(a,b),功能是在a到b的范围随机抽取一个整数。它的代码也被找到了:

像这样,通过阅读源代码我们能找到所有能够使用的变量、函数、类方法。

虽然你可以通过看源代码的方式来理解这个模块的功能。但如果你想要高效地学会使用一个模块,看源代码并不是最佳选项。我们接着谈谈“如何自学模块”。

【如何自学模块】

学习模块的核心是搞清楚模块的功能,也就是模块中的函数类方法有什么作用,以及具体使用案例长什么样。

用自学“random”模块为例,如果英文好的同学,可以直接阅读官方文档:9.6. random — Generate pseudo-random numbers — Python 3.6.11 documentation

或者也可以直接百度搜索:

搜到教程后,我们重点关注的是模块中的函数类方法有什么作用,然后把使用案例做成笔记(还记得第8关谈到的如何做学习笔记么?)。

例如random模块的关键知识(也就是比较有用的函数和类方法),可以做成这样的笔记:

另外,我们还可以使用dir()函数查看一个模块,看看它里面有什么变量、函数、类、类方法

这就像是查户口一样,可以把模块中的函数(函数和类方法)一览无余地暴露出来。对于查到的结果"__xx__"结构的(如__doc__),它们是系统相关的函数,我们不用理会,直接看全英文的函数名即可。

这样查询的好处是便于我们继续搜索完成自学。比如我们在列表中看到一个单词“seed”,我们就可以搜一搜random.seed的用法:


甚至不是模块,我们也可以用这种方式自学:dir(x),可以查询到x相关的函数,x可以是模块,也可以是任意一种对象

再次总结一下模块的学习方法,其实可以归纳成三个问题:

这里想提醒大家的是,比较小的模块(比如random模块)可以通过这样的方式自学,大型模块的学习就比较困难(除非你有充足的专业背景知识)。

例如数据分析需要用到pandasNumPy模块,网页开发要用到Django模块等等,这些大型模块最好还是在课程上系统学习,避免散乱的学习形不成知识体系

以目前大家的水平来说,有一些很实用,又不难学的模块,已经足够我们探索了。在今天的最后,我想手把手带大家自学一个模块。

【学习csv模块】

之所以教大家这个模块,是因为这个模块既简单又实用。

csv是一种文件格式,你可以把它理解成“简易版excel”。学会了csv模块,你就可以用程序处理简单的电子表格了。

如果要手动新建csv文件,我们可以先新建一个excel表格,然后选择另存为“csv”格式即可。

同样的,当我们有了一张csv格式的表格,我们也可以选择另存为“excel”格式。

下面继续学习如何用csv模块读写csv文件

我们使用import语句导入csv模块,然后用dir()函数看看它里面有什么东西:

同时,我们可以搜索到csv模块的官方英文教程:

https://docs.python.org/3.6/library/csv.html

中文教程:https://yiyibooks.cn/xx/python_352/library/csv.html#module-csv

如果你要通过阅读这份教程来学习csv模块的话,最简单的方式是先看案例(拉到教程的最后),遇到看不懂的函数,再倒回来查具体使用细节。

现在我们也跟着案例动手试试如何读取csv文件,可见open()后面跟了两个参数,用csv.reader(文件变量)创建一个reader对象。

我们新建了一个名为test.csv的文件,里面的内容是这样:

我们可以看到,终端输出的每一行信息都是一个列表

我们来做一个练习,下面有一个csv文件:

试试把它的每一行打印出来吧:

接下来我们来看如何往csv格式文件写入数据。

写入数据的方式是这样的:

创建一个变量名为writer(也可以是其他名字)的实例,创建方式是writer = csv.writer(x),然后使用writer.writerow(列表)就可以给csv文件写入一行列表中的内容。

另外关于open函数的参数,也就是图中的'a',我们来复习一下:

我们来做一个练习,还是这个商品列表的csv文件:

你来试试用writerow()方法为它追加写入两行列表吧:['4', '猫砂', '25', '1022', '886']['5', '猫罐头', '18', '2234', '3121']

到这里,最基本的csv表格读取和录入方法我们就已经学会了。csv模块虽然比random模块稍微复杂一点点,但按照模块三问(这模块有哪些函数可用?有哪些属性或方法可用?使用格式是什么?)的学习方式,我们一样可以学会它的基本用法。

后面的两个实操项目,我们会展示如何应用csv模块的相关知识。

【总结】

学完了模块,所有的基础知识你也学习完毕了。从今天起,你已经不再是一个麻瓜了。

之于编程的魔法世界,你已经能看明白这个世界的构造,懂得学习的方法和进阶的路径,我们称之为初窥门径。

再往后你需要的只是想明白自己想去这个世界的哪个地方——是网络爬虫,是数据分析,还是图像识别?然后,去付出时间和努力。

这是我们当下的仰望星空,但并非终点。如果你肯把头抬得更高,你还能看到另一片更广阔的天地,是开源精神培育的热土。

Python的模块正是开源精神的一块块切片。在网络上也有很多优秀的开发者在分享着自己的代码。他们不计辛劳,不计报酬的付出,只是单纯地为了思想的碰撞,为了帮助其他人提高效率,共同推动互联网进步发展。

这就是开源精神,这就是黑客文化,整个互联网世界最为宝贵的财富,没有之一。

你要知道,软件也好模块也好,它们并非生来即开源。在最早时期,在编程世界,充斥着不附带源代码的付费软件——也就是说,你只能使用你购买的软件,但并不能去学习它、修改它。

这就意味着,“魔法”的奥秘始终掌握在一小部分人手中,他们凭此获得巨大的商业利益。自由软件(开源)运动就是在这个时期开始的,有那么一批人,他们信奉自由、平等、共享。他们认为只有软件是开源的,才能让每个人的效率都得到提升。

不然,每个人都在重复地造轮子(也就是不借用其他人的代码,所有代码都要自己写一遍),编程世界绝不会如今日这般繁荣。

推荐一部纪录片——《互联网之子》,讲述的是一个我很崇敬的程序员——亚伦·斯沃茨为了开源精神“献身”的故事,有兴趣的同学可以找来看看。

所以你看到了吗?编程世界它严谨但绝非枯燥,它有着一个非常崇高的精神内核——关乎自由,平等,共享,利他主义

这是一件在人类历史上前所未有的事:曾有许多伟大人物构想过这样的社会结构,并为此做出努力,但都是不具备现实意义的乌托邦。

仰望星空到这一步的人,常会在心底埋下一颗种子:期望有一天,也能自己做出一些漂亮的轮子,给他人使用。

希望这颗种子在你心里有一天也能生根、发芽、开花、结果,让开源精神延绵不绝。

【课后练习】

练习目标:

我们会通过今天的作业,了解Python的一个内置模块“time模块”的更多用法。 

练习要求:

在课堂上,我们见过了同样是内置模块的“csv模块”在数据处理方面的强大之处。

而这个练习,我们会和我们的老朋友“time模块”打交道,了解它的更多用法。

下面会先看一个没用模块的“时间记录器”,再借两个网址的知识,对其升级。

【一个没用模块的“时间记录器”】

请运行右侧的代码,并读懂代码中的每一行。

涉及知识:判断、循环、文件读写等。

【为“时间记录器”加上time模块】

只要我们想通过编程做到更多的事,就避不开主动了解更多知识。

所以,这次的练习,想将主动权更多地交在大家手里。

请你通过搜索和自学,了解并运用下面两个新知识:

time模块中的时间戳(可进行日期运算)和格式化日期(可将日期转换成平常我们所见的格式);

倒计时的功能怎么用print()函数实现,属于之前没有讲过的方法,需要去搜索新的知识。

Python 日期和时间 | 菜鸟教程

怎么用Python的print在一行中打印(计时器功能)-百度经验

你可能感兴趣的:(2020-08-09 模块)