.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
当我在寻找问题的解决方案时 "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