【问题标题】:Writing a small piece of code to sum up digits in a string, through using a try-except block通过使用 try-except 块编写一小段代码来总结字符串中的数字
【发布时间】:2013-12-19 19:26:57
【问题描述】:

背景:我的入门教科书中的“手指练习”之一让我尝试编写这样的程序来教我如何使用 try-except 块。该教科书旨在配合麻省理工学院 MOOC edX 上的“6.00x”课程。这不是在线课程本身的一部分,而只是一些让我理解 try-excpet 块的练习。

到目前为止,这是我的代码:

def sumDigits(s):
'''Assumes s is a string
   Returns the sum of the decimal digits in s
       For example, if is is 'a2b3c' it returns 5'''
    try:
        digitsum = 0
        for i in s:
            digitsum += int(i)


    except TypeError:
        return 'You have hit a TypeError'

    except ValueError:
        return 'You have hit a ValueError'

    return digitsum

所以,我遇到的问题是知道要在 except 子句中添加什么。我放在两个 except 子句中的文本在那里,因为我只是想让我的程序运行。我假设解释器通过像'456ab'这样的字符串,点击'a',然后打印出我告诉它返回的文本,当它不可避免地遇到ValueError时。如何让它“忽略”字符串中的字母字符,而只使用字符串中的数字,所有这些都在 try-except 块的上下文中?

【问题讨论】:

  • 您也可以使用"".join(filter(str.isdigit, "dfg")) 过滤掉非数字字符。

标签: python string try-except


【解决方案1】:

try 移动到循环中,并使用pass 作为异常处理程序来忽略异常:

digitsum = 0
for i in s:
    try:
        digitsum += int(i)
    except ValueError:
        pass  # ignore non-digit characters

你不会在这里遇到TypeError,除非任何iint() 无法处理的对象类型;例如不是数字或字符串的任何东西:

>>> int({})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'dict'

【讨论】:

  • 此方法得到准确的总和,同时忽略不求和的字符。但是,忽略异常通常是一种不好的做法。异常的部分目的是阻止意外输入,而忽略或“吃掉”异常是难以发现错误的常见来源。我不认为以这种方式使用异常是最初练习的目的。
  • @mcgyver5:为什么忽略针对特定应用程序的异常是一种不好的做法? Python 异常不仅仅是错误;它们是告诉您异常情况的信号。对于某些用例,明确地忽略这些情况是很好
  • @mcgyver5:这就是单一方法中的异常在这里被捕获的原因。这完全是 Pythonic,尤其是当 OP 试图了解如何使用它们时!
  • @mcgyver5:顺便说一句,不要将 Python 异常的使用与其他语言进行比较。再次强调一下,异常不仅仅用于表示代码中的错误。
  • @mcgyver5:举例说明:Python StopIterationGeneratorExit 异常专门用于表示必须传递的特定信号在正常的 returnyield 代码路径之外。 Python 代码一直捕获这些异常,包括忽略它们。
猜你喜欢
  • 2018-07-14
  • 2018-01-23
  • 2021-10-28
  • 2011-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-10
相关资源
最近更新 更多