аватар question@mail.ru · 01.01.1970 03:00

Как работает код [i for i in range(51) if i % 2 == 0]?

evens_to_50 = [i for i in range(51) if i % 2 == 0]print evens_to_50

Этот код генерирует список из четных чисел до пятидесяти. Но мне, как новому в программировании непонятны некоторые моменты - :

  1. Почему генерация происходит в квадратных скобках, их же обычно используют при работе с индексами
  2. Что делает первая i перед циклом for? Почему после range(51) нет двоеточия и перевода на новую линию с табулированием?
  3. Где еще могут использоваться квадратные скобки?
  4. В квадратных скобках можно сколько угодно if или for писать? Какие в них правила?
аватар answer@mail.ru · 01.01.1970 03:00

Эта конструкция называется ""генератор"". Это способ в одну строку создать список (массив), наполненный значениями. Двоеточия нет именно потому, что это не цикл 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)...

    В данном случае выбираются те числа, которые кратны двум (т.е. чётные).

Последние

Похожие