Изучаем 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.19 Mb.
|
83 вы сможете понять общую структуру кода Python, написанного любым другим программистом, соблюдающим те же рекомендации. Если вы рассчитываете ког- да-нибудь стать профессиональным программистом, привыкайте соблюдать эти рекомендации как можно раньше, чтобы выработать полезную привычку. Рекомендации по стилю Когда кто-нибудь хочет внести изменения в язык Python, он пишет документ PEP (Python Enhancement Proposal). Одним из самых старых PEP является документ PEP 8 с рекомендациями по стилевому оформлению кода. PEP 8 довольно длин- ный, но большая часть документа посвящена более сложным программным струк- турам, нежели те, которые встречались вам до настоящего момента. Руководство по стилю Python было написано с пониманием того факта, что код чи- тается чаще, чем пишется. Вы пишете свой код один раз, а потом начинаете читать его, когда переходите к отладке. При расширении функциональности программы вы снова тратите время на чтение своего кода. А когда вашим кодом начинают пользоваться другие программисты, они тоже читают его. Выбирая между написанием кода, который проще пишется, и кодом, который проще читается, программисты Python почти всегда рекомендуют второй вариант. Следующие советы помогут вам с самого начала писать чистый, понятный код. Отступы PEP 8 рекомендует обозначать уровень отступа четырьмя пробелами. Использо- вание четырех пробелов упрощает чтение программы и при этом оставляет доста- точно места для нескольких уровней отступов в каждой строке. В программах форматирования текста для создания отступов часто используются табуляции вместо пробелов. Такой способ хорошо работает в текстовых процес- сорах, но интерпретатор Python приходит в замешательство, когда табуляции смешиваются с пробелами. В каждом текстовом редакторе имеется параметр кон- фигурации, который заменяет нажатие клавиши табуляции заданным количеством пробелов. Конечно, клавиша табуляции удобна, но вы должны проследить за тем, чтобы редактор вставлял в документ пробелы вместо табуляций. Смешение табуляций и пробелов в файле может создать проблемы, сильно за- трудняющие диагностику. Если вы думаете, что в программе табуляции смешались с пробелами, в большинстве редакторов существует возможность преобразования всех табуляций в пробелы. Длина строк Многие программисты Python рекомендуют ограничивать длину строк 80 сим- волами. Исторически эта рекомендация появилась из-за того, что в большинстве 84 Глава 4 • Работа со списками компьютеров в одной строке терминального окна помещалось всего 79 символов. В настоящее время на экранах помещаются куда более длинные строки, но для применения стандартной длины строки в 79 символов существуют и другие при- чины. Профессиональные программисты часто открывают на одном экране сразу несколько файлов; стандартная длина строки позволяет видеть все строки в двух или трех файлах, открытых на экране одновременно. PEP 8 также рекомендует ограничивать комментарии 72 символами на строку, потому что некоторые служеб- ные программы, автоматически генерирующие документацию в больших проектах, добавляют символы форматирования в начале каждой строки комментария. Рекомендации PEP 8 по выбору длины строки не являются незыблемыми, и неко- торые программисты предпочитают ограничение в 99 символов. Пока вы учитесь, длина строки в коде не так важна, но учтите, что при совместной работе в группах почти всегда соблюдаются рекомендации PEP 8. В большинстве редакторов можно установить визуальный ориентир (обычно вертикальную линию на экране), по- казывающий, где проходит граница. ПРИМЕЧАНИЕ В приложении Б показано, как настроить текстовый редактор, чтобы он всегда вставлял четыре пробела при нажатии клавиши табуляции и отображал вер- тикальную линию для соблюдения ограничения длины строки 79 символами . Пустые строки Пустые строки применяются для визуальной группировки частей программы. Ис- пользуйте пустые строки для структурирования файлов, но не злоупотребляйте ими. Примеры, приведенные в книге, помогут вам выработать нужный баланс. Например, если в программе пять строк кода создают список, а затем следующие три строки что- то делают с этим списком, два фрагмента уместно разделить пустой строкой. Тем не менее между ними не стоит вставлять три или четыре пустые строки. Пустые строки не влияют на работу кода, но отражаются на его удобочитаемости. Интерпретатор Python использует горизонтальные отступы для интерпретации смысла кода, но игнорирует вертикальные интервалы. Другие рекомендации PEP 8 содержит много других рекомендаций по стилю, но эти рекомендации в ос- новном относятся к программам более сложным, чем те, которые вы пишете на данный момент. По мере изучения более сложных возможностей Python я буду приводить соответствующие фрагменты рекомендаций PEP 8. УПРАЖНЕНИЯ 4.14. Просмотрите исходное руководство по стилю PEP 8 по адресу https://python .org/dev/ peps/pep-0008/ . Пока вы будете пользоваться им относительно редко, но просмотреть его будет интересно. Итоги 85 4.15. Анализ кода: выберите три программы, написанные в этой главе, и измените каждую в соответствии с рекомендациями PEP 8: • Используйте четыре пробела для каждого уровня отступов. Настройте текстовый редактор так, чтобы он вставлял четыре пробела при каждом нажатии клавиши та- буляции, если это не было сделано ранее (за инструкциями обращайтесь к прило- жению Б). • Используйте менее 80 символов в каждой строке. Настройте редактор так, чтобы он отображал вертикальную черту в позиции 80-го символа. • Не злоупотребляйте пустыми строками в файлах программ. Итоги В этой главе вы научились эффективно работать с элементами списка. Вы узнали, как работать со списком в цикле for , как Python использует отступы для опреде- ления структуры программы и как избежать некоторых типичных ошибок при ис- пользовании отступов. Вы научились создавать простые числовые списки, а также изучили некоторые операции с числовыми списками. Вы узнали, как создать сег- мент списка для работы с подмножеством элементов и как правильно копировать списки с использованием сегмента. Глава завершается описанием кортежей, до определенной степени защищающих наборы значений, которые не должны из- меняться, и рекомендациями по стилевому оформлению вашего кода (сложность которого со временем только возрастает) для упрощения его чтения. В главе 5 мы займемся обработкой различных условий с использованием команд if Вы научитесь группировать относительно сложные наборы проверок для обра- ботки именно той ситуации или информации, которая вам нужна. Также в этой главе рассматривается использование команд if при переборе элементов списка для выполнения действий с элементами, отобранными по некоторому критерию. 5 Команды if Программисту часто приходится проверять наборы условий и принимать решения в зависимости от этих условий. Команда if в языке Python позволяет проверить текущее состояние программы и выбрать дальнейшие действия в зависимости от результатов проверки. В этой главе вы научитесь писать условные проверки для любых интересующих вас условий. Мы начнем с простых команд if , а затем перейдем к более сложным сериям команд if для проверки комбинированных условий. Затем эта концепция будет применена к спискам; вы узнаете, как написать цикл, который выполняет с большинством элементов списка одну операцию, но для некоторых элементов с конкретными значениями применяется особая обработка. Простой пример Следующий короткий пример показывает, как правильно организовать обработ- ку специальных ситуаций с использованием if . Допустим, у вас имеется список машин и вы хотите вывести название каждой машины. Названия большинства машин должны записываться с капитализацией (первая буква в верхнем регистре, остальные в нижнем). С другой стороны, значение 'bmw' должно записываться в верхнем регистре. Следующий код перебирает список названий машин и ищет в нем значение 'bmw' . Для всех элементов, содержащих значение 'bmw' , значение выводится в верхнем регистре: cars.py cars = ['audi', 'bmw', 'subaru', 'toyota'] for car in cars: ❶ if car == 'bmw': print(car.upper()) else: print(car.title()) Проверка условий 87 Цикл в этом примере сначала проверяет, содержит ли car значение 'bmw' . Если проверка дает положительный результат, то значение выводится в верхнем ре- гистре. Если car содержит все, что угодно, кроме 'bmw' , то при выводе значения применяется капитализация: Audi BMW Subaru Toyota В этом примере объединяются несколько концепций, о которых вы узнаете в этой главе. Для начала рассмотрим основные конструкции, применяемые для проверки условий в программах. Проверка условий В каждой команде if центральное место занимает выражение, результатом которо- го является логическая истина ( True ) или логическая ложь ( False ); это выражение называется условием. В зависимости от результата проверки Python решает, должен ли выполняться код в команде if . Если результат условия равен True , то Python выполняет код, следующий за командой if . Если же будет получен результат False , то Python игнорирует код, следующий за командой if Проверка равенства Во многих условиях текущее значение переменной сравнивается с конкретным значением, интересующим вас. Простейшее условие проверяет, равно ли значение переменной конкретной величине: ❶ >>> car = 'bmw' ❷ >>> car == 'bmw' True В строке переменной car присваивается значение 'bmw' ; операция выполняется одним знаком = , как вы уже неоднократно видели. Строка проверяет, равно ли значение car строке 'bmw' ; для проверки используется двойной знак равенства ( == ). Этот оператор возвращает True , если значения слева и справа от оператора равны; если же значения не совпадают, оператор возвращает False . В нашем примере зна- чения совпадают, поэтому Python возвращает True Если car принимает любое другое значение вместо 'bmw' , проверка возвращает False : ❶ >>> car = 'audi' ❷ >>> car == 'bmw' False 88 Глава 5 • Команды if Одиночный знак равенства выполняет операцию; код можно прочитать в форме «Присвоить car значение 'audi' ». С другой стороны, двойной знак равенства, как в строке , задает вопрос: «Значение car равно 'bmw' ?». Такое применение знаков равенства встречается во многих языках программирования. Проверка равенства без учета регистра В языке Python проверка равенства выполняется с учетом регистра. Например, два значения с разным регистром символов равными не считаются: >>> car = 'Audi' >>> car == 'audi' False Если регистр символов важен, такое поведение приносит пользу. Но если проверка должна выполняться на уровне символов без учета регистра, преобразуйте значение переменной к нижнему регистру перед выполнением сравнения: >>> car = 'Audi' >>> car.lower() == 'audi' True Условие возвращает True независимо от регистра символов 'Audi' , потому что проверка теперь выполняется без учета регистра. Функция lower() не изменяет значение, которое изначально хранилось в car , так что сравнение не отражается на исходной переменной: ❶ >>> car = 'Audi' ❷ >>> car.lower() == 'audi' True ❸ >>> car 'Audi' В точке строка 'Audi' сохраняется в переменной car . В точке значение car приводится к нижнему регистру и сравнивается со значением строки 'audi' , также записанным в нижнем регистре. Две строки совпадают, поэтому Python возвращает True . Вывод в точке показывает, что значение, хранящееся в car , не изменилось при вызове lower() Веб-сайты устанавливают определенные правила для данных, вводимых пользова- телями подобным образом. Например, сайт может использовать проверку условия, чтобы убедиться в том, что имя каждого пользователя уникально (а не совпадает с именем другого пользователя, отличаясь от него только регистром символов). Когда кто-то указывает новое имя пользователя, это имя преобразуется к нижнему регистру и сравнивается с версиями всех существующих имен в нижнем регистре. Во время такой проверки имя 'John' будет отклонено, если в системе уже исполь- зуется любая разновидность 'john' Проверка условий 89 Проверка неравенства Если вы хотите проверить, что два значения различны, используйте комбинацию из восклицательного знака и знака равенства ( != ). Восклицательный знак пред- ставляет отрицание, как и во многих языках программирования. Для знакомства с оператором неравенства мы воспользуемся другой командой if В переменной хранится заказанный топпинг к пицце; если клиент не заказал ан- чоусы (anchovies), программа выводит сообщение: toppings.py requested_topping = 'mushrooms' ❶ if requested_topping != 'anchovies': print("Hold the anchovies!") Строка сравнивает значение requested_topping со значением 'anchovies' Если эти два значения не равны, Python возвращает True и выполняет код после команды if . Если два значения равны, Python возвращает False и не выполняет код после команды if Так как значение requested_topping отлично от 'anchovies' , команда print будет выполнена: Hold the anchovies! В большинстве условных выражений, которые вы будете использовать в програм- мах, будет проверяться равенство, но иногда проверка неравенства оказывается более эффективной. Сравнения чисел Проверка числовых значений достаточно прямолинейна. Например, следующий код проверяет, что переменная age равна 18: >>> age = 18 >>> age == 18 True Также можно проверить условие неравенства двух чисел. Например, следующий код выводит сообщение, если значение переменной answer отлично от ожидаемого: magic_ number.py answer = 17 ❶ if answer != 42: print("That is not the correct answer. Please try again!") 90 Глава 5 • Команды if Условие выполняется, потому что значение answer (17) не равно 42. Так как условие истинно, блок с отступом выполняется: That is not the correct answer. Please try again! В условные команды также можно включать всевозможные математические срав- нения: меньше, меньше или равно, больше, больше или равно: >>> age = 19 >>> age < 21 True >>> age <= 21 True >>> age > 21 False >>> age >= 21 False Все эти математические сравнения могут использоваться в условиях if , что повы- шает точность формулировки интересующих вас условий. Проверка нескольких условий Иногда требуется проверить несколько условий одновременно. Например, для выполнения действия бывает нужно, чтобы истинными были сразу два условия; в других случаях достаточно, чтобы истинным было хотя бы одно из двух условий. Ключевые слова and и or помогут вам в подобных ситуациях. Использование and для проверки нескольких условий Чтобы проверить, что два условия истинны одновременно, объедините их ключевым словом and ; если оба условия истинны, то и все выражение тоже истинно. Если хотя бы одно (или оба) условие ложно, то и результат всего выражения равен False Например, чтобы убедиться в том, что каждому из двух людей больше 21 года, ис- пользуйте следующую проверку: ❶ >>> age_0 = 22 >>> age_1 = 18 ❷ >>> age_0 >= 21 and age_1 >= 21 False ❸ >>> age_1 = 22 >>> age_0 >= 21 and age_1 >= 21 True В точке определяются две переменные, age_0 и age_1 . В точке программа про- веряет, что оба значения равны 21 и более. Левое условие выполняется, а правое нет, поэтому все условное выражение дает результат False . В точке переменной age_1 присваивается значение 22. Теперь значение age_1 больше 21; обе проверки проходят, а все условное выражение дает истинный результат. Проверка условий 91 Чтобы код лучше читался, отдельные условия можно заключить в круглые скобки, но это не обязательно. С круглыми скобками проверка может выглядеть так: (age_0 >= 21) and (age_1 >= 21) Использование or для проверки нескольких условий Ключевое слово or тоже позволяет проверить несколько условий, но результат общей проверки является истинным в том случае, когда истинно хотя бы одно или оба условия. Ложный результат достигается только в том случае, если оба условия ложны. Вернемся к примеру с возрастом, но на этот раз проверим, что хотя бы одна из двух переменных больше 21: ❶ >>> age_0 = 22 >>> age_1 = 18 ❷ >>> age_0 >= 21 or age_1 >= 21 True ❸ >>> age_0 = 18 >>> age_0 >= 21 or age_1 >= 21 False Как и в предыдущем случае, в точке определяются две переменные. Так как ус- ловие для age_0 в точке истинно, все выражение также дает истинный результат. Затем значение age_0 уменьшается до 18. При проверке оба условия оказываются ложными, и общий результат всего выражения тоже ложен. Проверка вхождения значений в список Иногда бывает важно проверить, содержит ли список некоторое значение, пре- жде чем выполнять действие. Например, перед завершением регистрации нового пользователя на сайте можно проверить, существует ли его имя в списке имен действующих пользователей, или в картографическом проекте определить, входит ли передаваемое место в список известных мест на карте. Чтобы узнать, присутствует ли заданное значение в списке, воспользуйтесь клю- чевым словом in . Допустим, вы пишете программу для пиццерии. Вы создали список дополнений к пицце, заказанных клиентом, и хотите проверить, входят ли некоторые дополнения в этот список. >>> requested_toppings = ['mushrooms', 'onions', 'pineapple'] ❶ >>> 'mushrooms' in requested_toppings True ❷ >>> 'pepperoni' in requested_toppings False В точках и ключевое слово in приказывает Python проверить, входят ли зна- чения 'mushrooms' и 'pepperoni' в список requested_toppings . Это весьма полезно, |