zoukankan      html  css  js  c++  java
  • python基础之常用模块以及格式化输出

    模块简介

      模块,用一砣代码实现了某个功能的代码集合。 

    类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。

    如:os 是系统相关的模块;file是文件操作相关的模块

    模块分为三种:自定义模块、第三方模块、内置模块,下边简单介绍一些常用模块

    #_*_coding:utf-8_*_

    import time
    import datetime
     
    print(time.clock()) #返回处理器时间,3.3开始已废弃
    print(time.process_time()) #返回处理器时间,3.3开始已废弃
    print(time.time()) #返回当前系统时间戳
    print(time.ctime()) #输出Tue Jan 26 18:23:48 2016 ,当前系统时间
    print(time.ctime(time.time()-86640)) #将时间戳转为字符串格式
    print(time.gmtime(time.time()-86640)) #将时间戳转换成struct_time格式
    print(time.localtime(time.time()-86640)) #将时间戳转换成struct_time格式,但返回 的本地时间
    print(time.mktime(time.localtime())) #与time.localtime()功能相反,将struct_time格式转回成时间戳格式
    #time.sleep(4) #sleep
    print(time.strftime("%Y-%m-%d %H:%M:%S",time.gmtime()) ) #将struct_time格式转成指定的字符串格式
    print(time.strptime("2016-01-28","%Y-%m-%d") ) #将字符串格式转换成struct_time格式
     
    #datetime module
     
    print(datetime.date.today()) #输出格式 2016-01-26
    print(datetime.date.fromtimestamp(time.time()-864400) ) #2016-01-16 将时间戳转成日期格式
    current_time = datetime.datetime.now() #
    print(current_time) #输出2016-01-26 19:04:30.335935
    print(current_time.timetuple()) #返回struct_time格式
     
    #datetime.replace([year[, month[, day[, hour[, minute[, second[, microsecond[, tzinfo]]]]]]]])
    print(current_time.replace(2014,9,12)) #输出2014-09-12 19:06:24.074900,返回当前时间,但指定的值将被替换
     
    str_to_date = datetime.datetime.strptime("21/11/06 16:30""%d/%m/%y %H:%M"#将字符串转换成日期格式
    new_date = datetime.datetime.now() + datetime.timedelta(days=10#比现在加10天
    new_date = datetime.datetime.now() + datetime.timedelta(days=-10#比现在减10天
    new_date = datetime.datetime.now() + datetime.timedelta(hours=-10#比现在减10小时
    new_date = datetime.datetime.now() + datetime.timedelta(seconds=120#比现在+120s
    print(new_date)

      time模块,time.sleep,让程序运行的时候停止一段时间,默认为秒,,下图就是先输出123,停顿5秒之后输出456

    import time
    print("123")
    time.sleep(5)
    print("456")
    123
    456

      time.time,时间戳,表示从1970(unix的诞生时间)到现在过了多少秒

    import time
    print(time.time())
    1466052658.7172651

       time.ctime返回当前日期的字符串格式

    import time
    print(time.ctime())
    Thu Jun 16 12:57:07 2016

      还可以将时间戳改为此格式

    import time
    print(time.ctime(time.time()))
    Thu Jun 16 13:00:59 2016

       gmtime,将年,月,日等时间日期分割成一个对象,可以单独打印调用等

    import time
    a = time.gmtime(time.time())
    print(a)
    print(a.tm_year)
    time.struct_time(tm_year=2016, tm_mon=6, tm_mday=16, tm_hour=5, tm_min=8, tm_sec=19, tm_wday=3, tm_yday=168, tm_isdst=0)
    2016

       sys模块相关操作

    sys.argv           命令行参数List,第一个元素是程序本身路径

    sys.exit(n)        退出程序,正常退出时exit(0)
    sys.version        获取Python解释程序的版本信息
    sys.maxint         最大的Int
    sys.path           返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       返回操作系统平台名称
    sys.stdin          输入相关
    sys.stdout         输出相关
    sys.stderror       错误相关

      sys.argv可以获取到用户给脚本传入的参数并根据此来执行程序

    import sys
    print(sys.argv)
    if sys.argv[1] == "hehe":
        print("haha")
    else:
        print("heihei")
    
    
    D:UsersAdministratorPycharmProjectsuntitled1>python3 txt1.py 1 2 3
    ['txt1.py', '1', '2', '3']
    
    D:UsersAdministratorPycharmProjectsuntitled1>python3 txt1.py hehe
    ['txt1.py', 'hehe']
    haha

      sys.path,让我们看一下,结尾的site-packages是存放所有第三方模块,它是全局的,只要模块放到这里,任何路径下都可以导入,该路径基于ide,或者用sys.path.apped也可以将模块直接加入python的默认路径。

    import sys
    print(sys.path)
    
    ['D:\Users\Administrator\PycharmProjects\untitled1', 'D:\Users\Administrator\PycharmProjects\untitled1', 'D:\Users\Administrator\AppData\Local\Programs\Python\Python35\python35.zip', 'D:\Users\Administrator\AppData\Local\Programs\Python\Python35\DLLs', 'D:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib', 'D:\Users\Administrator\AppData\Local\Programs\Python\Python35', 'D:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages']

       利用sys.stdout写一个类似进度条的程序,此写法仅仅适合2.7

    import sys
    import time
    for i in range(100):
        sys.stdout.write("#")
        time.sleep(1)

       3.5这样写

    import sys
    import time
    for i in range(100):
        sys.stdout.write("#")
        sys.stdout.flush()
        time.sleep(1)

       json和pickle模块

     

    • pickle   用于【python特有的类型】 和 【python基本数据类型】间进行转换
    • json     用于【字符串】和 【python基本数据类型】 间进行转换(可用于不同语言之前转换)。

      pickle的dumps方法可以将数据通过特殊的方式转换成只有python认识的特殊二进制格式,这里的二进制和普通字符二进制表示方式还是不同的。

    import pickle        
    a = {"k":"v","key":"v}
    b = pickle.dumps(a)  
    print(b)        
    
         b'x80x03}qx00(Xx03x00x00x00keyqx01Xx05x00x00x00valueqx02Xx01x00x00x00kqx03Xx01x00x00x00vqx04u.'

      pickle.dump,将数据

     通过特殊方式转换成只有python认识的特殊二进制格式,并写入文件。

    import pickle                  
    a = "hello"                    
    with open("abc","wb")  as  f:  
        pickle.dump(a,f)           
                                   

       json和pickle的用法基本是相同的,json转换为字符串格式。

    os模块,提供系统相关的功能

    用于提供系统级别的操作:

    os.getcwd()                 获取当前工作目录,即当前python脚本工作的目录路径
    os.chdir("dirname")         改变当前脚本工作目录;相当于shell下cd
    os.curdir                   返回当前目录: ('.')
    os.pardir                   获取当前目录的父目录字符串名:('..')
    os.makedirs('dir1/dir2')    可生成多层递归目录
    os.removedirs('dirname1')   若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')         生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')         删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')       列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
    os.remove()                 删除一个文件
    os.rename("oldname","new")  重命名文件/目录
    os.stat('path/filename')    获取文件/目录信息
    os.sep                      操作系统特定的路径分隔符,win下为"\",Linux下为"/"
    os.linesep                  当前平台使用的行终止符,win下为"	
    ",Linux下为"
    "
    os.pathsep                  用于分割文件路径的字符串
    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所指向的文件或者目录的最后修改时间 

       hashlib模块,用于加密相关的操作,代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 

    import hashlib
     
    # ######## md5 ########
    hash = hashlib.md5()
    # help(hash.update)
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
    print(hash.digest())
     
     
    ######## sha1 ########
     
    hash = hashlib.sha1()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
     
    # ######## sha256 ########
     
    hash = hashlib.sha256()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
     
     
    # ######## sha384 ########
     
    hash = hashlib.sha384()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())
     
    # ######## sha512 ########
     
    hash = hashlib.sha512()
    hash.update(bytes('admin', encoding='utf-8'))
    print(hash.hexdigest())

      以上算法表面安全,但是依然存在缺陷,容易被撞库的方式破解,所以要通过自定义key来在做加密,898oaFs09f就是自定义的key

    import hashlib
     
     
    hash = hashlib.md5(bytes('898oaFs09f',encoding="utf-8"))
    hash.update(bytes('admin',encoding="utf-8"))
    print(hash.hexdigest())

    python内置还有一个 hmac 模块,它内部对我们创建 key 和 内容 进行进一步的处理然后再加密

    import hmac
     
    h = hmac.new(bytes('898oaFs09f',encoding="utf-8"))
    h.update(bytes('admin',encoding="utf-8"))
    print(h.hexdigest())

       格式化输出之百分号方式

    %[(name)][flags][width].[precision]typecode
    
    (name)      可选,用于选择指定的key
    flags          可选,可供选择的值有:
    +       右对齐;正数前加正好,负数前加负号;
    -        左对齐;正数前无符号,负数前加负号;
    空格    右对齐;正数前加空格,负数前加负号;
    0        右对齐;正数前无符号,负数前加负号;用0填充空白处
    width         可选,占有宽度
    .precision   可选,小数点后保留的位数
    typecode    必选
    s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置
    r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置
    c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置
    o,将整数转换成 八  进制表示,并将其格式化到指定位置
    x,将整数转换成十六进制表示,并将其格式化到指定位置
    d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置
    e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e)
    E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E)
    f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位)
    F,同上
    g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;)
    G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;)
    %,当字符串中存在格式化标志时,需要用 %%表示一个百分号
    注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
    
    常用格式化:

    tpl = "i am %s" % "alex"
     
    tpl = "i am %s age %d" % ("alex"18)
    
    
     
    tpl = "i am %(name)s age %(age)d" % {"name""alex""age"18}
    
    
    
    
    tpl = "percent %.2f" % 99.97623
    
    
    
    
    tpl = "i am %(pp).2f" % {"pp"123.425556, }
    
    
    
    
    tpl = "i am %.2f %%" % {"pp"123.425556, }
    
    

       格式化之format方式

    tpl = "i am {}, age {}, {}".format("seven", 18, 'alex')
      
    tpl = "i am {}, age {}, {}".format(*["seven", 18, 'alex'])
      
    tpl = "i am {0}, age {1}, really {0}".format("seven", 18)
      
    tpl = "i am {0}, age {1}, really {0}".format(*["seven", 18])
      
    tpl = "i am {name}, age {age}, really {name}".format(name="seven", age=18)
      
    tpl = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18})
      
    tpl = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33])
      
    tpl = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1)
      
    tpl = "i am {:s}, age {:d}".format(*["seven", 18])
      
    tpl = "i am {name:s}, age {age:d}".format(name="seven", age=18)
      
    tpl = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18})
     
    tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
     
    tpl = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%}".format(15, 15, 15, 15, 15, 15.87623, 2)
     
    tpl = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}".format(15)
     
    tpl = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}".format(num=15)
  • 相关阅读:
    172. Factorial Trailing Zeroes
    96. Unique Binary Search Trees
    95. Unique Binary Search Trees II
    91. Decode Ways
    LeetCode 328 奇偶链表
    LeetCode 72 编辑距离
    LeetCode 226 翻转二叉树
    LeetCode 79单词搜索
    LeetCode 198 打家劫舍
    LeetCode 504 七进制数
  • 原文地址:https://www.cnblogs.com/kading/p/5590608.html
Copyright © 2011-2022 走看看