#python #string #sum #digits
#python #строка #сумма #цифры
Вопрос:
Когда я искал решение проблемы «подсчитать цифры в заданной строке, содержащей как буквы, так и цифры», был один со встроенной функцией .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. Я читал, что .isdigit() возвращает true, если в строке есть хотя бы одна неправильная цифра . Где вы это прочитали?
2. [ссылка] tutorialspoint.com/python/string_isdigit.htm . Возможно, я неправильно понял это
3. Самое первое предложение на этой странице: «Метод isdigit() проверяет, состоит ли строка только из цифр».
Ответ №1:
Прежде всего, функция не считает цифры в строке. Он суммирует цифры в строке. Во-вторых, str.isdigit()
возвращает true только в том случае, если все символы в строке являются цифрами, а не только одним из символов. Из str.isdigit()
документации:
Возвращает true, если все символы в строке являются цифрами и есть хотя бы один символ, в противном случае false .
Это означает '1a'.isdigit()
, что это false , потому что в этой строке есть нецифровый символ. Итерация по строке создает строки из 1 символа, поэтому в вашем функциональном цикле всегда есть ровно один символ.
Таким образом, int()
никогда не вызывается ни для одной цифры, потому что выражение генератора отфильтровывает любой символ, который не является цифрой.
Вы можете увидеть, что произойдет, если вместо этого использовать простой for
цикл:
>>> string = 'foo 42 bar 8 1'
>>> for character in string:
... if character.isdigit():
... print(character)
...
4
2
8
1
Потому str.isdigit()
что возвращает значение true только для строк (здесь состоящих всего из одного символа каждая), содержащих только цифры.
Вместо 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