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__'的解释还是比较绕圈圈的,没事的时候还是得回头看看,不然肯定忘的干干净净。

 

  

 

posted @ 2020-03-08 00:32  崆峒山肖大侠  阅读(270)  评论(0编辑  收藏  举报