2016-12-22 3 views
-3

Это «Не дайте мне пять!». ката на кодоводах. (https://www.codewars.com/kata/dont-give-me-five/train/python).Функция sum() добавляет значения?

Вот что вам нужно сделать: «В этом ката вы получите начальный номер и конечный номер региона и должны вернуть счет всех чисел, кроме чисел с 5 в нем. Начальный и конечный номера оба включено!».

Я решил это уродливо, что я не размещаю здесь. То, что я показываю, - это решение одного из пользователей. Он выглядит гладко, но я не понимаю, почему он работает.

def dont_give_me_five(start,end): 
    return sum('5' not in str(i) for i in range(start, end + 1)) 

Я всегда считал, что sum() суммирует значения, а не индексирует. И если я прав, то «i» должен быть значением, а не индексом. Но если это так, почему это решение работает?

+0

«Что я показываю это решение одного из пользователей «. - Почему бы вам не спросить этого пользователя? – TigerhawkT3

+0

'sum' суммирует все, что внутри, оно не преобразует индексы в значения или что-либо магическое. Попробуйте 'print (['5' не в str (i) для i в диапазоне (начало, конец + 1)]). –

+0

Вам нужно 'sum (i для i в диапазоне (начало, конец + 1))' и фильтр 'if '5' not в str (i)'. См. [Понимание генератора] (https://stackoverflow.com/questions/364802/generator-comprehension). –

ответ

2

sum()является добавления значения, произведенные путем экспрессии в генератора. И эти значения являются булевыми, поэтому True и False. В Python, то bool тип представляет собой подкласс int и False имеет целочисленное значение 0, True целое значение 1.

выражение, которое производит логические значения является '5' not in str(i), который вычисляется для каждой из итераций петля for i in range(start, end + 1). Поэтому для каждого i в диапазоне от start до end включительно, он подсчитывает число тех значений, которые не имеют цифру 5 в них:

>>> for i in range(495, 502): 
...  print('{:2d} -> {} == {}'.format(i, '5' not in str(i), int('5' not in str(i)))) 
... 
495 -> False == 0 
496 -> True == 1 
497 -> True == 1 
498 -> True == 1 
499 -> True == 1 
500 -> False == 0 
501 -> False == 0 
>>> sum('5' not in str(i) for i in range(495, 502)) 
4 
+0

Большое спасибо! Теперь это имеет смысл! :))) – Serenity13

Смежные вопросы