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

how does .isdigit() work in this case?

当我在寻找问题的解决方案时 "count digits in a given string containing both letters and digits" 有一个内置函数 .isdigit()。这是:

def count_numbers1(a):
    return sum(int(x) for x in a if x.isdigit())

它工作得很好,但我不知道它是如何工作的。我读过 .isdigit() returns 如果字符串中至少有一个数字则为真否则为假。

还有一个问题:"takes out" 函数如何从字符串中提取数字并将其转换为整数以及如何跳过字母?为什么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'

首先,该函数不会计算 字符串中的数字。它总结 字符串中的数字。其次,如果字符串中的 所有 个字符都是数字,而不仅仅是其中一个字符,则 str.isdigit() 只有 returns 为真。来自 str.isdigit() documentation:

Return true if all characters in the string are digits and there is at least one character, false otherwise.

这意味着 '1a'.isdigit() 为假,因为该字符串中有一个非数字字符。迭代一个字符串会产生 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() 仅 returns 字符串(此处每个字符仅包含一个字符)包含 个数字。

您可以使用 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