Книга Изучаем Python
Скачать 4.68 Mb.
|
80 Глава 4 • Работа со списками большую длину, но бульшая часть документа посвящена более сложным про- граммным структурам, нежели те, которые встречались вам до настоящего момента. Руководство по стилю Python было написано с учетом того факта, что код читается чаще, чем пишется. Вы пишете свой код один раз, а потом начинаете читать его, когда переходите к отладке. При расширении функциональности программы вы снова тратите время на чтение своего кода. А когда вашим кодом начинают поль- зоваться другие программисты, они тоже читают его. Выбирая между написанием кода, который проще пишется, и кодом, который проще читается, программисты Python почти всегда рекомендуют второй вариант. Следующие советы помогут вам с самого начала писать чистый, понятный код. Отступы PEP 8 рекомендует обозначать уровень отступа четырьмя пробелами. Использо- вание четырех пробелов упрощает чтение программы и при этом оставляет доста- точно места для нескольких уровней отступов в каждой строке. В программах форматирования текста для создания отступов часто используются табуляции вместо пробелов. Такой способ хорошо работает в текстовых про- цессорах, но интерпретатор Python приходит в замешательство, когда табуляции смешиваются с пробелами. В каждом текстовом редакторе имеется параметр кон- фигурации, который заменяет нажатие клавиши табуляции заданным количеством пробелов. Конечно, клавиша табуляции удобна, но вы должны проследить за тем, чтобы редактор вставлял в документ пробелы вместо табуляций. Смешение табуляций и пробелов в файле может создать проблемы, сильно за- трудняющие диагностику. Если вы думаете, что в программе табуляции смешались с пробелами, помните, что в большинстве редакторов существует возможность преобразования всех табуляций в пробелы. Длина строк Многие программисты Python рекомендуют ограничивать длину строк 80 сим- волами. Исторически эта рекомендация появилась из-за того, что в большинстве компьютеров в одной строке терминального окна помещалось всего 79 символов. В настоящее время на экранах помещаются куда более длинные строки, но для применения стандартной длины строки в 79 символов существуют и другие при- чины. Профессиональные программисты часто открывают на одном экране сразу несколько файлов; стандартная длина строки позволяет видеть все строки в двух или трех файлах, открытых на экране одновременно. PEP 8 также рекомендует ограничивать комментарии 72 символами на строку, потому что некоторые служебные программы, автоматически генерирующие документацию в больших проектах, добавляют символы форматирования в начале каждой строки коммен- тария. Рекомендации PEP 8 по выбору длины строки не являются незыблемыми, и неко- торые программисты предпочитают ограничение в 99 символов. Пока вы учитесь, Стиль программирования 81 длина строки в коде не так важна, но учтите, что при совместной работе в группах почти всегда соблюдаются рекомендации PEP 8. В большинстве редакторов можно установить визуальный ориентир (обычно вертикальную линию на экране), по- казывающий, где проходит граница. ПРИМЕЧАНИЕ В приложении Б показано, как настроить текстовый редактор, чтобы он всегда вставлял четыре пробела при нажатии клавиши табуляции и отображал вертикальную линию для соблюдения огра- ничения длины строки 79 символами . Пустые строки Пустые строки применяются для визуальной группировки частей программы. Ис- пользуйте пустые строки для структурирования файлов, но не злоупотребляйте ими. Примеры, приведенные в книге, помогут вам выработать нужный баланс. Например, если в программе пять строк кода создают список, а затем следующие три строки что-то делают с этим списком, два фрагмента уместно разделить пустой строкой. Тем не менее между ними не стоит вставлять три или четыре пустые строки. Пустые строки не влияют на работу кода, но отражаются на его удобочитаемости. Интерпретатор Python использует горизонтальные отступы для интерпретации смысла кода, но игнорирует вертикальные интервалы. Другие рекомендации PEP 8 содержит много других рекомендаций по стилю, но эти рекомендации в основном относятся к программам более сложным, чем те, которые вы пишете на данный момент. По мере изучения более сложных возможностей Python я буду приводить соответствующие фрагменты рекомендаций PEP 8. УПРАЖНЕНИЯ 4-14 . Просмотрите исходное руководство по стилю PEP 8 по адресу https://python .org/dev/ peps/pep-0008/ . Пока вы будете пользоваться им относительно редко, но просмотреть его будет интересно . 4-15 . Анализ кода: выберите три программы, написанные в этой главе, и измените каждую в соответствии с рекомендациями PEP 8 . • Используйте четыре пробела для каждого уровня отступов . Настройте текстовый редактор так, чтобы он вставлял четыре пробела при каждом нажатии клавиши табуляции, если это не было сделано ранее (за инструкциями обращайтесь к при- ложению Б) . • Используйте менее 80 символов в каждой строке . Настройте редактор так, чтобы он отображал вертикальную черту в позиции 80-го символа . • Не злоупотребляйте пустыми строками в файлах программ . 82 Глава 4 • Работа со списками Итоги В этой главе вы научились эффективно работать с элементами списка. Вы узнали, как работать со списком в цикле 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()) Цикл в этом примере сначала проверяет, содержит ли car значение 'bmw' . Если проверка дает положительный результат, то значение выводится в верхнем ре- гистре. Если car содержит все что угодно, кроме 'bmw' , то при выводе значения применяется капитализация: Audi BMW 84 Глава 5 • Команды if Subaru Toyota В этом примере объединяются несколько концепций, о которых вы узнаете в этой главе. Для начала рассмотрим основные конструкции, применяемые для проверки условий в программах. Проверка условий В каждой команде if центральное место занимает выражение, результатом которо- го является логическая истина ( True ) или логическая ложь (False); это выражение называется условием. В зависимости от результата проверки Python решает, должен ли выполняться код в команде if . Если результат условия равен True , то Python выполняет код, следующий за командой if Проверка равенства Во многих условиях текущее значение переменной сравнивается с конкретным значением, интересующим вас. Простейшее условие проверяет, равно ли значение переменной конкретной величине: >>> car = 'bmw' >>> car == 'bmw' True В строке переменной car присваивается значение 'bmw' ; операция выполняется одним знаком = , как вы уже неоднократно видели. Строка проверяет, равно ли значение car строке 'bmw' ; для проверки используется двойной знак равенства ( == ). Этот оператор возвращает True , если значения слева и справа от оператора равны; если же значения не совпадают, оператор возвращает False . В нашем примере значения совпадают, поэтому Python возвращает True Если car принимает любое другое значение вместо 'bmw' , проверка возвращает False : >>> car = 'audi' >>> car == 'bmw' False Одиночный знак равенства выполняет операцию; код можно прочитать в форме «Присвоить car значение 'audi' ». С другой стороны, двойной знак равенства, как в строке , задает вопрос: «Значение car равно 'bmw' ?» Такое применение знаков равенства встречается во многих языках программирования. Проверка равенства без учета регистра В языке Python проверка равенства выполняется с учетом регистра. Например, два значения с разным регистром символов равными не считаются: Проверка условий 85 >>> 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 , не изменилось в результате проверки. Веб-сайты устанавливают определенные правила для данных, вводимых пользова- телями подобным образом. Например, сайт может использовать проверку условия, чтобы убедиться в том, что имя каждого пользователя уникально (а не совпадает с именем другого пользователя, отличаясь от него только регистром символов). Когда кто-то указывает новое имя пользователя, это имя преобразуется к нижнему регистру и сравнивается с версиями всех существующих имен в нижнем регистре. Во время такой проверки имя 'John' будет отклонено, если в системе уже исполь- зуется любая разновидность 'john' Проверка неравенства Если вы хотите проверить, что два значения различны, используйте комбинацию из восклицательного знака и знака равенства ( != ). Восклицательный знак пред- ставляет отрицание, как и во многих языках программирования. Для знакомства с оператором неравенства мы воспользуемся другой командой if В переменной хранится заказанное дополнение к пицце; если клиент не заказал анчоусы (anchovies), программа выводит сообщение: toppings.py requested_topping = 'mushrooms' if requested_topping != 'anchovies': print("Hold the anchovies!") 86 Глава 5 • Команды if Строка сравнивает значение 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!") Условие выполняется, потому что значение 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 , что повы- шает точность формулировки интересующих вас условий. Проверка нескольких условий Иногда требуется проверить несколько условий одновременно. Например, в не- которых случаях для выполнения действия бывает нужно, чтобы истинными были Проверка условий 87 сразу два условия; в других случаях достаточно, чтобы истинным было хотя бы одно из двух условий. Ключевые слова 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; обе проверки проходят, а все условное выражение дает истинный результат. Чтобы код лучше читался, отдельные условия можно заключить в круглые скобки, но это не обязательно. С круглыми скобками проверка может выглядеть так: (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. При проверке оба условия оказываются ложными, и общий результат всего выражения тоже ложен. 88 Глава 5 • Команды if Проверка вхождения значений в список Иногда бывает важно проверить, содержит ли список некоторое значение, пре- жде чем выполнять действие. Например, перед завершением регистрации нового пользователя на сайте можно проверить, существует ли его имя в списке имен действующих пользователей, или в картографическом проекте определить, входит ли передаваемое место в список известных мест на карте. Чтобы узнать, присутствует ли заданное значение в списке, воспользуйтесь клю- чевым словом in . Допустим, вы пишете программу для пиццерии. Вы создали список дополнений к пицце, заказанных клиентом, и хотите проверить, входят ли некоторые дополнения в этот список. >>> requested_toppings = ['mushrooms', 'onions', 'pineapple'] >>> 'mushrooms' in requested_toppings True >>> 'pepperoni' in requested_toppings False В точках и ключевое слово in приказывает Python проверить, входят ли зна- чения 'mushrooms' и 'pepperoni' в список requested_toppings . Это весьма полезно, потому что вы можете создать список значений, критичных для вашей программы, а затем легко проверить, присутствует ли проверяемое значение в списке. Проверка отсутствия значения в списке В других случаях программа должна убедиться в том, что значение не входит в список. Для этого используется ключевое слово not . Для примера рассмотрим список пользователей, которым запрещено писать комментарии на форуме. Прежде чем разрешить пользователю отправку комментария, можно проверить, не был ли пользователь включен в «черный список»: banned_users.py banned_users = ['andrew', 'carolina', 'david'] user = 'marie' if user not in banned_users: print(user.title() + ", you can post a response if you wish.") Строка достаточно четко читается: если пользователь не входит в «черный список» banned_users , то Python возвращает True и выполняет строку с отступом. Пользователь 'marie' в этот список не входит, поэтому программа выводит соот- ветствующее сообщение: Marie, you can post a response if you wish. Логические выражения В процессе изучения программирования вы рано или поздно услышите термин «логическое выражение». По сути это всего лишь другое название для проверки |