Страницы

Поиск по вопросам

четверг, 18 октября 2018 г.

Как работает код [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
Этот код генерирует список из четных чисел до пятидесяти. Но мне, как новому в программировании непонятны некоторые моменты - :
Почему генерация происходит в квадратных скобках, их же обычно используют при работе с индексами Что делает первая 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. Поочередные операции называются "итерациями", а вышеописанный объект — итерируемым (iterable)
Выражение 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)...
В данном случае выбираются те числа, которые кратны двум (т.е. чётные).

Комментариев нет:

Отправить комментарий