在Python中实现一个对字符串中包含的整数求和的函数

2024-09-24 22:27:52 发布

您现在位置:Python中文网/ 问答频道 /正文

因此,我最近学习了johnguttag关于使用Python进行计算和编程的介绍,这是经过修订和扩展的版本,在学习了LPTHW的大部分内容之后。我正在结合麻省理工学院开放式课程006使用这本书。现在,我试图完成书中列出的一个手指练习,特别是第85页第7章中的一个,作者要求您使用try except块实现一个函数:

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"""

这是我的代码:

^{pr2}$

当我在空闲状态下使用测试输入运行这个程序时,总的计算结果总是为零,这表明new_list中没有任何元素被传递给累加器。有人能告诉我原因吗?谢谢。在


Tags: the函数版本内容isdef编程作者
3条回答

我正在学习同一本书和有关edX的MITx:6.00.1x课程;我的解决方案是:

def sumDigits(s):
    '''
    Assumes s is a string
    Returns the sum of the decimal digits in s
    For example, if s is 'a2b3c' it returns 5
    '''
    result = 0
    try:
        for i in range(len(s)):
            if s[i].isdigit():
                result += int(s[i])
        return result
    except:
        print('Your input is not a string.')

因为我们假设s是字符串,except块应该处理s不是字符串的情况。很简单,但一开始我并不清楚。在

你的代码实际上有几个错误。
让我们详细分析一下

主要问题在于:

list1 = [s]
new_list = [x for x in list1 if x.isdigit()]

你应该先直接在字符串上循环

^{pr2}$

当您创建一个新列表时,x for x in list1中的变量x将作为列表的元素发生。因此,在您的例子中,列表只有一个元素,它恰好是整个字符串(因为您将列表定义为[s])。由于整个字符串不是数字,new_list将是一个空列表。
这就是为什么你得到0作为回报。在

但是,如果直接遍历字符串,x将作为字符串中的每个字母发生,然后可以检查x是否为数字。在

同样重要的是要强调new_list[e]将引发{}。您应该只对e进行更正。for e in new_list的sintax使局部变量e假定列表中的每个值都是的,因此不必通过索引获取值:可以直接使用e
最后,为了对新列表中的值求和,这些值应该是整数(int),而不是字符串(str),因此在求和之前,必须将值强制转换为int(或者,您可以在列表理解过程中将每个元素强制转换为int,方法是使用int(x) for x in s if x.isdigit(),而不是{})。另外,为了检查输入是否是字符串,最好使用isinstance(s, basestring),如果使用python2,最好使用isinstance(s, str),如果使用python3。在

所以整个代码应该是这样的:

def sumDigits(s):
  if isinstance(s, basestring):  
    total = 0
    new_list = [x for x in s if x.isdigit()]
    for e in new_list:
      total += int(e)
    return total
  else:
    print "What you entered is not a string."

拉斐尔似乎已经指出了这些错误,但仍需注意的是,更具Python式的方法是:

return sum([int(x) for x in s if x.isdigit()]) 

相关问题 更多 >