Как работает код [i for i in range(51) if i % 2 == 0]?
📁 список, python, ии
evens_to_50 = [i for i in range(51) if i % 2 == 0]print evens_to_50Этот код генерирует список из четных чисел до пятидесяти. Но мне, как новому в программировании непонятны некоторые моменты - :
- Почему генерация происходит в квадратных скобках, их же обычно используют при работе с индексами
- Что делает первая i перед циклом for? Почему после range(51) нет двоеточия и перевода на новую линию с табулированием?
- Где еще могут использоваться квадратные скобки?
- В квадратных скобках можно сколько угодно if или for писать? Какие в них правила?
Эта конструкция называется ""генератор"". Это способ в одну строку создать список (массив), наполненный значениями. Двоеточия нет именно потому, что это не цикл for, а генератор. Давайте разберем подробно:
[i for i in range(51) if i % 2 == 0]или в более общем виде:
[expr(variable) for variable in iterable if condition(variable)]Здесь:
iterable— некий объект, из которого можно один за другим получать значения (пока не кончатся). Список, кортеж или, например, ключи словаря. Отсюда поштучно берутся значения и присваиваются переменнойvariable. Поочередные операции называются ""итерациями"", а вышеописанный объект — .Выражение
range(51)возвращает список натуральных чисел от 0 до 50 включительно. Их мы и перебираем.variable(имя произвольное) — просто переменная, поочередно принимающая все значения изiterable. Работает точно так же, как счетчик в цикле.expr(variable)— любая функция, которая возвращает значение. Она может принимать аргументомvariable, может что угодно ещё, может вообще ничего не принимать. Понятно, чтоiвозвращает просто значениеiв неизменном виде. Возвращаемые этой функцией значения становятся элементами генерируемого списка. Другие примеры:[i**2 for i in range(51)]– квадраты чисел[0 for i in range(51)]– просто заполняем нулями
condition(variable)— необязательное условие. Если оно присутствует, то в полученный список войдут только те значения, для которыхcondition(variable) == True. Можно написать одноif, но внутри может быть сколь угодно сложное выражение, т.е.if a(i) and b(i) or c(i)...В данном случае выбираются те числа, которые кратны двум (т.е. чётные).
Войдите чтобы оставить ответ