第十五章 模块
本章我们继续精简笔记~
15.1~3 什么是模块、为什么使用模块、与函数的区别
(1)模块(module)就是包含在一个更大程序中的一部分代码。
(2)模块的好处有:使文件更小、更易读;需要使用相同功能的时候不用再次从头写;最重要的是,模块化意味着我们可以使用不同的组合来完成不同的任务。
(3)模块与函数的区别:
函数就像一块块积木,模块就像一个个积木桶。
15.4 如何创建模块
创建模块非常简单,如下面这个例子,将这个文件命名为“my_module.py”并保存:
小结:要创建一个模块,只需保存好相应的py文件。
15.5 如何使用模块
我们在同一文件夹的另一个程序中使用my_module:
(1)首先,我们使用import关键词告诉Python要使用的模块名:
(2)运行后却发现报错,程序不能识别c_to_f方法:
(3)怎么办?这是因为我们定义函数的时候,需要更加准确。解决方法之一是将上面报错的代码,改为:
fahrenheit = my_module.c_to_f(celsius)
这样便能正常工作了。
15.6 命名空间
(1)什么是命名空间?
我们先看一个例子:假如第一中学的一年1班有个人叫张三,2班也有个人叫张三。我们在1班,当我们说“我们班的张三”的时候,知道指的不是2班的那个人;如果我们想说另一个人,就会表述为“2班的那个张三”。换种说法,在1班的这个空间里,只有一个张三(1号),所以1班就是张三(1号)的命名空间;同理,2班是张三(2号)的命名空间。
所以,当一中的校长要叫张三同学时,ta不能直呼其名,而必须加上命名空间的前缀,如“一班的张三”;或者ta也可以来到命名空间(1班)里,直接叫张三出来,这样就不存在混淆。
一般来说,程序员会把较小的命名空间(如一间教室)叫做局部命名空间;将较大的命名空间(如整间学校)叫做全局命名空间。
(2)如何导入命名空间?
我们再看第二个例子:一中没有人叫李四,但这校长偏要找一个叫“李四”的人过来。这时,二中由于有交流活动,一年一班的同学合并进来,里面恰好有个人叫李四,这时候校长便可找到李四了。
二中的一年一班就像另一个命名空间,导入了模块,就相当于导入了命名空间,里面所有的变量、函数及对象,都可以被访问了。
用Python来理解上述行为是这样的:
1. 首先导入二中一班的模块,顺便把命名空间也导入:import ErzhongYinianyiban
2. 执行校长呼叫程序:call_to_office(ErzhongYinianyiban.Lisi)
(3)用from导入命名空间
另外,我们还有一种方法,成为“校长亲自到班级叫同学的方法”,或者简单记为from方法,例子如下:
from ErzhongYinianyiban import Lisi
⬆️感觉挺像自然语言的。要是想叫上全部的学生,可以用*代替李四的位置:
from ErzhongYinianyiban import *
但用星号时要注意,假如二中一班跟一中有学生同名,那就麻烦啦。
目前为止,命名空间这一块我们理解就好了,比较深入的知识还待日后掌握~
15.7 标准模块
学到这里,还有个重大的好消息——Python提供了许多标准模块,它们组合成了标准库。有些标准模块是预装好的,有些开源的模块需要自己下载。下面我们来学习几个标准模块:
(1)time
time模块可以获取计算机的时钟信息,里面的sleep方法可以为程序增加延迟,如:
或者我们可以使用from方法:
(2)随机数
random模块用于生成随机数,在游戏和仿真中非常有用。下面在交互模式中使用random模块:
注意到上面是产生整数,我们可以使用random.random()方法产生0~1的小数。如果我们需要0~10或0~100的随机小数,可以在后面乘以相应的倍数:
你学到了什么?
(1)什么是模块、如何创建模块和在另一程序中使用模块
(2)什么是命名空间、局部和全局命名空间
(3)如何把其他模块的变量包含到自己的命名空间中
练习题
(1)编写一个模块,包含把十三章的“大写字母打印名字”函数,然后导入模块并调用函数。
(2)编写一个小程序,让c_to_f导入到主程序的命名空间里,从而可以写
fahrenheit = c_to_f(celsius),而不用写
fahrenheit = my_module.c_to_f(celsius):
解答:要导入函数到主程序的命名空间里,可以使用from的两种方法:
1️⃣from my_module import c_to_f
2️⃣from my_module import *
(3)编写一个小程序,隔三秒钟生成1到10之间的10个随机小数列表,并打印出来:
小结
经过函数、对象等大boss的“洗礼”,这一章显得简单许多,不过难关还在后头,毕竟模块更多的作用是将前面的大boss打包好,这一章只是学习模块的一些特性。继续加油吧~