Python之旅的第14天(模块和包、random、time模块的引入)
课程内容开始紧张起来啦,但是讲真,今天视频教程里新换的老师废话是真的多,节奏明显不行啊,导致今天看了好久,能总结的东西却没多少。
模块和包(modue)
模块和的概念:在实际开发过程中,可能会有很多的方法函数,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
使用模块之后,代码的可维护性就大大地提高。
模块三种:Python标准库中、第三方、自定义部分
同时,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
模块的导入:
import语句:直接导入型:import 对应模块文件名
位置导入模式:from 包名 import 模块名
这个声明不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。 From…import* 语句
From…import* 语句
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。
包(package):
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。
现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,view.py模块的名字就变成了hello_django.app01.views,类似的,manage.py的模块名则是hello_django.manage。
关于昨天:if __name__ == '__main__'的
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
模块部分进行测试的引入:
bin.py中内容为:
from ceshi.ceshi1 import main main.run()
ceshi包内的ceshi1包内的main.py文件:
def run(): print('main def start') return 'main def start'
这里需要注意的是,当python执行import,导入一个模块时,其默认路径是执行语句所在路径,此时执行语句bin存在与“模块和包”子路径内,则导入main.py文件时导入路径为
from ceshi.ceshi1 import main 与执行文件在同一子目录下的文件,解释器是可以进行对应查找的。
time模块:
import time #直接获得时间戳的方法,得到自1970年1月1日零时到现在的秒数 # print(time.time()) #输出结果:1583596680.7545578 #获得当前本时区内的结构化时间 # print(time.localtime()) #输出结果:time.struct_time(tm_year=2020, tm_mon=3, tm_mday=8, tm_hour=0, tm_min=0, tm_sec=46, tm_wday=6, tm_yday=68, tm_isdst=0) #同时localtime()也是可以提供一个时间戳参数,将其转化为秒的模式 # print(time.localtime(1583596680.7545578)) #输出结果:time.struct_time(tm_year=2020, tm_mon=3, tm_mday=7, tm_hour=23, tm_min=58, tm_sec=0, tm_wday=5, tm_yday=67, tm_isdst=0) #关于gmtime,与localtime作用一样,只是输出的是格林尼治时间 #mktime,将结构化时间转换为时间戳的形式 # time1 = time.localtime(1627348349) # print(time.mktime(time1)) #最终输出结果还是传入的时间戳:1627348349.0 #将结构化的时间转换为字符串时间 # res = time.strftime('%y-%m-%d %X',time.localtime()) # print(res) #得到现在时间:20-03-08 00:07:54 #将字符串子时间重新转回结构化时间: # print(time.strptime(res,'%y-%m-%d %X')) #得到:time.struct_time(tm_year=2020, tm_mon=3, tm_mday=8, tm_hour=0, tm_min=11, tm_sec=56, tm_wday=6, tm_yday=68, tm_isdst=-1) #time.asctime(结构化时间参数)和time.ctime(时间戳) #上面两种方法都是获得系统内设定好格式的字符串时间 #不输入参数为默认现在的时间 # print(time.asctime()) #Sun Mar 8 00:14:29 2020 # print(time.ctime()) #Sun Mar 8 00:14:29 2020 #time.sleep()就不多说了
datetime模块:(就是显示当前时间的东东)
import datetime print(datetime.datetime.now()) #2020-03-08 00:17:25.004714
random模块:
import random #random.random产生0-1之间的随机浮点数 # print(random.random()) #0.5627726637846672 #random.randint(s,e) 产生s-e之间的整数,范围是s=< x =<e # print(random.randint(1,3)) #random.randrange(s,e) 产生s-e之间的整数,范围是s=< x <e,不包含e # print(random.randrange(1,3)) #random.choice(列表) 随机在列表参数总选取一个元素 # print(random.choice([1,2,3,4])) #random.sample(list,个数) 随机在列表内选取几个元素 # print(random.sample([1,2,3,4],3)) #输出结果是 [1, 3, 4] #random.shuffle(list)打乱原有列表顺序 # res = random.shuffle([1,2,3,4,5]) # print(res) #利用以上random模块的方法,实现一个产生随机验证码的函数 def yanzhengma(): res = '' for i in range(4): num = str(random.randint(0,9)) zimu = chr(random.randint(65,122)) a = random.choice([num,zimu]) res += a return res print(yanzhengma())
以上就是今天的内容了,里面关于执行路径、__name__ = '__main__'的解释还是比较绕圈圈的,没事的时候还是得回头看看,不然肯定忘的干干净净。