Python 小技巧 一

253 阅读3分钟

这是我参与更文挑战的第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(): 
          ...

3 尽量少使用None

当代码产生的结果不是理想中的结果时,我们(至少以前的我)会用None来作为返回值返回,其实后面想想这不是正确的做法,面对特殊情况,我们应该用异常来表示它,因为在条件表达式中,None 和0、空字符串,都会被判为false,这就是要命的地方,你可能无法知道你的代码,到底产生了什么东西!!!所以少用None把.