zoukankan      html  css  js  c++  java
  • day19_模块

    一.模块导入

    1.import
    2.为模块起别名:import ....as....
    为已经导入的模块起别名的方式对编写可扩展的代码很有用,假设有两个模块xmlreader.py和csvreader.py,
    它们都定义了函数read_data(filename):用来从文件中读取一些数据,但采用不同的输入格式。可以编写代码来选择性地挑选读取模块,
    例如;
    if file_format == 'xml':
         import xmlreader as reader
    elif file_format == 'csv':
         import csvreader as reader
    data=reader.read_date(filename)
    --------------------------------------------
    3.在一行导入多个模块:import sys,os,re
    --------------------------------------
    4.from …… import * # 所有的不是以下划线(_)开头的名字都导入到当前位置,很有可能会覆盖掉你之前已经定义的名字。而且可读性极其的差,在交互式环境中导入时没有问题。
    from ... import....同样使用别名于多个模块

    模块导入顺序:

    # 内置模块
    # 扩展的 django
    # 自定义的

    把模块当作脚本去执行(用于编译调试模块)

    我们可以通过模块的全局变量__name__来查看模块名:
    当做脚本运行:
    __name__ 等于'__main__'

    当做模块导入:
    __name__= 模块名

    作用:用来控制.py文件在不同的应用场景下执行不同的逻辑
    if __name__ == '__main__':

    def fib(n):   
        a, b = 0, 1
        while b < n:
            print(b, end=' ')
            a, b = b, a+b
        print()
    
    if __name__ == "__main__":
        print(__name__)    #在模块本身文件中__name__输出__main__;在调用段则会输入模块文件名称,一次增加判断,有利于调试
    num
    = input('num :') fib(int(num))

    二.collections模块

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

    因为tuple是不可变集合,则可以使用类似二维坐标样式访问

    from collections import namedtuple
    point = namedtuple("point",["x","y"])
    p = point(1,2)
    print(p.x)--------1
    print(p.y)--------2
    
    ----------------------------------------------
    # 坐标与半径表示一个圆
    Circle = namedtuple('Circle', ['x', 'y', 'r'])

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

      queue---队列(先进先出)

    #相对应传入一个,传出一个
    import queue q
    = queue.Queue() q.put([1,2,3]) #传入数值 q.put(4) q.put(5) print(q.get())----------[1,2,3] #输出数值 print(q.get())-----------4 print(q.get())-----------5 print(q.qsize())---------0

    deque双向列表,实现插入和删除操作的双向列表(deque除了实现list的append()pop()外,还支持appendleft()popleft()

    这样就可以非常高效地往头部添加或删除元素。

    from collections import deque
    dq = deque([1,2])
    dq.append('a')   # 从后面放数据  [1,2,'a']
    dq.appendleft('b') # 从前面放数据 ['b',1,2,'a']
    dq.insert(2,3)    #['b',1,3,2,'a']-----在索引前插入值
    # print(dq.pop())      # 从后面取数据a
    # print(dq.pop())      # 从后面取数据2
    # print(dq.popleft())  # 从前面取数据b
    print(dq)

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

    Counter类的目的是用来跟踪值出现的次数。它是一个无序的容器类型,以字典的键值对形式存储,其中元素作为key,其计数作为value

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

    4.OrderedDict: 有序字典

    因为字典dict的key是无序的,所以进行迭代时无法确定key值顺序,可以使用ordereDict:

    from collections import  OrderedDict
    od = OrderedDict([('a', 1), ('b', 2), ('c', 3)])
    print(od) # OrderedDict的Key是有序的
    print(od['a'])
    for k in od:
        print(k)

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

      defaultdict的作用是在于,当字典里的key不存在但被查找时,返回的不是keyError而是一个默认值

    #将所有大于 66 的值保存至字典的第一个key中,将小于 66 的值保存至第二个key的值中。
    from collections import defaultdict
    
    values = [11, 22, 33,44,55,66,77,88,99,90]
    
    my_dict = defaultdict(list)
    
    for value in  values:
        if value>66:
            my_dict['k1'].append(value)    #输入默认key值k1
        else:
            my_dict['k2'].append(value)
     

     二.time模块

    1.时间戳

    import time
    print(type(time.time()))-----------float类型
    print(time.time())--------------时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量

    2.时间格式化

    import time
    print(type(time.time()))
    print(time.strftime("%Y-%m-%d %H-%M-%S"))
    ----------------------------------------------------
    %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个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

    import time
    print(time.localtime())#localtime将一个时间戳转换为当前时区的struct_time
    ------------------------------------------
    time.struct_time(tm_year=2019, tm_mon=6, tm_mday=28, tm_hour=8, tm_min=14, tm_sec=17, tm_wday=4, tm_yday=179, tm_isdst=0)
    ------------------------------------------------------------------
    print(time.locatime().tm_year)---------2019

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

    #时间戳-->结构化时间(time.time()----struct_time)
    #time.gmtime(时间戳)    #UTC时间,与英国伦敦当地时间一致
    #time.localtime(时间戳) #当地时间。例如我们现在在北京执行这个方法:与UTC时间相差8小时,UTC时间+8小时 = 北京时间 
    >>>time.gmtime(1500000000)
    time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
    >>>time.localtime(1500000000)
    time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
    
    #结构化时间-->时间戳 
    #time.mktime(结构化时间)
    >>>time_tuple = time.localtime(1500000000)
    >>>time.mktime(time_tuple)
    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)
     

     三.random 模块

    >>> import random
    #随机小数
    >>> random.random()      # 大于0且小于1之间的小数
    0.7664338663654585
    >>> random.uniform(1,3) #大于1小于3的小数
    1.6270147180533838
    #恒富:发红包
    
    #随机整数
    >>> random.randint(1,5)  # 大于等于1且小于等于5之间的整数
    >>> random.randrange(1,10,2) # 大于等于1且小于10之间的奇数
    
    
    #随机选择一个返回
    >>> random.choice([1,'23',[4,5]])  # #1或者23或者[4,5]
    #随机选择多个返回,返回的个数为函数的第二个参数
    >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
    [[4, 5], '23']
    
    
    #打乱列表顺序
    >>> item=[1,3,5,7,9]
    >>> random.shuffle(item) # 打乱次序
    >>> item
    [5, 1, 3, 7, 9]
    >>> random.shuffle(item)
    >>> item
    [5, 9, 7, 1, 3]

    1 )、random() 返回0<=n<1之间的随机实数n;
    2 )、choice(seq) 从序列seq中返回随机的元素;
    3 )、getrandbits(n) 以长整型形式返回n个随机位;
    4 )、shuffle(seq[, random]) 原地指定seq序列;
    5 )、sample(seq, n) 从序列seq中选择n个随机且独立的元素;

     详细介绍:

    random.random()函数是这个模块中最常用的方法了,它会生成一个随机的浮点数,范围是在0.0~1.0之间。

    random.uniform()正好弥补了上面函数的不足,它可以设定浮点数的范围,一个是上限,一个是下限。

    random.randint()随机生一个整数int类型,可以指定这个整数的范围,同样有上限和下限值,python random.randint。

    random.choice()可以从任何序列,比如list列表中,选取一个随机的元素返回,可以用于字符串、列表、元组等。

    random.shuffle()如果你想将一个序列中的元素,随机打乱的话可以用这个函数方法。

    random.sample()可以从指定的序列中,随机的截取指定长度的片断,不作原地修改。

    随机产生验证码

    import random
    
    def v_code():
    
        code = ''
        for i in range(5):
    
            num=random.randint(0,9)
            alf=chr(random.randint(65,90))   #通过ascill随机生成字母
            add=random.choice([num,alf])   #随机选择字母/数值
            code="".join([code,str(add)])
    
        return code
    
    print(v_code())
  • 相关阅读:
    设计模式浅谈
    链表的遍历(1)
    链表的删除(3)
    链表结构的反转(5)
    二叉树数组表示法
    循环链表的插入和删除
    链表的链接(2)
    双向链表内结点的删除(4)
    hdu1042
    数组和链表的区别
  • 原文地址:https://www.cnblogs.com/wzc27229/p/11098736.html
Copyright © 2011-2022 走看看