.isdigit()在这种情况下是如何工作的?

时间:2016-10-11 20:30:35

标签: python string sum digits

当我在寻找问题的解决方案“计算包含字母和数字的给定字符串中的数字”时,有一个内置函数.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'

1 个答案:

答案 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