解析式/推导式, 生成器 datetime 内建函数
列表解析式(List Comprehension)
语法:
[返回值 for 元素 in 可迭代对象 if 条件]
使用中括号[],内部是for循环,if条件可选.
返回一个新的列表.
列表解析式的作用:
编译器会优化,不会因为简写而影响效率,反而因优化提高了效率.
减少程序员工作量,减少出错.
简化代码,增强可读性.
注意:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
In [26]: newlist = [print(i) for i in range(10)] 0 1 2 3 4 5 6 7 8 9 In [27]: newlist Out[27]: [None, None, None, None, None, None, None, None, None, None] In [28]: newlist = [i for i in range(10)] In [29]: newlist Out[29]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] ----------------------------------------------------------------------------------------------------------------------- In [30]: [i for i in range(20) if i%2 == 0 elif i%3 == 0] # 列表解析式里面不包括else, elif. File "<ipython-input-30-9cc81af30c39>", line 1 [i for i in range(20) if i%2 == 0 elif i%3 == 0] ^ SyntaxError: invalid syntax In [31]: [i for i in range(20) if i%2 == 0 and i%3 == 0] Out[31]: [0, 6, 12, 18] In [32]: |
举例: 生成一个列表,元素0~9,对每一个元素自增1后求平方并返回新列表.
1 2 3 4 5 6 7 8 |
In [23]: for i in range(10): ...: lst.append((i+1)**2) ...: In [24]: lst Out[24]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] In [25]: |
使用列表解析式:
1 2 3 4 |
In [25]: [(i+1)**2 for i in range(10)] Out[25]: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] In [26]: |
列表解析式进阶
[返回值 for 元素 in 可迭代对象 if 条件1 if 条件2]
[返回值 for 元素 in 可迭代对象 for 元素1 in 可迭代对象1]
列表解析式练习
xxx
生成器表达式(Generator expression)
语法: (返回值 for 元素 in 可迭代对象 if 条件).
使用小括号().
返回一个生成器.
和列表解析/推导式的区别:
生成器表达式是按需计算(或称惰性求值,延迟计算),需要的时候才计算值.
列表解析式是立即返回值.
生成器:
可迭代对象
迭代器
生成器表达式和列表解析式比较:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
In [32]: g = ("{:04}".format(i) for i in range(1, 5)) In [33]: g Out[33]: <generator object <genexpr> at 0x000001D487ECA570> In [34]: next(g) Out[34]: '0001' In [35]: for x in g: ...: print(x) ...: 0002 0003 0004 In [36]: for x in g: ...: print(x) ...: In [37]: 总结: 延迟计算. 返回迭代器,可以迭代. 从前到后走完一遍后,不能回头. |
In [39]: g = ["{:04}".format(i) for i in range(1, 5)] In [40]: g Out[40]: ['0001', '0002', '0003', '0004',] In [41]: for x in g: ...: print(x) ...: 0001 0002 0003 0004 In [42]: ... 总结: 立即计算. 返回的不是迭代器,返回可迭代对象列表. 从前到后走完一遍后,可以重新回头迭代. |
总结:
生成器表达式 vs 列表解析式:
计算方式:
生成器表达式延迟计算,列表解析式立即计算.
内存占用:
从返回值本身:生成器表达式省内存,列表解析式返回新的列表.
生成器没有数据,内存占用极少,但是使用时,虽然一个个返回返回数据,但是合起来占用内存和列表解析式也差不多.
列表解析式构造新的列表需要占用内存.
计算速度:
但看计算时间,生成器表达式耗时非常短,列表解析式耗时长.
生成器本身并没返回任何值,只返回了一个生成器对象.
列表解析式构造并返回了一个新的列表.
集合解析式
语法: {返回值 for 元素 in 可迭代对象 if 条件}
使用大括号{}.
立即返回一个集合.
用法:
{(x,x+1) for x in range(10)}
{[x] for x in range(10)}
字典解析式
语法: {返回值 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)}
{chr(0x41+x):x**2 for x in range(10)}
注:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
In [45]: {str(x):y for x in range(3) for y in range(4)} Out[45]: {'0': 3, '1': 3, '2': 3} # 等价于: dic = {} for x in range(3): for y in range(4): dic[str(x)] = y print(dic) |
总结:
python2引入列表解析式.
python2.4引入生成器表达式.
python3引入集合,字典解析式,并迁移到2.7
一般来说,应多用解析式,简短高效.
如果一个解析式非常复杂,难读懂,要考虑拆解for循环.
生成器和迭代器都是不同的对象,但都是可迭代对象.
标准库-datetime
datetime模块
对日期,时间,时间戳的处理.
datetime类:
类方法:
today() 返回本地时区当前时间的datetime对象.
now(tz=None) 返回当前时间的datetime对象,时间到微妙,如果tz为None,返回和today()一样.
utcnow() 没有时区的当前时间.
fromtimestamp(timestamp,tz=None) 从一个时间戳返回一个datetime对象.
datetime对象:
timestamp()返回一个到微妙的时间戳.
时间戳: 格林威治时间1970/01/01 0点到现在的秒数.
1 2 3 4 5 6 7 |
# datetime.datetime.now().timestamp() 返回带微秒的时间戳. In [47]: import datetime In [48]: datetime.datetime.now().timestamp() Out[48]: 1507374681.008979 In [49]: |
datetime对象
构造方法: datetime.datetime(2016,12,6,16,29,43,79043)
year, month, day, hour, minute, second, microsecond,取datetime对象的年月日时分秒及微妙.
weekday() 返回星期的天, 周一0, 周日6.
date() 返回日期date对象.
time() 返回时间time对象.
replace() 修改并返回新的时间.
isocalendar() 返回一个三元组(年,周数,周的天)
日期格式化
类方法 strptime(date_string, format), 返回datetime对象.
对象方法 strftime(format), 返回字符串.
字符串format函数格式化.
time
time.sleep(secs) 将调用线程挂起来指定的秒数.
内建函数
标识id: 返回对象的唯一标识,Cpython返回内存地址.
哈希hash(): 返回一个对象的哈希值.
类型type(): 返回对象的类型.
类型转换:float(),int(),bin(),hex(),oct(),bool(),list(),tuple(),dict(),set(),complex,bytes(),bytearray().
输入input([prompt]): 接收用户输入,返回一个字符串.
打印print(*object,sep='', end='\n',file=sys.stdout,flush=False)
打印输出,默认使用空格分割,换行结尾,输出到控制台.
对象长度len(s): 返回一个集合类型的元素个数.
isinstance(obj,class_or_tuple): 判断对象obj是否属于某种类型或者元组中列出的某个类型.
isinstance(True, int)
issubclass(cls,class_or_tuple): 判断类型cls是否是某种类型的子类或元组中列出的耨个类型的子类.
issubclass(bool, int)
绝对值obs(x): x为数值.
最大值max(), 最小值min()
返回iterable对象中的最大或最小值.
返回多个参数中的最大或最小值.
round(x)
pow(x, y): 等价于x**y.
range()
divmod(x, y): 等价于tuple(x//y,x%y)
sum(iterable[,start]): 求和.
chr(i): 给一个一定范围的整数返回对应的字符. 如chr(97), chr(2003).
ord(c): 返回字符对应的整数. 如ord('a'), ord('中').
str(), repr(), ascii()
sorted(): 排序.
reversed(): 翻转.
enumerate(): 枚举.
iter(iterable): 迭代器
next(iterator): 从一个迭代器中取元素,如果元素都取过了,再次取会抛异常Stopiteration.
可迭代对象
能够通过迭代一次次返回不同的元素的对象.所谓相同不是指值是否相同,二是元素在容器中是否是同一个,例如列表中值可以重复.
可以迭代,但是未必有序,未必可索引.
可迭代对象: list,tuple,str,bytes,bytearray,range,set,dict,iterator.
可以使用成员操作符in和not in,in本质上就是在遍历对象.
1 2 3 4 5 6 7 8 9 10 11 12 |
In [1]: p = (x for x in range(10)) In [2]: p Out[2]: <generator object <genexpr> at 0x00000178FEC46A98> In [3]: 3 in p Out[3]: True In [4]: 11 in p Out[4]: False In [5]: |
迭代器
特殊的对象,一定是可迭代对象,具备可迭代对象的特征.
通过iter方法把一个可迭代对象封装成迭代器.
通过next方法,迭代 迭代器对象.
生成器对象,就是迭代器对象.
拉链函数-zip
拉链函数zip(*iterables)
像拉链一样,把多个可迭代对象合并在一起,返回一个迭代器.
将每次从不同对象中渠道的元素合并成一个元组.
1 2 3 4 |
In [30]: list(zip(range(10), range(10), range(5), range(10))) Out[30]: [(0, 0, 0, 0), (1, 1, 1, 1), (2, 2, 2, 2), (3, 3, 3, 3), (4, 4, 4, 4)] In [31]: |
解析式/推导式, 生成器 datetime 内建函数的更多相关文章
- python 生成器函数.推导式.生成器表达式
一.生成器 什么是生成器,生成器的实质就是迭代器 在python中有三种方式来获取生成器: 1.通过生成器函数 2.通过各种推导式来实现生成器 3.通过数据的转换也可以获取生成器 1 def func ...
- Python的高级特性2:列表推导式,生成器与迭代器
一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
- Python_Mix*生成器,生成器函数,推导式,生成器表达式
生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...
- day15(PYTHON)推导式{生成器,字典,列表,集合}
#[每一个元素或者是和元素相关的操作 for 元素 in 可迭代数据类型] #遍历之后挨个处理 #[满足条件的元素相关的操作 for 元素 in 可迭代数据类型 if 元素相关的条件] #筛选功能 # ...
- Day12--Python--生成器,生成器函数,推导式,生成器表达式
一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...
- python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)
一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...
- Python生成器/推导式/生成器表达式
一 生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样,取值方式和迭代器一样(__next__(), send(): 给上一个yield传值) 生成器一般由生成器函数或者生成器表达式来创 ...
- 2018.11.06 生成器函数进阶&列表推导式&生成器表达式
1.生成器函数进阶 2.列表推导式 3.生成器表达式
随机推荐
- Lock wait timeout exceeded数据库死锁问题
环境 MySQL5.5 现象 A.数据更新或新增后数据经常自动回滚. B.表操作总报 Lock wait timeout exceeded 并长时间无反应 解决方法 A.应急方法:show proce ...
- 19、Django实战第19天:课程列表页
从今天开始,我们将完成"公开课"课程的相关功能..... 1.把course-list.html复制到templates目录下 2.这个页面的头部.底部与之前定义的base.htm ...
- Spoj Query on a tree III
题目描述 给出N个点的一棵树(N-1条边),节点有白有黑,初始全为白 有两种操作: 0 i : 改变某点的颜色(原来是黑的变白,原来是白的变黑) 1 v : 询问1到v的路径上的第一个黑点,若无,输出 ...
- ListView(下)自定义适配器
(一) 1.效果图 2.activity_main.xml <?xml version="1.0" encoding="utf-8"?> <L ...
- 【译】PHP中的Session及其一些安全措施
有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制.我们先简单的了解一些http的知识,从而理解该协议的无 ...
- 直接拿来用!最火的Android开源项目(一)
GitHub在中国的火爆程度无需多言,越来越多的开源项目迁移到GitHub平台上.更何况,基于不要重复造轮子的原则,了解当下比较流行的Android与iOS开源项目很是必要.利用这些项目,有时能够让你 ...
- Java Web---登录验证和字符编码过滤器
什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...
- ArcGIS教程:Iso 聚类非监督分类
摘要 使用 Iso 聚类工具和最大似然法分类工具对一系列输入栅格波段运行非监督分类. 使用方法 · 此工具结合了 Iso 聚类工具与最大似然法分类工具的功能.输出经过分类的栅格.作为可选的,它也能够输 ...
- nginx 配置优化详解
# nginx不同于apache服务器,当进行了大量优化设置后会魔术般的明显性能提升效果 # nginx在安装完成后,大部分参数就已经是最优化了,我们需要管理的东西并不多 #user nobody; ...
- 各版本JDK1.5-1.8新特性
概述 一jdk15新特性 泛型 foreach 自动拆箱装箱 枚举 静态导入Static import 元数据Metadata 线程池 Java Generics 二jdk16新特性 Desktop类 ...