标准库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
000789
0010
~~~~~~~~~~~~
0001
0002
0003
0004
0005
0006
000789
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}   因为字典去重

Python 解析式、生成器的更多相关文章

  1. 第四天python3 python解析式-生成器-迭代器

    标准库datetime datetime模块  对日期.时间.时间戳的处理 datetime类 类方法: today() 返回本地时区当前时间的datetime对象: now(tz=None) 返回当 ...

  2. python 列表生成器

    python 列表生成器 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 一个循环 在C语言等其他语言中,for循环一般是这样的 ...

  3. python 迭代器 生成器

    迭代器 生成器 一 什么是迭代器协议 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前 ...

  4. python中和生成器协程相关的yield from之最详最强解释,一看就懂(四)

    如果认真读过上文的朋友,应该已经明白了yield from实现的底层generator到caller的上传数据通道是什么了.本文重点讲yield from所实现的caller到coroutine的向下 ...

  5. python中和生成器协程相关yield from之最详最强解释,一看就懂(二)

    一. 从列表中yield  语法形式:yield from <可迭代的对象实例> python中的列表是可迭代的, 如果想构造一个生成器逐一产生list中元素,按之前的yield语法,是在 ...

  6. python中和生成器协程相关的yield之最详最强解释,一看就懂(一)

    yield是python中一个非常重要的关键词,所有迭代器都是yield实现的,学习python,如果不把这个yield的意思和用法彻底搞清楚,学习python的生成器,协程和异步io的时候,就会彻底 ...

  7. Python中生成器和迭代器的区别(代码在Python3.5下测试):

    https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...

  8. python解析式

    一.列表解析式 列表解析是外面一对中括号,它返回的是列表. 一般形式为:[expr for item in itratoble] print([i+1 for i in range(10)]) #结果 ...

  9. Python的生成器进阶玩法

    Python的生成器进阶玩法 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.yield的表达式形式 #!/usr/bin/env python #_*_coding:utf-8 ...

  10. python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解

    一.生成器 1.什么是生成器? 在python中,一边循环一边计算的机制,称为生成器:generator. 2.生成器有什么优点? 1.节约内存.python在使用生成器时对延迟操作提供了支持.所谓延 ...

随机推荐

  1. 云计算(3)-what is new in today's Cloud

    What is new in today's Cloud Four features new in today's Clouds 如果一个problem有以上4个features里面的一个或者多个,则 ...

  2. 引入其他服务器的JS文件,同时也引入本地JS文件 报错时:

    控制台报错: Uncaught ReferenceError: define is not defined at core.js:5

  3. NO.24两两交换链表中的节点

    NO.24两两交换链表中的节点 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例:给定 1->2->3-&g ...

  4. idea2018使用整理

    1.idea怎么设置选中文件时,自动在左侧弹出文件所在位置及文件?

  5. eclipse/myeclipse SVN资源库URL中文乱码问题解决办法

    右击选择资源库地址 可以自定义名称

  6. Oracle11g 新特性之动态变量窥视

    从11g開始,这个尴尬的问题開始得到了改善.因此从11g開始,引入了所谓的自适应游标共享(Adaptive Cursor Sharing).该特性是一个很复杂的技术,用来平衡游标共享和SQL优化这两个 ...

  7. java文件上传下载组件

    需求: 支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验: 内网百兆网络上传速度为12MB/S 服务器内存占用低 支持文件夹上传,文件夹中的文件数量达到1万个以上,且包 ...

  8. 小象和老鼠 DP

    小象和老鼠 DP \(N*M\)的网格图,格子\((i,j)\)有\(A_{i,j}\)个老鼠,问小象从左上角\((1,1)\)走到右下角\((N,M)\)看到的最少老鼠.小象可以看见老鼠,当且仅当老 ...

  9. Bzoj 2301: [HAOI2011]Problem b(莫比乌斯反演+除法分块)

    2301: [HAOI2011]Problem b Time Limit: 50 Sec Memory Limit: 256 MB Description 对于给出的n个询问,每次求有多少个数对(x, ...

  10. codeforces193B

    CF193B Xor sol:发现好像非常不可做的样子,发现n,u都很小,大胆dfs,因为异或偶数次毫无卵用,只要判每次是否做2操作就是了,复杂度O(可过) #include <bits/std ...