这是我参与更文挑战的第6天
1 列表推导式
我们通常会遇到数据处理的问题,如在一个列表中提取符合某个条件的所有数据:
eg:从 [1, -1, 0, 6, -2, -3, 4, 8]提取大于1的所有数字 一般写法就是 通过 for 循环 进行迭代:
上面这段代码有不足之处呢?
1.运行速度偏慢
2.代码显得冗余
3.增加了新的列表变量
如果改写上面的代码,我们可以使用 python中 自带的列表表达式改写
或者 使用 python中的filter函数:
为什么要使用上面的方法呢?
1.python的内置函数一般是以接近C的速度运行的,所以速度会有所提高
2.代码简洁,易读
3.不需要增加额外的变量
tips: 列表解析比filter速度快,但可以确定的是 这两种方式都要比迭代快。
关于列表解析还可以这样使用:
可以看到上图中有两段代码,而他们的作用是完全相同,即从lxml 获取的xpath节点里,获取该节点下的所有文本内容。但是,列表表表达式不仅速度上快些,而且简洁,同样的需求,使用了不同的代码,而第二种却可以称的上是好的代码。
除去列表解析,你还可以使用字典解析来获取字典中符合某个条件的数据:它的写法如下:
{k: v for k,v in dict.iteritems() if v > 90}
其中 k 为键 v 为值
最后还有集合解析,它的写法类似列表解析
{x for x in set if x % 3 == 0}
表达式的精简,这就是为什么我说,好的语法的重要性。
2 使用默认迭代器与操作符
这种情况一般发生支持默认迭代器和操作符的类型上,比如list、dict或者文件.
操作符的解释:in 和 not in
使用缘由:默认的操作符和迭代器没有额外方法调用,会比较高效,总觉得在python里面强调高效的感觉怪怪的。而且使用默认操作符的函数是通用的,它可以支持该操作的的任何类型.
缺点:你可能没法通过方法名来区分对象类型
使用场景:如果类型支持应该优先考虑,只是这样,你在遍历容器时,你不能修改它.
eg: for key in a_dict:
...
if key not in a_dict:
...
if obj in a_list:
...
for line in a_file:
...
for k, v in dict.iteritems():
...
坏的例子
No: for key in a_dict.keys():
...
if not a_dict.has_key(key):
...
for line in a_file.readlines():
...