Страницы

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

воскресенье, 8 декабря 2019 г.

Как работает код [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 писать? Какие в них правила?

    


Ответы

Ответ 1



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

Ответ 2



Вот эквивалент: evens_to_50 = list() for i in range(51): if i % 2 == 0: evens_to_50 += [i] Если хочешь лучше разобраться в основах Python, то советую пойти сюда. Там есть отличные курсы в которых подробно это объясняется. По поводу скобок. Это специальная штука, которая встроена в сам язык. Называется list comprehension и являетсся способом создания списка "на лету"(ведь в квадратных скобках всегда содержется список), т.е. возможность объявить содержимое списка прямо внутри списка Это все основано на механизме итератеров. Если интересно, можешь посмотреть мой конспект, там коротко есть об этом. Лови. Только просьба не винить меня в грамотических ошибках. :) И еще. У тебя в метках стоит слово "массив". Но тут получается не массив как в С или Java, а список. Массив и список - разные вещи и это очень важно.

Ответ 3



print(*(i for i in range(51) if not i % 2)) print({i for i in range(51) if not i % 2}) print({i: i for i in range(51) if not i % 2}) print([i if not i % 2 else '*' for a in range(51) for i in range(a) if a > 22])

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

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