当我在寻找问题的解决方案“计算包含字母和数字的给定字符串中的数字”时,有一个内置函数.isdigit()。这是:
def count_numbers1(a):
return sum(int(x) for x in a if x.isdigit())
它运作良好,但我无法得到它的工作原理。我已经读过,如果字符串中至少有一个数字,则.isdigit()
返回true,否则返回false。
还有一个问题:函数如何“取出”字符串中的数字并将其转换为整数以及它如何跳过字母?为什么int(x)
当x
是一封信时不会产生错误?如:
>>> int('a')
Traceback (most recent call last):
File "<pyshell#77>", line 1, in <module>
int('a')
ValueError: invalid literal for int() with base 10: 'a'
答案 0 :(得分:7)
首先,该函数不会计算字符串中的位数。 总结字符串中的数字。其次,str.isdigit()
仅在字符串中的所有字符为数字时才返回true,而不仅仅是其中一个字符。来自str.isdigit()
documentation:
如果字符串中的所有字符都是数字且至少有一个字符,则返回true,否则返回false。
这意味着'1a'.isdigit()
为false,因为该字符串中有一个非数字字符。对字符串的迭代产生1个字符的字符串,因此函数循环中总会有一个字符。
因此,int()
永远不会被调用任何非数字,因为generator expression过滤掉任何不是数字的字符。
如果您使用简单的for
循环,您可以看到会发生什么:
>>> string = 'foo 42 bar 8 1'
>>> for character in string:
... if character.isdigit():
... print(character)
...
4
2
8
1
因为str.isdigit()
仅对字符串返回true(此处仅包含一个字符),所以只包含 数字。
您可以使用list comprehension来生成列表,而不是for
循环:
>>> [c for c in string if c.isdigit()]
['4', '2', '8', '1']
现在很容易添加int()
来电并看到差异:
>>> [int(c) for c in string if c.isdigit()]
[4, 2, 8, 1]
因为只传递数字,int()
总是有效,所以永远不会在字母上调用它。
您的函数然后对这些值使用sum()
,因此对于我的示例字符串,加起来4 + 2 + 8 + 1是15:
>>> sum(int(c) for c in string if c.isdigit())
15