Начните с изучения внутреннего понимания:
[True for divisor in range(2,10) if number % divisor == 0]
В английском это говорит о том, что для всех divisor
в range(2,10)
, если divisor
равномерно делит number
, то True
будетбыть в списке.Другими словами, список будет состоять из числа True
значений, равных количеству делителей от 2 до 9. Таким образом, если ничего от 2 до 9 не делит number
, список будет пустым.Чтобы сделать это более понятным, абстрагируйте это в функции:
def hasSingleDigitDivisorList(number):
return [True for divisor in range(2,10) if number % divisor == 0]
(Обратите внимание, что эта абстракция предназначена исключительно для понимания выражения. Учитывая, насколько громоздким является название, может не иметь смысла абстрагироватьэтот конкретный кусок кода в производстве.)
Затем замените функцию на понимание списка в исходном выражении:
results = [number for number in range(1,1001) if True in hasSingleDigitDivisorList(number)]
То, что список пуст, когда нет делителей,важный момент, так как проверка True in [...]
не удастся тогда и только тогда, когда список пуст.Другими словами, выражение True in ...
проверяет, есть ли делители от 2 до 9. Превратите это в функцию:
def hasSingleDigitDivisor(number):
return True in hasSingleDigitDivisorList(number)
(hasSingleDigitDivisor
имеет больше смысла как функциональная единица, чем hasSingleDigitDivisorList
, так что вы можете использовать его в проекте.)
Затем подставьте эту новую функцию в общее выражение:
results = [number for number in range(1,1001) if hasSingleDigitDivisor(number)]
В английском языке это выражение собирает все числа от 1 до 1000, еслиу них есть (не единый) одноразрядный делитель, который соответствует комментарию над фрагментом:
#... all of the numbers from 1-1000 that
#are divisible by any single digit besides 1