使用try除python - 成本是多少?

使用try除python - 成本是多少?

问题描述:

我读一个文件,并使用try catch来赶情况下,该数据可能不是我要找的类型:使用try除python - 成本是多少?

for w in text.readlines(): 
    try: 
     new = float(w.split()[3].replace(',', '.')) 
     if new < temp and w.split()[1][3:5] == '12': 
      temp = new 
      date = w 
    except ValueError: 
     '' 
    except IndexError: 
     '' 

这确实是一个哈克的解决方案,而不是东西,我会用,只是我写的东西,因为我需要快速访问一些数据。但是,如果我想分析一个非常大的文件或流,那么这样的解决方案(修改是否使调用更智能等)是可行的,或者应该选择其他解决方案。我的主要问题是关于尝试捕捉的表现,是否是一种昂贵的操作,并且是否有尝试除了良好用法的指导原则?希望这个问题不太宽泛。如果是,请关注我的示例。

+1

习惯性的python看起来像那样。请求宽恕不允许。 – RedX 2014-12-04 13:37:50

+7

但是使用'pass'而不是''''来表示“什么也不做”! – 2014-12-04 13:40:32

+2

此外,你可以'except(ValueError,IndexError):'如果案件之间没有区别。你应该尽可能缩短'try'块。 – jonrsharpe 2014-12-04 13:48:35

在你给特定的例子,你可以很容易地测试,避免IndexError情况下,所以我会做测试。 ValueError很难检查,所以你应该捕获异常。

for w in text: 
    words = w.split() 
    if len(words) >= 4: 
     try: 
      new = float(words[3].replace(',', '.')) 
      if new < temp and words[1][3:5] == '12': 
       temp = new 
       date = w 
     except ValueError: 
      pass 

不要使用readlines()上的一个文件,你应该只遍历文件来代替。

一个好的经验法则是,在处理异常之前同样容易检查或处理异常时,应考虑抛出异常的频率。如果在正常情况下,异常触发很少,那么就处理它,另一方面,如果它是常见情况,那么避免抛出它可能会更好。由于我对数据一无所知,因此我不知道比例的线将少于4个字段,所以在这种情况下,选择是非常随意的。

+0

感谢您的回答,以及关于迭代文件的提示。我看到你是一位Python专家,关心我指向一些好的资源/链接也变成了一个更好的Python程序员?我来自Java和C背景。 – 2014-12-04 22:35:13

我不能说太多关于它,因为我不是专家,但它是alwyas更好地在你看来,代码可能会产生一些错误的任何codeing语言使用try except,并在Python词汇 EAFP规则明确表示它。

更容易要求原谅而不是权限。这种常见的Python编码风格假定存在有效的键或属性,并且如果假设证明是错误的,则捕获异常。这种干净而快速的风格的特点是存在许多尝试和除外声明。该技术与许多其他语言一样的LBYL风格形成鲜明对比,如C.

for w in text.readlines(): 
    try: 
     new = float(w.split()[3].replace(',', '.')) 
     if new < temp and w.split()[1][3:5] == '12': 
      temp = new 
      date = w 
    except ValueError: 
     Do Something 
    except IndexError: 
     Do Something 
    except Exception: #Exception is a Base class of all exceptions if any exception that isn't catch will go in it, 
     Do Something 
+2

当没有特别的理由期待杂项异常并且没有针对它们的具体处理时,捕捉并忽略'异常'是一个坏主意。 – Duncan 2014-12-04 13:57:23

+0

@Duncan感谢您考虑这个问题,我只是想解释一下,因为OP在发生异常时没有说出如何处理。我的错。 – 2014-12-04 14:02:08

+0

有趣的小知识:在Python 2.x中,Exceptions不*必须从'BaseException'派生。你也可以'举起'旧式的课堂。 – 2014-12-04 14:10:41