Главная страница
Навигация по странице:

  • УПРАЖНЕНИЯ 6.1. Человек

  • 6.3. Глоссарий

  • ПРИМЕЧАНИЕ

  • Мэтиз. Изучаем Python. Crash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g


    Скачать 6.2 Mb.
    НазваниеCrash course2 n d e d i t i o na h a n d s o n, p r o j e c t b a s e d i n t r o d u c t i o n t o p r o g r a m m i n g
    Дата28.06.2022
    Размер6.2 Mb.
    Формат файлаpdf
    Имя файлаМэтиз. Изучаем Python.pdf
    ТипДокументы
    #618322
    страница13 из 52
    1   ...   9   10   11   12   13   14   15   16   ...   52
    111
    При следующем выполнении кода блок if
    - elif
    - else присвоит x_increment большее значение.
    Удаление пар «ключ-значение»
    Когда информация, хранящаяся в словаре, перестает быть нужной, пару «ключ- значение» можно полностью удалить при помощи команды del
    . При вызове до- статочно передать имя словаря и удаляемый ключ.
    Например, в следующем примере из словаря alien_0
    удаляется ключ 'points'
    вместе со значением:
    alien.py
    alien_0 = {'color': 'green', 'points': 5}
    print(alien_0)

    del alien_0['points']
    print(alien_0)
    Строка  приказывает Python удалить ключ 'points'
    из словаря alien_0
    , а также удалить значение, связанное с этим ключом. Из вывода видно, что ключ 'points'
    и его значение 5 исчезли из словаря, но остальные данные остались без изменений:
    {'color': 'green', 'points': 5}
    {'color': 'green'}
    ПРИМЕЧАНИЕ Учтите, что удаление пары «ключ-значение» отменить уже не удастся .
    Словарь с однотипными объектами
    В предыдущем примере в словаре сохранялась разнообразная информация об одном объекте (пришельце из компьютерной игры). Словарь также может исполь- зоваться для хранения одного вида информации о многих объектах. Допустим, вы хотите провести опрос среди коллег и узнать их любимый язык программирования.
    Результаты простого опроса удобно сохранить в словаре:
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
    Пары в словаре в этой записи разбиты по строкам. Ключами являются имена участников опроса, а значениями — выбранные ими языки. Если вы знаете, что для определения словаря потребуется более одной строки, нажмите клавишу
    Enter после ввода открывающей фигурной скобки. Снабдите следующую строку отступом на один уровень (четыре пробела) и запишите первую пару «ключ-

    112 Глава 6 • Словари значение», поставив за ней запятую. После этого при нажатии Enter ваш тексто- вый редактор будет автоматически снабжать все последующие пары таким же отступом, как у первой.
    Завершив определение словаря, добавьте закрывающую фигурную скобку в новой строке после последней пары «ключ-значение» и снабдите ее отступом на один уровень, чтобы она была выровнена по ключам. За последней парой также реко- мендуется поставить запятую, чтобы при необходимости вы смогли легко добавить новую пару «ключ-значение» в следующей строке.
    ПРИМЕЧАНИЕ Во многих редакторах предусмотрены функции, упрощающие фор- матирование расширенных списков и словарей в описанном стиле . Также существуют другие распространенные способы форматирования длинных словарей — вы можете столкнуться с ними в вашем редакторе или в другом источнике .
    Для заданного имени участника опроса этот словарь позволяет легко определить его любимый язык:
    favorite_languages.py
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }

    language = favorite_languages['sarah'].title()
    print(f"Sarah's favorite language is {language}.")
    Чтобы узнать, какой язык выбран пользователем с именем
    Sarah
    , мы запрашиваем следующее значение:
    favorite_languages['sarah']
    Этот синтаксис используется для получения соответствующего языка программи- рования из словаря  и присваивания его переменной language
    . Создание новой переменной существенно упрощает вызов print()
    . В выходных данных показыва- ется значение, связанное с ключом:
    Sarah's favorite language is C.
    Тот же синтаксис может использоваться с любым участником опроса, содержа- щимся в словаре.
    Обращение к значениям методом get()
    Использование синтаксиса с ключом в квадратных скобках для получения инте- ресующего вас значения из словаря имеет один потенциальный недостаток: если запрашиваемый ключ не существует, то вы получите сообщение об ошибке.

    Работа со словарями 113
    Посмотрим, что произойдет при запросе количества очков для пришельца, для которого оно не задано:
    alien_no_points.py
    alien_0 = {'color': 'green', 'speed': 'slow'}
    print(alien_0['points'])
    На экране появляется трассировка с сообщением об ошибке
    KeyError
    :
    Traceback (most recent call last):
    File "alien_no_points.py", line 2, in
    print(alien_0['points'])
    KeyError: 'points'
    Более общие способы обработки подобных ошибок рассматриваются в главе 10.
    Конкретно для словарей можно воспользоваться методом get()
    для назначения значения по умолчанию, которое будет возвращено при отсутствии заданного ключа в словаре.
    В первом аргументе метода get()
    передается ключ. Во втором необязательном ар- гументе можно передать значение, которое должно возвращаться при отсутствии ключа:
    alien_0 = {'color': 'green', 'speed': 'slow'}
    point_value = alien_0.get('points', 'No point value assigned.')
    print(point_value)
    Если ключ 'points'
    существует в словаре, вы получите соответствующее значение; если нет — будет получено значение по умолчанию. В данном случае ключ 'points'
    не существует, поэтому вместо ошибки выводится понятное сообщение:
    No point value assigned.
    Если есть вероятность того, что запрашиваемый ключ не существует, возможно, стоит использовать метод get()
    вместо синтаксиса с квадратными скобками.
    ПРИМЕЧАНИЕ Если второй аргумент при вызове get() опущен, а ключ не существу- ет, то Python вернет специальное значение None — признак того, что значение не суще- ствует . Это не ошибка, а специальное значение, указывающее на отсутствие значения .
    Другие применения None описаны в главе 8 .
    УПРАЖНЕНИЯ
    6.1. Человек: используйте словарь для сохранения информации об известном вам челове- ке. Сохраните имя, фамилию, возраст и город, в котором живет этот человек. Словарь дол- жен содержать ключи с такими именами, как first_name
    , last_name
    , age и city
    . Выведите каждый фрагмент информации, хранящийся в словаре.

    114 Глава 6 • Словари
    6.2. Любимые числа: используйте словарь для хранения любимых чисел. Возьмите пять имен и используйте их как ключи словаря. Придумайте любимое число для каждого чело- века и сохраните его как значение в словаре. Выведите имя каждого человека и его люби- мое число. Чтобы задача стала более интересной, опросите нескольких друзей и соберите реальные данные для своей программы.
    6.3. Глоссарий: словари Python могут использоваться для моделирования «настоящего» словаря (чтобы не создавать путаницу, назовем его глоссарием):
    • Вспомните пять терминов из области программирования, которые вы узнали в пре- дыдущих главах. Используйте эти слова как ключи глоссария, а их определения — как значения.
    • Выведите каждое слово и его определение в аккуратно отформатированном виде.
    Например, вы можете вывести слово, затем двоеточие и определение или же слово в одной строке, а его определение — с отступом в следующей строке. Используйте символ новой строки
    (\n)
    для вставки пустых строк между парами «слово — опре- деление» в выходных данных.
    Перебор словаря
    Словарь Python может содержать как несколько пар «ключ-значение», так и мил- лионы таких пар. Поскольку словарь может содержать большие объемы данных,
    Python предоставляет средства для перебора элементов словаря. Информация может храниться в словарях по-разному, поэтому предусмотрены разные способы перебора. Программа может перебрать все пары «ключ-значение» в словаре, только ключи или только значения.
    Перебор всех пар «ключ-значение»
    Прежде чем рассматривать разные способы перебора, рассмотрим новый словарь, предназначенный для хранения информации о пользователе веб-сайта. В следую- щем словаре хранится имя пользователя, его имя и фамилия:
    user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',
    }
    То, что вы уже узнали в этой главе, позволит вам обратиться к любому отдельному атрибуту user_0
    . Но что, если вы хотите просмотреть все данные из словаря этого пользователя? Для этого можно воспользоваться перебором в цикле for
    :
    user.py
    user_0 = {
    'username': 'efermi',
    'first': 'enrico',
    'last': 'fermi',

    Перебор словаря 115
    }

    for key, value in user_0.items():

    print(f"\nKey: {key}")

    print(f"Value: {value}")
    Как мы видим в точке , чтобы написать цикл for для словаря, необходимо соз- дать имена для двух переменных, в которых будет храниться ключ и значение из каждой пары «ключ-значение». Этим двум переменным можно присвоить любые имена — с короткими однобуквенными именами код будет работать точно так же:
    for k, v in user_0.items()
    Вторая половина команды for в точке  включает имя словаря, за которым следует вызов метода items()
    , возвращающий список пар «ключ-значение». Цикл for со- храняет компоненты пары в двух указанных переменных. В предыдущем примере мы используем переменные для вывода каждого ключа , за которым следует связанное значение .
    "\n"
    в первой команде print гарантирует, что перед каждой парой «ключ-значение» в выводе будет вставлена пустая строка:
    Key: last
    Value: fermi
    Key: first
    Value: enrico
    Key: username
    Value: efermi
    Перебор всех пар «ключ-значение» особенно хорошо работает для таких словарей, как в примере favorite_languages.py на с. ___: то есть для словарей, хранящих один вид информации со многими разными ключами. Перебрав словарь favorite_
    languages
    , вы получите имя каждого человека и его любимый язык программиро- вания. Так как ключ всегда содержит имя, а значение — язык программирования, в цикле вместо имен key и value используются переменные name и language
    . С таким выбором имен читателю кода будет проще следить за тем, что происходит в цикле:
    favorite_languages.py
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }

    for name, language in favorite_languages.items():

    print(f"{name.title()}'s favorite language is {language.title()}.")
    Код в точке  приказывает Python перебрать все пары «ключ-значение» в словаре.
    В процессе перебора пар ключ сохраняется в переменной name
    , а значение — в пере-

    116 Глава 6 • Словари менной language
    . С этими содержательными именами намного проще понять, что делает команда print в точке .
    Всего в нескольких строках кода выводится вся информация из опроса:
    Jen's favorite language is Python.
    Sarah's favorite language is C.
    Edward's favorite language is Ruby.
    Phil's favorite language is Python.
    Такой способ перебора точно так же работает и в том случае, если в словаре будут храниться результаты опроса тысяч и даже миллионов людей.
    Перебор всех ключей в словаре
    Метод keys()
    удобен в тех случаях, когда вы не собираетесь работать со всеми значениями в словаре. Переберем словарь favorite_languages и выведем имена всех людей, участвовавших в опросе:
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }

    for name in favorite_languages.keys():
    print(name.title())
    Строка  приказывает Python извлечь из словаря favorite_languages все ключи и последовательно сохранять их в переменной name
    . В выходных данных представ- лены имена всех людей, участвовавших в опросе:
    Jen
    Sarah
    Edward
    Phil
    На самом деле перебор ключей используется по умолчанию при переборе словаря, так что этот код будет работать точно так же, как если бы вы написали for name in favorite_languages:
    вместо…
    for name in favorite_languages.keys():
    Используйте явный вызов метода keys()
    , если вы считаете, что он упростит чтение вашего кода, или опустите его при желании.

    Перебор словаря 117
    Чтобы обратиться в цикле к значению, связанному с интересующим вас ключом, используйте текущий ключ. Для примера выведем для пары друзей сообщение о выбранном ими языке. Мы переберем имена в словаре, как это делалось ранее, но когда имя совпадает с именем одного из друзей, программа будет выводить специ- альное сообщение об их любимом языке:
    favorite_languages = {
    }

    friends = ['phil', 'sarah']
    for name in favorite_languages.keys():
    print(name.title())

    if name in friends:

    language = favorite_languages[name].title()
    print(f"\t{name.title()}, I see you love {language}!")
    В точке  строится список друзей, для которых должно выводиться сообщение.
    В цикле выводится имя очередного участника опроса, а затем в точке  программа проверяет, входит ли текущее имя в список friends
    . Если имя входит в список, вы- водится специальное приветствие с упоминанием выбранного языка .
    Выводятся все имена, но для наших друзей выводится специальное сообщение:
    Hi Jen.
    Hi Sarah.
    Sarah, I see you love C!
    Hi Edward.
    Hi Phil.
    Phil, I see you love Python!
    Метод keys()
    также может использоваться для проверки того, участвовал ли кон- кретный человек в опросе:
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }

    if 'erin' not in favorite_languages.keys():
    print("Erin, please take our poll!")
    Метод keys()
    не ограничивается перебором: он возвращает список всех ключей, и строка  просто проверяет, входит ли ключ 'erin'
    в список. Так как ключ в спи- ске отсутствует, программа выводит сообщение:
    Erin, please take our poll!

    118 Глава 6 • Словари
    Перебор ключей словаря в определенном порядке
    Начиная с Python версии 3.7, перебор содержимого словаря возвращает элементы в том порядке, в каком они вставлялись. Тем не менее иногда требуется перебрать элементы словаря в другом порядке.
    Один из способов получения элементов в определенном порядке основан на сор- тировке ключей, возвращаемых циклом for
    . Для получения упорядоченной копии ключей можно воспользоваться функцией sorted()
    :
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
    for name in sorted(favorite_languages.keys()):
    print(f"{name.title()}, thank you for taking the poll.")
    Эта команда for не отличается от других команд for
    , если не считать того, что метод dictionary.keys()
    заключен в вызов функции sorted()
    . Эта конструкция приказывает Python выдать список всех ключей в словаре и отсортировать его перед тем, как перебирать элементы. В выводе перечислены все пользователи, участвовавшие в опросе, а их имена упорядочены по алфавиту:
    Edward, thank you for taking the poll.
    Jen, thank you for taking the poll.
    Phil, thank you for taking the poll.
    Sarah, thank you for taking the poll.
    Перебор всех значений в словаре
    Если вас прежде всего интересуют значения, содержащиеся в словаре, используйте метод values()
    для получения списка значений без ключей. Допустим, вы хотите просто получить список всех языков, выбранных в опросе, и вас не интересуют имена людей, выбравших каждый язык:
    favorite_languages = {
    'jen': 'python',
    'sarah': 'c',
    'edward': 'ruby',
    'phil': 'python',
    }
    print("The following languages have been mentioned:")
    for language in favorite_languages.values():
    print(language.title())
    Команда for читает каждое значение из словаря и сохраняет его в переменной language
    . При выводе этих значений будет получен список всех выбранных языков:

    Перебор словаря 119
    The following languages have been mentioned:
    Python
    C
    Python
    Ruby
    Значения извлекаются из словаря без проверки на возможные повторения. Для не- больших словарей это может быть приемлемо, но в опросах с большим количеством респондентов список будет содержать слишком много дубликатов. Чтобы получить список выбранных языков без повторений, можно воспользоваться множеством
    (set). Множество в целом похоже на список, но все его элементы должны быть уникальными:
    favorite_languages = {
    }
    print("The following languages have been mentioned:")

    for language in set(favorite_languages.values()):
    print(language.title())
    Когда список, содержащий дубликаты, заключается в вызов set()
    , Python находит уникальные элементы списка и строит множество из этих элементов. В точке  set()
    используется для извлечения уникальных языков из favorite_languages.
    values()
    В результате создается не содержащий дубликатов список языков программиро- вания, упомянутых участниками опроса:
    The following languages have been mentioned:
    Python
    C
    Ruby
    В ходе дальнейшего изучения Python вы часто будете обнаруживать встроенные возможности языка, которые помогают сделать с данными именно то, что вам требуется.
    ПРИМЕЧАНИЕ Множество можно построить прямо в фигурных скобках с разделени- ем элементов запятыми:
    >>> languages = {'python', 'ruby', 'python', 'c'}
    >>> languages
    {'ruby', 'python', 'c'}
    Словари легко перепутать с множествами, потому что обе структуры заключаются в фи- гурные скобки . Когда вы видите фигурные скобки без пар «ключ-значение», скорее всего, перед вами множество . В отличие от списков и словарей, элементы множеств не хранятся в каком-либо определенном порядке .

    120 Глава 6 • Словари
    УПРАЖНЕНИЯ
    6.4. Глоссарий 2: теперь, когда вы знаете, как перебрать элементы словаря, упростите код из упражнения 6.3, заменив серию команд print циклом, перебирающим ключи и значе- ния словаря. Когда вы будете уверены в том, что цикл работает, добавьте в глоссарий еще пять терминов Python. При повторном запуске программы новые слова и значения должны быть автоматически включены в вывод.
    6.5. Реки: создайте словарь с названиями трех больших рек и стран, по которым протекает каждая река. Одна из возможных пар «ключ-значение» —
    'nile':
    'egypt'
    • Используйте цикл для вывода сообщения с упоминанием реки и страны — напри- мер, «The Nile runs through Egypt».
    • Используйте цикл для вывода названия каждой реки, включенной в словарь.
    • Используйте цикл для вывода названия каждой страны, включенной в словарь.
    6.6. Опрос: возьмите за основу код favorite_languages .py
    (с. 115).
    • Создайте список людей, которые должны участвовать в опросе по поводу любимого языка программирования. Включите некоторые имена, которые уже присутствуют в списке, и некоторые имена, которых в списке еще нет.
    • Переберите список людей, которые должны участвовать в опросе. Если они уже прошли опрос, выведите сообщение с благодарностью за участие. Если они еще не проходили опрос, выведите сообщение с предложением принять участие.
    Вложение
    Иногда бывает нужно сохранить множество словарей в списке или сохранить список как значение элемента словаря. Создание сложных структур такого рода называется вложением. Вы можете вложить множество словарей в список, список элементов в словарь или даже словарь внутрь другого словаря. Как на- глядно показывают следующие примеры, вложение — чрезвычайно мощный механизм.
    Список словарей
    Словарь alien_0
    содержит разнообразную информацию об одном пришельце, но в нем нет места для хранения информации о втором пришельце, не говоря уже о целом экране, забитом пришельцами. Как смоделировать флот вторжения?
    Например, можно создать список пришельцев, в котором каждый элемент пред- ставляет собой словарь с информацией о пришельце. Например, следующий код строит список из трех пришельцев:
    1   ...   9   10   11   12   13   14   15   16   ...   52


    написать администратору сайта