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

Dar*_*ova 0 python string sum digits

当我在寻找问题的解决方案"计算包含字母和数字的给定字符串中的数字"时,有一个内置函数.isdigit().这里是:

def count_numbers1(a):
    return sum(int(x) for x in a if x.isdigit())
Run Code Online (Sandbox Code Playgroud)

它工作得很好,但我无法得到它的工作原理.我已经读过,.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'
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 7

首先,该函数不计算字符串中的数字.它汇总了字符串中的数字.其次,str.isdigit()只有当字符串中的所有字符都是数字而不只是其中一个字符时,才返回true .从str.isdigit()文档:

如果字符串中的所有字符都是数字并且至少有一个字符,则返回true,否则返回false.

这意味着'1a'.isdigit()错误,因为该字符串中存在非数字字符.对字符串的迭代会生成1个字符的字符串,因此函数循环中始终只有一个字符.

因此,int()永远不会调用任何非数字,因为生成器表达式会筛选出任何不是数字的字符.

你可以看到如果你使用一个简单的for循环会发生什么:

>>> string = 'foo 42 bar 8 1'
>>> for character in string:
...     if character.isdigit():
...         print(character)
...
4
2
8
1
Run Code Online (Sandbox Code Playgroud)

因为str.isdigit()只对字符串返回true(这里只包含一个字符)包含数字.

for您可以使用列表推导来生成列表,而不是循环:

>>> [c for c in string if c.isdigit()]
['4', '2', '8', '1']
Run Code Online (Sandbox Code Playgroud)

现在可以轻松添加该int()调用并查看差异:

>>> [int(c) for c in string if c.isdigit()]
[4, 2, 8, 1]
Run Code Online (Sandbox Code Playgroud)

因为只有数字通过,int()总是有效,所以从不在字母上调用它.

然后你的函数使用sum()这些值,所以对于我的示例字符串,加起来4 + 2 + 8 + 1是15:

>>> sum(int(c) for c in string if c.isdigit())
15
Run Code Online (Sandbox Code Playgroud)