模块概念
在计算机程序的开发过程中,随着程序代码越写越多,写在一个文件里的代码就会越来越长,越来越不容易维护。
为了让代码方便维护,我们将代码进行分类,分别放到不同的文件里。这样,所有的代码都按照一定的规则分布在各个文件里,需要使用的时候只要导入相应的文件即可。在 Python 中,这样的文件被称之为模块(Module)。
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 语句还有一种用法是 import ... as ...,比如我们觉得 other 这个模块名太长,就可以用 import other as o,相当于给 other 取了一个别名为 o,之后我们就可以使用 o 来替代 other。
拓展:数据分析常用的 pandas 和 numpy 常被简写成 pd 和 np,所以你会看到 import pandas as pd 和 import numpy as np 这样的写法。
???
另外,当我们需要同时导入多个模块时,可以用逗号隔开。比如 import a, b, c 可以同时导入 a.py、b.py 和 c.py 三个文件。
可以看到,执行 from other import pi, half 后可以直接使用 other.py 里的 pi 和 half,不再需要在前面加 other.。并且同时导入多个变量或函数时,两两之间要用逗号隔开。
需要注意的是:使用 from ... import ... 的方式导入就不能再用 模块名.变量名 和 模块名.函数名 的方式访问模块内的变量或函数了,否则代码将会报错:
眩晕警告
程序入口
为了指明某个文件是程序入口,我们可以在代码中这样写:
# xxx.py
代码块 A
if __name__ == '__main__':
代码块 B
上面代码的意思是当 __name__ 的值为 '__main__' 时执行代码块 B,那这里的 __name__ 和 '__main__' 又都是什么呢?请听我慢慢道来:
其实 __name__ 是 Python 里一个特殊的内置变量,它的值默认是模块名。而当文件被直接运行时,即通过命令行执行 python xxx.py 运行代码时,__name__ 的值会被改为 __main__。
所以我们可以根据 __name__ 的这个特性来判断模块是以导入的方式使用,还是作为程序入口文件直接运行,从而执行相对应的操作。比如只有作为程序入口执行时才运行启动程序的代码,否则什么都不做。
def bootstrap():
print('项目启动')
if __name__ == '__main__':
bootstrap()
上面这段代码只有在作为程序入口直接运行时才会自动执行 bootstrap() 启动项目,同时也提供了 bootstrap() 函数给其他模块使用。例如:
# main.py
def bootstrap():
print('项目启动')
if __name__ == '__main__':
bootstrap()
# other.py
import main
main.bootstrap()
# other.py
print('我是 other 模块')
if __name__ == '__main__':
print('我被直接运行了(other)')
# main.py
import other
print('我是 main 模块')
if __name__ == '__main__':
print('我被直接运行了(main)')
答案刮刮乐
我是 other 模块
我是 main 模块
我被直接运行了(main)
内置模块
除了我们自己写的模块之外,Python 中还内置了大量非常实用的模块。其实,我们之前的代码中就已经使用过几个内置模块了,比如 time 模块和 random 模块。
Python 的内置模块非常多,今天我们介绍几个常用的模块。废话少说,我们直接来看代码!
time 模块
# 导入time 模块
import time
# 暂停程序的执行,参数为秒
time.sleep(3) # 暂停 3 秒再执行后续代码
time.sleep() 这个方法我们在第一课就见到过,它用于暂停程序的执行,参数为秒。它可以用于防止程序执行过快,比如爬取数据时降低爬取速率防止被封等。
import time
拓展
# 获取当前时间的 Unix 时间戳
print(time.time())
# 输出:1558329240.201314
Unix 时间戳是指格林威治时间 1970 年 01 月 01 日 00 时 00 分 00 秒起至现在的总秒数。Unix 时间戳只是一个单纯不断增长的数字,所以不会存在时区等问题,全球统一,简单便捷。
拓展:在 32 位的机器上 Unix 时间戳的最大值为 2147483647,即 2038 年 1 月 19 日 03:14:07。届时所有 32 位操作系统的时间将会出错,变成 1901 年 12 月 13 日。而 64 位系统的最大值可达到 2900 亿年后的 292277026596 年 12 月 4 日 15:30:08,我们完全不必为此担忧。
Unix 时间戳对计算机来说稍微计算一下就知道现在是什么时间了,但对人类来说可读性就大打折扣了,所以还有对人类友好的 ctime() 方法:
import time
print(time.ctime())
# 输出:Mon May 20 13:14:00 2019
datetime 模块
datetime 模块包括很多函数和类,这些函数和类均用于日期和时间的解析、格式化以及计算。老师今天只给你介绍其中的几个,更多的内容等你需要时再自行探索。
# 导入 datetime 模块中的 datetime 对象
from datetime import datetime
# 获取当前时间
print(datetime.now())
# 输出:2019-05-20 13:14:00.201314
# 将 Unix 时间戳转换成时间
print(datetime.fromtimestamp(1558329240.201314))
# 输出:2019-05-20 13:14:00.201314
注意,datetime 模块里有一个同名的 datetime 类,因此我们要写成 from datetime import datetime。
datetime.now() 和 time.ctime() 类似,都是获取人类可读的时间格式,只是 datetime.now() 没有星期几的信息。
有些时候我们拿到 Unix 时间戳却不知道具体时间,可以使用 datetime.fromtimestamp() 方法来将其转换成人类可读的时间格式。
有些时候我们还要进行日期的计算,比如 5 天前是几月几号,10 天后又是几月几号等。这在 Python 中实现起来也不难,我们来看个例子:
from datetime import datetime, timedelta
print(datetime.now() - timedelta(days=5))
# 输出:2019-05-15 13:14:00.201314
timedelta() 在日期计算中很实用,上面代码中的 timedelta(days=5) 表示 5 天,用现在的时间减去 5 天就能得到 5 天前的日期。同理,如果加上 5 天就能得到 5 天后的日期了。
如果你英文还不错,这些参数对你来说肯定很简单吧!还有,timedelta() 可以支持同时传入多个参数,比如计算两个半小时前的时间:
from datetime import datetime, timedelta
print(datetime.now() - timedelta(hours=2, minutes=30))
# 输出:2019-05-20 10:44:00.201314
我去了 怎么这么多!!!!
模块这章太恶心了
明天继续QWQ
加油哦