模块简介
什么是模块?
用书里的话说:模块是最高级别的程序组织单元。这句话的意思是,模块什么都能封装
- 函数可以封装变量
- 类可以封装函数和变量
- 那么模块就是封装类、函数和变量
像我们使用pycharm每次写代码之前都要创建一个.py文件,这个文件本质上就是一个模块,我在在这个项目中也可以导入我们自己创建的模块
模块的导入和使用
比如我们先创建一个自己写的python文件-->test.py,代码如下
a = '我是模块中的变量a'
def hi():
a = '我是函数里的变量a'
print('函数“hi”已经运行!')
class Go2:
a = '我是类2中的变量a'
def do2(self):
print('函数“do2”已经运行!')
再创建一个文件,导入这个模块并输出
import test # 导入test模块
print(test.a) # 使用“模块.变量”调用模块中的变量
test.hi() # 使用“模块.函数()”调用模块中的函数
A = test.Go2() # 使用“变量 = 模块.类()”实例化模块中的类
print(A.a) # 实例化后,不再需要“模块.”
A.do2() # 实例化后,不再需要“模块.”
import语句还有一种用法是import…as…。比如我们觉得import test太长,就可以用import test as t语句,意思是为“test”取个别名为“t”
另外,当我们需要同时导入多个模块时,可以用逗号隔开。比如import a,b,c可以同时导入“a.py,b.py,c.py”三个文件
还有一种导入方式是:from...import..跟格式看上去类似,就是从某一个模块中导入一部分使用
from test import hi
hi() # 使用函数“hi”时无需加上“模块.”前缀
对于from … import …语句要注意的是,没有被写在import后面的内容,将不会被导入
如果使用了未导入部分的代码,程序将会报错
程序入口
当我们有了一大堆py文件组成一个程序的时候,为了【指明】某个py文件是程序的运行入口,我们可以在该py文件中写出这样的代码
if __name__ == '__main__' -->>就是程序的入口
#代码块 1……
if __name__ == '__main__':
#代码块 2……
- 当这个文件被直接运行时,将会执行代码块2
- 当这个文件通过import被导入到其他文件时,代码块2不会执行
模块引用
如何使用他人的模块?
比如之前用到的time模块和random模块之类的
一般情况下使用time模块,都是来作为延时的,如下代码
import time
print('第一句话,过两秒出现第二句。')
time.sleep(2)
print('第二句话。')
如何自学模块
下面以random模块为例,英文好的话可以阅读官方文档:https://docs.python.org/3.6/library/random.html
我们也可以直接进行百度
import random # 调用random模块
a = random.random() # 随机从0-1之间抽取一个小数
print(a)
a = random.randint(0,100) # 随机从0-100之间抽取一个数字
print(a)
a = random.choice('abcdefg') # 随机从字符串/列表/字典等对象中抽取一个元素(可能会重复)
print(a)
a = random.sample('abcdefg', 3) # 随机从字符串/列表/字典等对象中抽取多个不重复的元素
print(a)
items = [1, 2, 3, 4, 5, 6] # “随机洗牌”,比如打乱列表
random.shuffle(items)
print(items)
运行代码可以看到
另外,我们还可以使用dir()函数查看一个模块,看看它里面有什么变量、函数、类、类方法
看到生疏的再去百度
总结如下图
time模块的小练习,计时器
import time
input("欢迎使用“时间管理器”!请按回车继续。")
while True:
task_name = input('请输入任务名:')
task_time = int(input('你觉得自己至少可以专注这个任务多少分钟?输入 N 分钟'))
input('此次任务信息:\n我要完成的任务:%s\n我至少要专注:%d分钟\n按回车开始计时:'%(task_name,task_time))
start = time.time() # 开始计时
start_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) # 格式化日期
# 实际代码:分钟转成秒要乘60,用-1来倒计时。
# for t in range(task_time*60,0,-1):
for t in range(task_time,0,-1):
info = '请专注任务,还要保持专注 ' + str(t) + ' 秒哦!'
print(info,end="")
print("\b"*(len(info)*2),end="",flush=True)
time.sleep(1)
print('你已经专注了 %d 分钟,很棒~再加把劲,完成任务!'%task_time) # 倒计时后,才继续运行之后的代码。
# 询问任务是否完成
task_status = input('请在任务完成后按输入y:')
if task_status == 'y':
end = time.time() # 一定用户按了 y,就记下结束时间。
end_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) # 日期格式化
actual_time = int((end -start)/60) # 始末时间相减,从秒换算到分,除以60。
start_end = start_time + '——' + end_time + '\n'
with open('timelog3.txt','a', encoding = 'utf-8') as f:
f.write(task_name + ' 的预计时长为:' + str(task_time) + '分钟\n')
f.write(task_name + ' 的实际时长为:' + str(actual_time) + '分钟,具体时间为:' + start_end)
again = input('建立一个新任务请按 y, 退出时间日志记录器请按 q:')
if again == 'q':
break
else:
print('抱歉,你的输入有误。请重启时间记录器。')
print('愿被你善待的时光,予你美好的回赠。')