zoukankan      html  css  js  c++  java
  • Python 解析式、生成器

    标准库datetime

    datetime模块

    • 对日期、时间、时间戳的处理
    • datetime类
      • 类方法
        • today() 返回本地时区当前时间的datetime对象
        • now(tz=None) 返回当前时间的datetiem对象,时间到微秒,如果tz为None,返回和today()一样
        • utcnow() 没有时区的当前时间
        • formtimestamp(timestamp, tz= None)从一个时间戳返回一个datetime对象
      • datetime对象
        • timestamp() 返回一个到微妙的时间戳
          • 时间戳:格林威治时间1970年1月1日0时到现在的秒数

    datetime对象

    • 构造方法 datetime.datetime(2016,12,6,16,29,43,79043)
    • year、month、day、hour、minute、second、microsecond,取datetime对象的年月日时分秒及微妙
    • weekday() 返回星期的天,周一0,周日6
    • isoweedday() 返回星期的天,周一1,周日7
    • date() 返回日期date对象
    • time() 返回时间time对象
    • replace() 修改并返回新的时间
    • isocalendar() 返回一个三元组(年、周数、周的天)

    日期格式化

    • 类方法 strptime(date_string,format),返回datetime对象
    • 对象方法 strftime(format),返回字符串
    • 字符串format函数格式化
    import datetime
    dt = datetime.datetime.strptime("21/11/06 16:30", "%d/%m/%y %H:%M")
    print(dt.strftime("%Y-%m-%d %H:%M:%S"))
    print("{0:%Y}/{0:%m}/{0:%d} {0:%H}::{0:%M}::{0:%S}".format(dt))

    tiemdelta对象

    • datetime2 = datetime1 + tiemdelta
    • datetime2 = datetime1 - tiemdelta
    • tiemdelta = datetime1 - datetime2
    • 构造方法
      • datetime.timedelta(days=0,seconds=0,microseconds=0,milliseconds=0,minutes=0,hours=0,weeks=0)
      • year = datetime.timedelta(days = 365)
    • total_seconds() 返回时间差的总秒数

    标准库time

    time

    • time.sleep(secs) 将调用线程挂起指定的秒数

    列表解析

    1、生产一个列表,元素0~9,对每个元素自增1后求平方返回新列表

    #常规写法
    lst = []
    for a in range(10):
        lst.append((a+1)**2)
    print(lst)
    #列表解析
    lst=[(a+1)**2 for a in range(10)]
    print(lst)

    语法:

    • [返回值 for 元素 in 可迭代对象 if 条件]
    • 使用中括号[],内部是for 循环,if条件语句可选
    • 返回一个新的列表

    列表解析式是一种语法糖

    • 编译器会优化,不会因为简写而影响效率,反而因优化提高了效率
    • 减少程序员工作量,减少出错
    • 简化代码,但可读性增强

    举例:

    获取10以内的偶数

    even = [x for x in range(10) if x%2==0]
    print(even)
    • 有这样的赋值语句newlist = [print(i) for i in range(10)] 请问打印出什么?   newlist结果是None
    • 获取20以内的偶数,如果同时3的倍数也打印[i for i in range(20) if i%2==0 elif i%3==0]   可以

    生成器表达式

    语法:

    • (返回值 for 元素 in 可迭代对象 if 条件)
    • 列表解析式的中括号换成小括号就行了
    • 返回一个生成器

    和列表解析器的区别

    • 生成器表达式是按需计算(惰性计算、延迟计算)需要的时候才计算值
    • 列表解析式是立即返回值

    生成器

    • 可迭代对象
    • 迭代器

    举例:

    生成器:

    g = ("{:04}".format(i) for i in range(1,11))
    next(g) #判断是否是迭代器
    for x in g: print(x) print('~~~~~~~~~~~~') for x in g: print(x)
    #执行结果
    0002 0003 0004 0005 0006 0007 0008 0009 0010 ~~~~~~~~~~~~

    总结:

    • 延迟计算
    • 返回迭代器,可以迭代
    • 从前到后走一遍后,不能回头

    列表解析式:

    g = ["{:04}".format(i) for i in range(1,11)]
    for x in g:
        print(x)
        
    print('~~~~~~~~~~~~')
    for x in g:
        print(x)
    #执行结果
    0001
    0002
    0003
    0004
    0005
    0006
    0007
    0008
    0009
    0010
    ~~~~~~~~~~~~
    0001
    0002
    0003
    0004
    0005
    0006
    0007
    0008
    0009
    0010

    总结

    • 立即计算
    • 返回的不是一个迭代器,返回可迭代对象列表
    • 从前到后走完一遍后,可以重新回头迭代
    it = (print("{}".format(i+1)) for i in range(2))
    first = next(it)
    second = next(it)
    #val = first + second  #报错,因为print给it的结果是None None+None 
    
    #正确
    
    it = (i+1 for i in range(2))
    first = next(it)
    second = next(it)
    val = first + second
    print(val)

    生成器表达式和列表解析式对比

    • 计算方式
      • 生成器表达式延迟计算,列表解析式立即计算
    • 内存占用
      • 单从返回值本身来说,生成器表达式省内存,列表解析式返回新的列表
      • 生成器没有数据,内存占用极少,但是使用的时候,虽然一个个返回数据,但是合起来占用的内存也差不多
      • 列表解析式构造新的列表需要占用内存
    • 计算速度
      • 单从计算时间看,生成器表达式耗时非常短,列表解析式耗时长
      • 但是生成器本身并没有返回任何值,只返回了一个生成器对象
      • 列表解析式构造并返回了一个新的列表

    集合解析式

    语法:

    • {返回值 for 元素 in 可迭代对象 if 条件}
    • 列表解析式的中的中括号换成大括号{}
    • 立即返回一个集合

    用法:

    • {(x,x+1) for x in range(10)}
    • {[x] for x in range(10)}  #包括  列表不能hash

    字典解析式

    语法:

    • {返回值 for 元素 in 可迭代对象 if 条件}
    • 列表解析式的中括号换成大括号{}
    • 使用key:value形式
    • 立即返回一个字典

    用法:

    • {x:(x,x+1) for x in range(10)}
    • {x:[x,x+1] for x in range(10)}
    • {(x,):[x,x+1] for x in range(10)}
    • {[x]:[x,x+1] for x in range(10)} # 包括   列表不可hash
    • {chr(0x41+x):x**2 for x in range(10)}  #这是生产大写字母
    • {str(x):y for x in range(3) for y in range(4)}  #输入 {'0': 3, '1': 3, '2': 3}   因为字典去重
  • 相关阅读:
    配置java环境变量
    编写Java中的第一个Java程序:HelloWorld(你好世界:问世)
    对Java的加载与执行的理解(理论比较重要)
    JDK、JRE、JVM三者之间的关系?
    Java语言的特性
    计算机编程语言发展史
    DRF解析器
    DRF分页组件
    DRF频率组件
    DRF权限组件
  • 原文地址:https://www.cnblogs.com/xzkzzz/p/11208898.html
Copyright © 2011-2022 走看看