Изучение Python / Начинающий / Учебник
Список Python. Понятия II: Затерянные в Нью-Йорке
Руководство для начинающих по пониманию объектов Python и защите вашего дома от взломщика типа Джо Пеши.
Как вы, несомненно, помните из моей последней статьи на эту тему, понимание списков позволяет создавать более динамичные, удобочитаемые и эффективные списки. Однако понимание - это гораздо больше, чем просто добавление элементов в список из существующего итеративного объекта. Мы можем сделать более эффективные понимания, используя условные операторы, вводя более одной фиктивной переменной и используя другие понимания классов Python, такие как понимание словаря.
При одном условии…
В прошлый раз мы рассмотрели, как составить базовое понимание списка. Теперь мы пойдем немного глубже. Давайте посмотрим на наш пример [x+5 for x in range(6)]
из прошлого раза. Напомним, что этот цикл проходит по итерируемому range(6)
и добавляет 5
к каждому из них. Мы возвращаем список [5,6,7,8,9,10]
. Но что, если бы мы хотели добавить больше силы этому утверждению? Что, если нам нужен список только четных чисел? Мы можем сделать это, добавив к нашему пониманию списка оператор if
.
Сначала мы спрашиваем: как мы можем определить, является ли число четным? Мы можем использовать оператор по модулю, который делит одно число на второе, а затем возвращает остаток. Мы можем использовать этот оператор, чтобы разделить каждое число на 2 и проверить, возвращает ли оно 0, что означает четность. Например: 24 ÷ 2 = 0
без остатка, поэтому 24 % 2 == 0
возвращает True
. В понимании списка, если мы хотим вернуть список элементов, которые соответствуют только определенным квалификациям, мы добавляем оператор if
после итерируемого, в случае нашего примера:
[x+5 for x in range(6) if (x+5) % 2 == 0]
Out[0]:[6,8,10]
Обратите внимание, что в выходном списке меньше элементов, чем было в итерации, которую мы перебирали.
Или еще?
Мы также можем вернуть список, который сообщает x + 5
или что это странно, добавив оператор else после оператора if. ПОВОРОТ ПЕРЕДАЧИ: однако, когда вы выполняете оператор if/else
в понимании списка, вы помещаете его ПЕРЕД оператором for
. В этом случае:
[x+5 if (x + 5) % 2 == 0 else "ODD!" for x in range(6)]
Out[0]: ['ODD!', 6, 'ODD!', 8, 'ODD!', 10]
(Зачем вам нужен такой выходной список?)
Если вы попытаетесь поставить if/else
в конце понимания списка, вы получите SyntaxError
. То же самое происходит, если вы пытаетесь поставить JUST оператор if
перед оператором for
. Это может быть трудно соблюдать прямо, поэтому один из способов запомнить - это произнести вслух логику понимания списка в виде предложения.
Во-первых, давайте напомним себе о нескольких вещах: все, что идет до этого for
утверждения, попадает в ваш окончательный список. С оператором if/else
происходит либо одно, либо другое, поэтому в вашем окончательном списке будет запись для каждого элемента в итерации. Только if
в конце сократит количество записей в вашем окончательном списке, потому что он будет помещен в него только ЕСЛИ, он соответствует вашим критериям.
Итак, сначала без условных выражений логическое предложение было бы таким:
«Поместите ЭТО в мой список ДЛЯ каждого ПУНКТА в моем ИТЕРАБЕЛЕ».
С помощью всего лишь
if/else
утверждения мы можем сказать:
«Либо поместите ЭТО в мой список, ЕСЛИ он четный, либо добавьте ЭТО ДРУГОЕ значение ДЛЯ каждого ЭЛЕМЕНТА в моем ИТЕРАБЕЛЕ.
Для простого
if
утверждения мы бы сказали:
«Поместите ЭТО в список ДЛЯ каждого ПУНКТА в моем ИТЕРАБЕЛЕ, но только ЕСЛИ он четный».
Работа со словарями в качестве итерабельности
Если у вас есть словарь, который вы хотите использовать в качестве итеративного для понимания списка, есть несколько способов сделать это. Если вы хотите работать только с ключами, вы можете просто вызвать dict.keys()
в качестве элемента, который нужно пройти в цикле, тогда как вы можете вызвать dict.values()
, чтобы ваша фиктивная переменная перебирала каждое из значений в словаре ключ, пара значений. Однако один очень действенный вариант использования - иметь доступ к обоим. Для этого мы вызываем dict.items()
в цикле. Когда мы запускаем этот код:
nname = {"Kevin": "Les Incompetants", "Marv_Harry": "StickyBandits"} [x for x in nname.items()] Out[2]: [('Kevin', 'Les Incompetants'), ('Marv_Harry', 'StickyBandits')]
Обратите внимание, что список состоит из кортежей: ключ и значение связаны вместе. Мы можем получить к ним более мощный доступ, немного изменив наш оператор for.
nname = {"Kevin": "Les Incompetants", "Marv_Harry": "StickyBandits"} ['{} aka {}'.format(key,value) for key, value in nname.items()] Out[2]: ['Kevin aka Les Incompetants', 'Marv_Harry aka StickyBandits']
Давайте разберем этот код. Мы берем каждую пару ключ / значение в строку, которая представляет их по псевдонимам. Если вы еще не сталкивались с методом string.format()
, прочтите об этом здесь и возвращайтесь. Настоящая сила здесь в том, что вы можете использовать пары ключ и значение вместе, создавать с их помощью условные выражения и т. Д. По мере того, как мы вводим больше этих концепций, выразительность нашего кода увеличивается.
Толкование словаря
Хорошо, теперь, когда вы опытный профессионал в понимании списков, давайте посмотрим, как это влияет на другие понимания. Синтаксис для создания словаря невероятно похож. Единственная разница в том, что теперь для каждой записи нужно писать две вещи: ключ и значение. Используя псевдокод, вы пишете это как {key: value for dummy variable in iterable}
Если вы хотите создать словарь с числами 1–5 в качестве ключей и соответствующим числом в третьей степени в качестве значений, вы можете записать это как {x: x**3 for x in range(1,6)}
, это приведет к выводу {1: 1, 2: 8, 3: 27, 4: 64, 5: 125}
.
Соберем все вместе
Хорошо, давайте посмотрим, сможем ли мы собрать все это воедино. Допустим, вы остались дома одни, а ваша семья была в отпуске, а вам всего 8 лет. Тем временем пара мультяшных грабителей дает понять, что они знают, что ваш дом незащищен, и собираются ворваться и ограбить вас. Мы все были там!
Хорошая новость заключается в том, что вы не просто гениальный ребенок с пограничным социопатом, страдающий насилием, вы также вундеркинд в программировании. Вы запускаете несколько продвинутых компьютерных симуляторов взлома, чтобы узнать, как вы можете защитить свой дом, и он выдает список Python из сотен защитных маневров, которые вы можете попробовать в своем доме, и процент, который они могут навсегда повредить Джо Песку - я имею в виду грабителей. Вам нужен только список тактик, вероятность нанесения непоправимого вреда которых превышает 75%. Давайте взглянем на первые три пункта из вашего списка:
Итак, если мы хотим использовать код, чтобы дать нам только названия тактик, которые будут наиболее эффективными, мы могли бы создать словарь, в котором имена каждой тактики были бы ключом, а вероятность - значением.
Для этого мы можем вызвать метод .split()
, который мы использовали в первой статье, чтобы разделить слова, выбрать второе слово (index [1]
) и сделать его ключом, а затем выбрать первое слово ( index [0]
), принудительно введите int
, а затем установите для него значение. Попробуйте сделать это самостоятельно, прежде чем проверять свою работу ниже.
Теперь мы можем собрать все это вместе, выполнив составление списка, используя словарь как итерацию и используя условное выражение, если значение словаря больше 75. Опять попробуйте это самостоятельно, а затем посмотрите решение ниже:
Et violà! Вы запускаете это в полном списке, и теперь у вас есть десятки вариантов, которые вы можете использовать, чтобы почти убить этих грабителей! Вы спасаете дом, и с помощью вашего соседа, которого вы когда-то считали пугающим, эти двое больше никогда не смогут причинить вам вреда, может быть, в следующем году при аналогичных обстоятельствах ...
Отличная работа!
Теперь вы эксперт по основам понимания Python! Используйте их в своем коде, и вы получите более читаемый, немного более быстрый и лаконичный код. Существует так много вариантов использования понимания, что мы не коснулись поверхности, но теперь у вас должны быть инструменты, чтобы разбираться в них по мере их появления. Обратите внимание, что есть также генераторы и наборы, которые мы не коснулись, но они имеют очень похожий синтаксис. Спасибо, что прочитали, а теперь напишите несколько замечательных идей!