Изучение 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! Используйте их в своем коде, и вы получите более читаемый, немного более быстрый и лаконичный код. Существует так много вариантов использования понимания, что мы не коснулись поверхности, но теперь у вас должны быть инструменты, чтобы разбираться в них по мере их появления. Обратите внимание, что есть также генераторы и наборы, которые мы не коснулись, но они имеют очень похожий синтаксис. Спасибо, что прочитали, а теперь напишите несколько замечательных идей!