zoukankan      html  css  js  c++  java
  • 常用模块

    一、什么是模块?

      常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

       但其实import加载的模块分为四个通用类别: 

      1 使用python编写的代码(.py文件)

      2 已被编译为共享库或DLL的C或C++扩展

      3 包好一组模块的包

      4 使用C编写并链接到python解释器的内置模块

    二、为何要使用模块?

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

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

    三、常用模块

      1、collections模块

      

        在内置数据类型(dict、list、set、tuple)的基础上,collections模块还提供了几个额外的数据类型:Counter、deque、defaultdict、namedtuple和OrderedDict等。

        1.namedtuple: 生成可以使用名字来访问元素内容的tuple

        2.deque: 双端队列,可以快速的从另外一侧追加和推出对象

        3.Counter: 计数器,主要用来计数

        4.OrderedDict: 有序字典

        5.defaultdict: 带有默认值的字典

     

        namedtuple

        们知道tuple可以表示不变集合,例如,一个点的二维坐标就可以表示成:

    p = (1,2)

        但是,看到(1, 2),很难看出这个tuple是用来表示一个坐标的。

        这时,namedtuple就派上了用场:

      

    from collections import namedtuple
    point = namedtuple('point',['x','y'])
    p = point(1,2)
    print(p.y)
    
    结果为:
    2

        deque

        使用list存储数据时,按索引访问元素很快,但是插入和删除元素就很慢了,因为list是线性存储,数据量大的时候,插入和删除效率很低。

        deque是为了高效实现插入和删除操作的双向列表,适合用于队列和栈:

    from collections import deque
    q = deque(['a','b','c'])
    q.append('x')
    q.appendleft('y')
    print(q)
    
    结果为:
    deque(['y', 'a', 'b', 'c', 'x'])

        deque除了实现list的append()pop()外,还支持appendleft()popleft(),这样就可以非常高效地往头部添加或删除元素。

        OrderedDict   

        使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序。

        如果要保持Key的顺序,可以用OrderedDict

     

    from collections import OrderedDict
    d = dict([('a',1),('b',2),('c',3)])
    print(d)
    od = OrderedDict([('a',1),('b',2),('c',3)])
    print(od)

        意,OrderedDict的Key会按照插入的顺序排列,不是Key本身排序:

    from collections import OrderedDict
    od = OrderedDict()
    od['z'] = 1
    od['y'] = 2
    od['x'] = 3
    print(od.keys())
    
    结果为:
    ['z', 'y', 'x']

        defaultdict

        有如下值集合 [11,22,33,44,55,66,77,88,99,90...],将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。

        即: {'k1': 大于66 'k2': 小于66}
        原生字典解决方法为:
    l = [11, 22, 33, 44, 55, 66, 77, 88, 99]
    my_dict = {}  #定义一个空字典
    for value in l:
        if value > 66:
            if 'k1' in my_dict:  #判断my_dict字典里有没有‘k1’这个key
                my_dict['k1'].append(value)
            else:
                my_dict['k1'] = [value]  #初始添加key:value 要不value以列表的形式添加
        else:
            if 'k2' in my_dict:
                my_dict['k2'].append(value)
            else:
                my_dict['k2'] = [value]
    print(my_dict)

        使用defaultdict方法解决:

    from collections import defaultdict
    my_dict = defaultdict(list)
    for value in l:
        if value < 66:
            my_dict['k1'].append(value)
        else:
            my_dict['k2'].append(value)
    print(my_dict)

        Counter

        Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value。计数值可以是任意的Interger(包括0和负数)。Counter类和其他语言的bags或multisets很相似。

    from collections import Counter
    c = Counter('abcdeabcdabcaba')
    print(c)
    
    结果为:
    Counter({'a': 5, 'b': 4, 'c': 3, 'd': 2, 'e': 1})

    2、时间模块

      和时间有关系的我们就要用到时间模块。在使用模块之前,应该首先导入这个模块。

    #常用方法
    time.sleep(secs)
    #(线程)推迟指定的时间运行。单位为秒。
    time.time()
    #获取当前时间戳

      表示时间的三种方式:

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

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

    #时间戳(timestamp)
    print(time.time())  #1525854518.7102778
    print(type(time.time()))    #<class 'float'>

        (2)格式化的时间字符串(Format String): ‘1999-12-06’

    %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 当前时区的名称
    %% %号本身

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

    索引(Index)属性(Attribute)值(Values)
    0 tm_year(年) 比如2011
    1 tm_mon(月) 1 - 12
    2 tm_mday(日) 1 - 31
    3 tm_hour(时) 0 - 23
    4 tm_min(分) 0 - 59
    5 tm_sec(秒) 0 - 60
    6 tm_wday(weekday) 0 - 6(0表示周一)
    7 tm_yday(一年中的第几天) 1 - 366
    8 tm_isdst(是否是夏令时) 默认为0

         首先,我们先导入time模块,来认识一下python中表示时间的几种格式:

    import time
    #时间戳
    print(time.time())    
    1525854796.127278
    
    #时间字符串
    print(time.strftime('%Y-%m-%d %H:%M:%S'))
    2018-05-09 16:33:16
    
    #时间元组 localtime将一个时间戳转换为当前时区的struct_time
    print(time.localtime())
    time.struct_time(tm_year=2018, tm_mon=5, tm_mday=9, tm_hour=16, tm_min=33, tm_sec=16, tm_wday=2, tm_yday=129, tm_isdst=0)

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

    几种格式之间的转换

      

    #时间戳-->结构化时间
    tt = time.time()
    print(tt)    #1525855397.559278
    st = time.localtime(tt)
    print(st)    #time.struct_time(tm_year=2018, tm_mon=5, tm_mday=9, tm_hour=16, tm_min=43, tm_sec=17, tm_wday=2, tm_yday=129, tm_isdst=0)
    
    
    #结构化时间-->时间戳 
    st = time.localtime(1500000000)
    tt = time.mktime(st)
    print(tt)    #1500000000.0
    
    
    #结构化时间-->字符串时间
    #time.strftime("格式定义","结构化时间")  结构化时间参数若不传,则现实当前时间
    >>>time.strftime("%Y-%m-%d %X")
    '2017-07-24 14:55:36'
    >>>time.strftime("%Y-%m-%d",time.localtime(1500000000))
    '2017-07-14'
    
    #字符串时间-->结构化时间
    #time.strptime(时间字符串,字符串对应格式)
    >>>time.strptime("2017-03-16","%Y-%m-%d")
    time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
    >>>time.strptime("07/24/2017","%m/%d/%Y")
    time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)

    #结构化时间 --> %a %b %d %H:%M:%S %Y串
    #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
    >>>time.asctime(time.localtime(1500000000))
    'Fri Jul 14 10:40:00 2017'
    >>>time.asctime()
    'Mon Jul 24 15:18:33 2017'
    
    #时间戳 --> %a %d %d %H:%M:%S %Y串
    #time.ctime(时间戳)  如果不传参数,直接返回当前时间的格式化串
    >>>time.ctime()
    'Mon Jul 24 15:19:07 2017'
    >>>time.ctime(1500000000)
    'Fri Jul 14 10:40:00 2017' 

        计算时间差:

    import time
    true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
    time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
    dif_time=time_now-true_time
    struct_time=time.gmtime(dif_time)
    print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
                                           struct_time.tm_mday-1,struct_time.tm_hour,
                                           struct_time.tm_min,struct_time.tm_sec))

    3、random 模块

    import  random
    
    #随机小数
    
    print(random.random())    # 大于0且小于1之间的小数
    #0.3102806016991905
    
    print(random.uniform(1,3))    #大于1小于3的小数
    #1.6317624813591252
    
    
    #随机整数
    print(random.randint(1,5))    # 大于等于1且小于等于5之间的整数
    #3
    
    print(random.randrange(1,10,2))    #大于等于1且小于10之间的奇数
    #5
    
    
    
    #随机选择一个返回
    print(random.choice([1,'sa',[3,4]]))    
    #[3, 4]
    
    #随机选择多个返回,返回的个数为函数的第二个参数
    print(random.sample([1,'sa',[3,4]],2))
    #[[3, 4], 1]
    
    
    #打乱列表顺序
    item=[1,3,5,7,9]
    random.shuffle(item)
    print(item)
    #[5, 9, 7, 3, 1]

    随机生成验证码:

    import random
    code=''
    for i in range(6):
        num = random.randint(65,90)
        alpha1 = chr(num)
        num = random.randint(97,122)
        alpha2 = chr(num)
        num3 = str(random.randint(0,9))
        s = random.choice([alpha1,alpha2,num3])
        code +=s
    
    print(code)

    4、sys模块

      sys模块是与python解释器交互的一个接口

    sys.argv           #命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        #退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        #获取Python解释程序的版本信息
    sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       #返回操作系统平台名称

    5、os模块

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

    1、os.getcwd() #获取当前工作目录,即当前python脚本工作的目录路径
    #D: otepadstudypythonstudyday5

    2、os.chdir("dirname") #改变当前脚本工作目录;相当于shell下cd
    os.chdir('D:/notepad/study/pythonstudy/day4')
    print(os.getcwd())
    #D: otepadstudypythonstudyday4

    3、os.curdir #返回当前目录: ('.')
    4、os.pardir #获取当前目录的父目录字符串名:('..')

    5、os.makedirs('dirname1/dirname2') #可生成多层递归目录

    6、os.removedirs('dirname1') #若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 7、os.mkdir('dirname') #生成单级目录;相当于shell中mkdir dirname 8、os.rmdir('dirname') #删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 9、os.listdir('dirname') #列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 10、os.remove() #删除一个文件 11、os.rename("oldname","newname") #重命名文件/目录 12、os.stat('path/filename') #获取文件/目录信息 13、os.sep #输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" 14、os.linesep #输出当前平台使用的行终止符,win下为" ",Linux下为" " 15、os.pathsep #输出用于分割文件路径的字符串 win下为;,Linux下为: 16、os.name #输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 17、os.system("bash command") #运行shell命令,直接显示 18、os.popen("bash command).read() #运行shell命令,获取执行结果 19、os.environ #获取系统环境变量 os.path 1、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)的第二个元素 2、os.path.exists(path) #如果path存在,返回True;如果path不存在,返回False 3、os.path.isabs(path) #如果path是绝对路径,返回True 4、os.path.isfile(path) #如果path是一个存在的文件,返回True。否则返回False 5、os.path.isdir(path) #如果path是一个存在的目录,则返回True。否则返回False 6、os.path.join(path1[, path2[, ...]]) #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 7、os.path.getatime(path) #返回path所指向的文件或者目录的最后访问时间 8、os.path.getmtime(path) #返回path所指向的文件或者目录的最后修改时间 9、os.path.getsize(path) #返回path的大小
  • 相关阅读:
    STM32 F4 DAC DMA Waveform Generator
    STM32 F4 General-purpose Timers for Periodic Interrupts
    Python第十四天 序列化 pickle模块 cPickle模块 JSON模块 API的两种格式
    Python第十三天 django 1.6 导入模板 定义数据模型 访问数据库 GET和POST方法 SimpleCMDB项目 urllib模块 urllib2模块 httplib模块 django和web服务器整合 wsgi模块 gunicorn模块
    查看SQL Server服务运行帐户和SQL Server的所有注册表项
    Pycharm使用技巧(转载)
    SQL Server 2014内存优化表的使用场景
    Python第十天 print >> f,和fd.write()的区别 stdout的buffer 标准输入 标准输出 从控制台重定向到文件 标准错误 重定向 输出流和输入流 捕获sys.exit()调用 optparse argparse
    Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
    Python第六天 类型转换
  • 原文地址:https://www.cnblogs.com/liuyisai/p/9015105.html
Copyright © 2011-2022 走看看