所以我最近在完成大部分LPTHW之后,选择了John Guttag的计算和使用Python编程简介,修订版和扩展版。我正在和MIT OCW 006一起使用这本书。现在,我试图完成本书中列出的一个手指练习,特别是第85页第7章,其中作者要求你使用一个实现一个功能。 try-except block:
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"""
这是我的代码:
def sumDigits(s):
try:
total = 0
list1 = [s]
new_list = [x for x in list1 if x.isdigit()]
for e in new_list:
total += new_list[e]
return total
except TypeError:
print "What you entered is not a string."
当我使用测试输入在IDLE中运行此程序时,总计计算为零,表示new_list的所有元素都没有传递给累加器。有人可以建议为什么吗?感谢。
答案 0 :(得分:2)
看起来Rafael已经指出了这些错误,但是仍然需要注意的是,采用这种方式的pythonic方法就越多:
return sum([int(x) for x in s if x.isdigit()])
答案 1 :(得分:1)
您的代码实际上有几处错误。
让我们详细分解它们
主要问题在于以下几行:
list1 = [s]
new_list = [x for x in list1 if x.isdigit()]
你应该首先直接在字符串上循环
new_list = [x for x in s if x.isdigit()] #s is the input string
当您创建新列表时,x
中的变量x for x in list1
将作为列表的元素发生。因此,在您的情况下,列表将只有一个元素,恰好是整个字符串(因为您将列表定义为[s]
。由于整个字符串不是数字,new_list
将是一个空列表。
这就是为什么你得到0作为回报。
但是,如果直接遍历字符串,x
将作为字符串中的每个字母发生,然后就可以检查x
是否为数字。
强调new_list[e]
会提升IndexError
也很重要。您应该仅针对e
更正。 for e in new_list
的sintax使局部变量e
假定列表中的每个值,因此您不必通过索引获取值:您可以使用{{1}直接
最后,为了对new_list中的值求和,值应为整数(e
)而不是字符串(int
),因此在求和之前必须将值转换为str
(或者,您可以使用int
代替int
在列表推导期间将每个元素投射到int(x) for x in s if x.isdigit()
。另外,为了检查输入是否为字符串,如果你在python2中,最好使用x for x in s if x.isdigit()
,如果你使用python3,最好使用isinstance(s, basestring)
。
所以整个代码看起来像这样:
isinstance(s, str)
答案 2 :(得分:0)
我正在阅读同一本书以及关于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不是字符串的情况。这么简单,但一开始对我来说并不明显。
答案 3 :(得分:0)
您可以使用 reduce 方法
reduce( (lambda x, y: x + y), [int(x) for x in new if x.isdigit()] )
答案 4 :(得分:0)
我也在读同一本书。我认为我们应该使用try-except块来确定字符串的字符是否可转换为整数。所以这是我的解决方案。
from requests_html import HTMLSession
with open('path_to_my_javascript_file', 'rb') as js:
script = '() => {' + js.read().decode() + 'return globalFunc()}'
session = HTMLSession()
r = session.get('http://rheal.com.br/vagas')
r.html.render(script=script)
print(r.html.text)