• Python基础(11)_python模块之time模块、rando模块、hashlib、os模块


    一、模块

    1、什么是模块:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀

      模块的本质:模块的本质是一个py文件

    2、模块分为三类:1)内置模块;2)第三方模块;3)自定义模块

    3、使用模块的目的:

      退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。

      随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用

    4、模块的使用:通过import 调用

    示例文件:spam.py,文件名spam.py,模块名spam

     1 #spam.py
     2 print('from the spam.py')
     3 
     4 money=1000
     5 
     6 def read1():
     7     print('spam->read1->money',money)
     8 
     9 def read2():
    10     print('spam->read2 calling read')
    11     read1()
    12 
    13 def change():
    14     global money
    15     money=0

    4.1模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,它们只在模块名第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块很import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句),如下 

     1 #test.py
     2 import spam #只在第一次导入时才执行spam.py内代码,此处的显式效果是只打印一次'from the spam.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.
     3 import spam
     4 import spam
     5 import spam
     6 
     7 '''
     8 执行结果:
     9 from the spam.py
    10 '''

    我们可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。

    4.2 每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突

     1 #测试一:money与spam.money不冲突
     2 #test.py
     3 import spam 
     4 money=10
     5 print(spam.money)
     6 
     7 '''
     8 执行结果:
     9 from the spam.py
    10 1000
    11 '''
     1 #测试二:read1与spam.read1不冲突
     2 #test.py
     3 import spam
     4 def read1():
     5     print('========')
     6 spam.read1()
     7 
     8 '''
     9 执行结果:
    10 from the spam.py
    11 spam->read1->money 1000
    12 '''
     1 #测试三:执行spam.change()操作的全局变量money仍然是spam中的
     2 #test.py
     3 import spam
     4 money=1
     5 spam.change()
     6 print(money)
     7 
     8 '''
     9 执行结果:
    10 from the spam.py
    11 1
    12 '''

    总结:首次导入模块spam时会做三件事:

      1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

      2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam

      3.创建名字spam来引用该命名空间

    1.#为模块名起别名,相当于m1=1;m2=m1 
    2.import spam as sm
    3.print(sm.money)
    
    #在一行导入多个模块
    1.import sys,os,re

     

    二、常用内置模块

    1、time模块

      1、时间的表示形式    

        在Python中,通常有这三种方式来表示时间:时间戳元组(struct_time)格式化的时间字符串

        (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

        (2)格式化的时间字符串(Format String): ‘1988-03-16’

        (3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

     1 # <1> 时间戳
     2 >>> import time
     3 >>> time.time()      #--------------返回当前时间的时间戳
     4 1493136727.099066
     5 
     6 # <2> 时间字符串
     7 >>> time.strftime("%Y-%m-%d %X")
     8 '2017-04-26 00:32:18'
     9 
    10 # <3> 时间元组
    11 >>> time.localtime()
    12 time.struct_time(tm_year=2017, tm_mon=4, tm_mday=26,
    13                  tm_hour=0, tm_min=32, tm_sec=42, tm_wday=2,
    14                  tm_yday=116, tm_isdst=0)

        小结:时间戳是计算机能够识别的时间;时间字符串是人能够看懂的时间;元组则是用来操作时间的

    附:python中时间日期格式化符号

    python中时间日期格式化符号:
    %y 两位数的年份表示(00-99)
    %Y 四位数的年份表示(000-9999)
    %m 月份(01-12)
    %d 月内中的一天(0-31)
    %H 24小时制小时数(0-23)
    %I 12小时制小时数(01-12)
    %M 分钟数(00=59)
    %S 秒(00-59)
    %a 本地简化星期名称
    %A 本地完整星期名称
    %b 本地简化的月份名称
    %B 本地完整的月份名称
    %c 本地相应的日期表示和时间表示
    %j 年内的一天(001-366)
    %p 本地A.M.或P.M.的等价符
    %U 一年中的星期数(00-53)星期天为星期的开始
    %w 星期(0-6),星期天为星期的开始
    %W 一年中的星期数(00-53)星期一为星期的开始
    %x 本地相应的日期表示
    %X 本地相应的时间表示
    %Z 当前时区的名称
    %% %号本身
    

      

      2、几种时间形式的转换

        (1)

     

     1 # print(time.time())   #  仅仅是当前时间的时间戳     float型
     2 #------------------------------------------------
     3 #print(time.localtime())  #  当前时间的结构化时间对象
     4 
     5 s=time.localtime(312431212)      #  结构化时间对象         将时间戳------->结构化时间
     6 s2=time.gmtime()        #  结构化时间对象   UTC时间
     7 
     8 # print(s.tm_year)
     9 # print(s.tm_wday)
    10 #------------------------------------------------
    11 t="2012-12-12"
    12 ret=time.mktime(time.localtime())  #  将结构化时间------->时间戳
    13 print(ret)
    14 #------------------------------------------------
    15 ret2=time.strftime("%Y-%m-%d",time.localtime())  # 将结构化时间------>字符串时间
    16 print(ret2)
    17 #------------------------------------------------
    18 ret3=time.strptime("1900:03:12","%Y:%m:%d")               # 将字符串时间----->结构化时间
    19 print(ret3)

        (2)

    1 >>> time.asctime(time.localtime(312343423))
    2 'Sun Nov 25 10:03:43 1979'
    3 >>> time.ctime(312343423)
    4 'Sun Nov 25 10:03:43 1979'
    #--------------------------其他方法
    # sleep(secs)
    # 线程推迟指定的时间运行,单位为秒。

    2、random模块

      1、random模块的使用

    >>> import random
    >>> random.random()      # 大于0且小于1之间的小数
    0.7664338663654585
    
    >>> random.randint(1,5)  # 大于等于1且小于等于5之间的整数
    
    >>> random.randrange(1,3) # 大于等于1且小于3之间的整数
    
    >>> random.choice([1,'23',[4,5]])  # #1或者23或者[4,5]
    
    >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
    [[4, 5], '23']
    
    >>> random.uniform(1,3) #大于1小于3的小数
    1.6270147180533838
    
    >>> item=[1,3,5,7,9]
    >>> random.shuffle(item) # 打乱次序
    >>> item
    [5, 1, 3, 7, 9]
    
    >>> random.shuffle(item)
    >>> item
    [5, 9, 7, 1, 3]
    

      2、random模块的应用:最近生成五位数的验证码

    #练习: 随机生成五位数验证码
    def valdate_code():
        ret=""
        for i in range(5):
            num=random.randint(0,9)
            alfa=chr(random.randint(97, 122))
            alfa2=chr(random.randint(65, 90))
            s=random.choice([str(num),alfa,alfa2])
            ret=ret+s
        return ret
    
        # 思路2
        # ret=random.sample([1,2,3,4,5,6,7,8,9,0],5)
        # print(ret)
        # print(type(ret))
        # #
        # ret=''.join(ret)
        # # return ret
    
    print(valdate_code())

    3、hashlib

      1、hash:一种摘要算法 ,3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法

      2、摘要算法又称哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)
      三个特点:
        1.内容相同则hash运算结果相同,内容稍微改变则hash值则变
        2.不可逆推
        3.相同算法:无论校验多长的数据,得到的哈希值长度固定。

      3、以常见的摘要算法MD5为例,计算出一个字符串的MD5值:

    import hashlib
     
    md5 = hashlib.md5()
    md5.update('how to use md5 in python hashlib?')
    print md5.hexdigest()
    
    计算结果如下:
    d26a53750bc40b38b65a520292f69306
    

      如果数据量很大,可以分块多次调用update(),最后计算的结果是一样的:

    md5 = hashlib.md5()
    md5.update('how to use md5 in ')
    md5.update('python hashlib?')
    print md5.hexdigest()
    

      MD5是最常见的摘要算法,速度很快,生成结果是固定的128 bit字节,通常用一个32位的16进制字符串表示。另一种常见的摘要算法是SHA1,调用SHA1和调用MD5完全类似:

    import hashlib
     
    sha1 = hashlib.sha1()
    sha1.update('how to use sha1 in ')
    sha1.update('python hashlib?')
    print sha1.hexdigest()
    

      SHA1的结果是160 bit字节,通常用一个40位的16进制字符串表示。比SHA1更安全的算法是SHA256和SHA512,不过越安全的算法越慢,而且摘要长度更长。

      4、摘要算法应用

        4.1网站存储用户登录的用户名和登录密码

    username | password
    ---------+---------------------------------
    michael  | e10adc3949ba59abbe56e057f20f883e
    bob      | 878ef96e86145580c38c87f0410ad153
    alice    | 99b1c2188db85afee403b1536010c2c9
    

        4.2,防止网站数据泄露后,黑客“撞库”,对网站存储用户登录的用户名和登录密码进行“加盐”,即通过对原始口令加一个复杂字符串来实现

    hashlib.md5("abc".encode("utf8"))
    

        经过Salt处理的MD5口令,只要Salt不被黑客知道,即使用户输入简单口令,也很难通过MD5反推明文口令。

    4、os模块

      1、os模块是与操作系统交互的一个接口 

    '''
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd
    os.curdir  返回当前目录: ('.')
    os.pardir  获取当前目录的父目录字符串名:('..')
    os.makedirs('dirname1/dirname2')    可生成多层递归目录
    os.removedirs('dirname1')    若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()  删除一个文件
    os.rename("oldname","newname")  重命名文件/目录
    os.stat('path/filename')  获取文件/目录信息
    os.sep    输出操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep    输出当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep    输出用于分割文件路径的字符串 win下为;,Linux下为:
    os.name    输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
    os.system("bash command")  运行shell命令,直接显示
    os.environ  获取系统环境变量
    os.path.abspath(path)  返回path规范化的绝对路径
    os.path.split(path)  将path分割成目录和文件名二元组返回
    os.path.dirname(path)  返回path的目录。其实就是os.path.split(path)的第一个元素
    os.path.basename(path)  返回path最后的文件名。如何path以/或结尾,那么就会返回空值。即os.path.split(path)的第二个元素
    os.path.exists(path)  如果path存在,返回True;如果path不存在,返回False
    os.path.isabs(path)  如果path是绝对路径,返回True
    os.path.isfile(path)  如果path是一个存在的文件,返回True。否则返回False
    os.path.isdir(path)  如果path是一个存在的目录,则返回True。否则返回False
    os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
    os.path.getatime(path)  返回path所指向的文件或者目录的最后存取时间
    os.path.getmtime(path)  返回path所指向的文件或者目录的最后修改时间
    os.path.getsize(path) 返回path的大小
    '''
    

     

     1 os路径处理
     2 #方式一:推荐使用
     3 import os
     4 #具体应用
     5 import os,sys
     6 possible_topdir = os.path.normpath(os.path.join(
     7     os.path.abspath(__file__),
     8     os.pardir, #上一级
     9     os.pardir,
    10     os.pardir
    11 ))
    12 sys.path.insert(0,possible_topdir)
    13 
    14 
    15 #方式二:不推荐使用
    16 os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
  • 相关阅读:
    对结对编程的测试
    用例
    结对编程 一
    个人项目总结与结对编程的开始
    7-6随便写写
    7-5个人日报
    7-4个人报告
    7.1-7.3个人日报
    6-30个人日报
    6-29个人日报
  • 原文地址:https://www.cnblogs.com/hedeyong/p/7060125.html
Copyright © 2020-2023  润新知