Книга Изучаем Python
Скачать 4.68 Mb.
|
45 comment.py # Say hello to everyone. print("Hello Python people!") Python игнорирует первую строку и выполняет вторую. Hello Python people! Какие комментарии следует писать? Комментарии пишутся прежде всего для того, чтобы объяснить, что должен делать ваш код и как он работает. В ходе работы над проектом вы понимаете, как работают все его компоненты. Но, если вернуться к проекту спустя некоторое время, скорее всего, некоторые подробности будут забыты. Конечно, всегда можно изучить код и разобраться в том, как должны работать его части, но хорошие комментарии с до- ступным изложением общих принципов работы кода сэкономят немало времени. Если вы хотите стать профессиональным программистом или участвовать в со- вместной работе с другими программистами, научитесь писать осмысленные комментарии. В наши дни почти все программы разрабатываются коллективно в группах — либо группами работников одной компании, либо группами энтузиа- стов, совместно работающих над проектом с открытым кодом. Опытные програм- мисты ожидают увидеть комментарии в коде, поэтому лучше привыкайте добавлять содержательные комментарии прямо сейчас. Написание простых, лаконичных комментариев – одна из самых полезных привычек, необходимых начинающему программисту. Принимая решение о том, нужно ли писать комментарий или нет, спросите себя, пришлось ли вам перебрать несколько вариантов в поисках разумного решения для некоторой задачи; если ответ будет положительным, напишите комментарий по по- воду вашего решения. Удалить лишние комментарии позднее намного проще, чем возвращаться и добавлять комментарии в программу. С этого момента я буду ис- пользовать комментарии в примерах для пояснения смысла некоторых частей кода. УПРАЖНЕНИЯ 2-10 . Добавление комментариев: выберите две программы из написанных вами и добавьте в каждую хотя бы один комментарий . Если вы не найдете, что написать в комментариях, потому что программы были слишком просты, добавьте свое имя и текущую дату в начало кода . Затем добавьте одно предложение с описанием того, что делает программа . Философия Python Долгое время язык программирования Perl был краеугольным камнем интернет- программирования. На первых порах функционирование многих интерактивных сайтов было основано на сценариях Perl. В то время сообщество Perl руководство- валось девизом: «Это можно сделать несколькими способами». Какое-то время разработчикам нравился такой подход, потому что гибкость, присущая языку, позволяла решать многие задачи разными способами. Подобный подход был до- 46 Глава 2 • Переменные и простые типы данных пустим при работе над собственными проектами, но со временем стало ясно, что чрезмерная гибкость усложняет долгосрочное сопровождение крупных проектов. Было слишком трудно, утомительно и долго разбираться в коде и пытаться понять, что же думал другой разработчик при решении сложной задачи. Опытные программисты Python рекомендуют избегать лишних сложностей и при- менять простые решения там, где это возможно. Философия сообщества Python выражена в очерке Тима Питерса «The Zen of Python». Чтобы просмотреть этот краткий набор принципов написания хорошего кода Python, достаточно ввести команду import this в интерпретаторе. Я не стану воспроизводить все принципы, но приведу несколько строк, чтобы вы поняли, почему они важны для вас как для начинающего программиста Python. >>> import this The Zen of Python, by Tim Peters Красивое лучше, чем уродливое. Программисты Python считают, что код может быть красивым и элегантным. В программировании люди занимаются решением задач. Программисты всегда ценили хорошо спроектированные, эффективные и даже красивые решения. Со временем вы больше узнаете о Python, начнете писать больше кода, и когда- нибудь ваш коллега посмотрит на экран вашего компьютера и скажет: «Ого, какой красивый код!» Простое лучше, чем сложное. Если у вас есть выбор между простым и сложным решением и оба работают, ис- пользуйте простое решение. Ваш код будет проще в сопровождении, а у вас и дру- гих разработчиков будет меньше проблем с обновлением этого кода в будущем. Сложное лучше, чем запутанное. Реальность создает свои сложности; иногда простое решение задачи невозможно. В таком случае используйте самое простое решение, которое работает. Удобочитаемость имеет значение. Даже если ваш код сложен, он должен нормально читаться. Работая над проектом, требующим написания сложного кода, постарайтесь написать содержательные комментарии для этого кода. Должен существовать один — и желательно только один — очевидный способ сделать это. Если предложить двум программистам Python решить одну и ту же задачу, они должны выработать похожие решения. Это не значит, что в программировании нет места для творчества. Наоборот! Но бульшая часть работы программиста за- ключается в применении небольших, стандартных решений для простых ситуаций в контексте большого, более творческого проекта. Внутренняя организация ваших программ должна выглядеть логично с точки зрения других программистов Python. Сейчас лучше, чем никогда. Вы можете потратить весь остаток жизни на изучение всех тонкостей Python и программирования в целом, но тогда вы никогда не закончите ни один проект. Итоги 47 Не пытайтесь написать идеальный код; напишите код, который работает, а потом решите, стоит ли доработать его для текущего проекта или же перейти на что-то другое. Когда вы перейдете к следующей главе и займетесь изучением более сложных тем, постарайтесь не забывать об этой философии простоты и ясности. Опытные программисты будут с большим уважением относиться к вашему коду, охотнее делиться своим мнением и сотрудничать с вами в интересных проектах. УПРАЖНЕНИЯ 2-11 . Дзен Python: введите команду import this в терминальном сеансе Python и просмотри- те другие принципы . Итоги В этой главе вы научились работать с переменными. Вы узнали, как использовать содержательные имена переменных и как исправлять ошибки в именах и синтак- сические ошибки в случае их возникновения. Вы узнали, что такое строки и как выводить их в нижнем/верхнем регистре и с капитализацией всех слов. Мы рас- смотрели способы аккуратного оформления вывода с применением пропусков, а также удаления лишних пропусков из разных частей строки. Вы начали работать с целыми и вещественными числами и узнали о некоторых неожиданностях, встре- чающихся при работе с числовыми данными. Вы научились писать содержательные комментарии, которые упрощают написание кода для вас и его чтение для других разработчиков. В завершение главы была представлена философия максимальной простоты кода. В главе 3 рассматривается хранение наборов данных в переменных, называемых списками. Вы узнаете, как перебрать содержимое списка и обработать хранящуюся в нем информацию. 3 Списки В этой и следующей главах вы узнаете, что собой представляют списки и как начать работать с элементами списка. Списки позволяют хранить в одном месте взаимосвязанные данные, сколько бы их ни было — несколько элементов или несколько миллионов элементов. Работа со списками относится к числу самых выдающихся возможностей Python, доступных для начинающего программиста. Операции со списками связывают воедино многие важные концепции в про- граммировании. Что такое список? Список — это набор элементов, следующих в определенном порядке. Вы можете создать список для хранения букв алфавита, цифр от 0 до 9 или имен всех членов вашей семьи. В список можно поместить любую информацию, причем данные в списке даже не обязаны быть как-то связаны друг с другом. Так как список обыч- но содержит более одного элемента, рекомендуется присваивать спискам имена во множественном числе: letters , digits , names и т. д. В языке Python список обозначается квадратными скобками ( [] ), а отдельные элементы списка разделяются запятыми. Простой пример списка с названиями моделей велосипедов: bicycles.py bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles) Если вы прикажете Python вывести список, то на экране появится перечисление элементов списка в квадратных скобках: ['trek', 'cannondale', 'redline', 'specialized'] Конечно, вашим пользователям такое представление не подойдет; разберемся, как обратиться к отдельным элементам в списке. Обращение к элементам списка Списки представляют собой упорядоченные наборы данных, поэтому для обраще- ния к любому элементу списка следует сообщить Python позицию (индекс) нужного Индексы начинаются с 0, а не с 1 49 элемента. Чтобы обратиться к элементу в списке, укажите имя списка, за которым следует индекс элемента в квадратных скобках. Например, название первого велосипеда в списке bicycles выводится следующим образом: bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles[0]) Синтаксис обращения к элементу показан в точке . Когда мы запрашиваем один элемент из списка, Python возвращает только этот элемент без квадратных скобок или кавычек: trek Именно такой результат должны увидеть пользователи — чистый, аккуратно от- форматированный вывод. Также можно использовать строковые методы из главы 2 с любым элементом списка. Например, элемент 'trek' можно более аккуратно отформатировать при помощи метода title() : bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles[0].title()) Этот пример выдает такой же результат, как и предыдущий, только название 'Trek' выводится с прописной буквы. Индексы начинаются с 0, а не с 1 Python считает, что первый элемент списка находится в позиции 0, а не в позиции 1. Этот принцип встречается в большинстве языков программирования и объясняется особенностями низкоуровневой реализации операций со списками. Если вы полу- чаете неожиданные результаты, определите, не допустили ли вы простую ошибку «смещения на 1». Второму элементу списка соответствует индекс 1. В этой простой схеме индекс любого элемента вычисляется уменьшением на 1 его позиции в списке. Напри- мер, чтобы обратиться к четвертому элементу списка, следует запросить элемент с индексом 3. В следующем примере выводятся названия велосипедов с индексами 1 и 3: bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles[1]) print(bicycles[3]) При этом выводится второй и четвертый элементы списка: cannondale specialized В Python также существует специальный синтаксис для обращения к последнему элементу списка. Если запросить элемент с индексом –1, Python всегда возвращает последний элемент в списке: 50 Глава 3 • Списки bicycles = ['trek', 'cannondale', 'redline', 'specialized'] print(bicycles[-1]) Фрагмент вернет значение 'specialized' . Этот синтаксис весьма полезен, потому что при работе со списками часто требуется обратиться к последним элементам, не зная точное количество элементов в списке. Синтаксис также распространяется на другие отрицательные значения индексов. Индекс –2 возвращает второй эле- мент от конца списка, индекс –3 — третий элемент от конца и т. д. Использование отдельных элементов из списка Отдельные значения из списка используются так же, как и любые другие пере- менные. Например, вы можете воспользоваться конкатенацией для построения сообщения, содержащего значение из списка. Попробуем извлечь название первого велосипеда из списка и составить сообщение, включающее это значение. bicycles = ['trek', 'cannondale', 'redline', 'specialized'] message = "My first bicycle was a " + bicycles[0].title() + "." print(message) В точке программа строит сообщение, содержащее значение из bicycles[0] , и сохраняет его в переменной message . Так создается простое предложение с упо- минанием первого велосипеда из списка: My first bicycle was a Trek. УПРАЖНЕНИЯ Попробуйте написать несколько коротких программ, чтобы получить предварительное представление о списках Python . Возможно, для упражнений из каждой главы стоит создать отдельную папку, чтобы избежать путаницы . 3-1 . Имена: сохраните имена нескольких своих друзей в списке с именем names . Выведите имя каждого друга, обратившись к каждому элементу списка (по одному за раз) . 3-2 . Сообщения: начните со списка, использованного в упражнении 3-1, но вместо вывода имени каждого человека выведите сообщение . Основной текст всех сообщений должен быть одинаковым, но каждое сообщение должно включать имя адресата . 3-3 . Собственный список: выберите свой любимый вид транспорта (например, мотоциклы или машины) и создайте список с примерами . Используйте свой список для вывода утверж- дений об элементах типа: «Я хотел бы купить мотоцикл Honda» . Изменение, добавление и удаление элементов Обычно вы будете создавать динамические списки; это означает, что во время вы- полнения программы в созданном вами списке будут добавляться и удаляться элементы. Например, вы можете создать игру, в которой игрок должен стрелять по кораблям космических захватчиков. Исходный набор кораблей сохраняется в списке; каждый раз, когда вы сбиваете корабль, он удаляется из списка. Каждый Индексы начинаются с 0, а не с 1 51 раз, когда на экране появляется новый враг, он включается в список. Длина списка кораблей будет уменьшаться и увеличиваться по ходу игры. Изменение элементов в списке Синтаксис изменения элемента напоминает синтаксис обращения к элементу списка. Чтобы изменить элемент, укажите имя списка и индекс изменяемого эле- мента в квадратных скобках; далее задайте новое значение, которое должно быть присвоено элементу. Допустим, имеется список мотоциклов, и первым элементом списка хранится строка 'honda' . Как изменить значение первого элемента? motorcycles.py motorcycles = ['honda', 'yamaha', 'suzuki'] print(motorcycles) motorcycles[0] = 'ducati' print(motorcycles) В точке определяется исходный список, в котором первый элемент содержит строку 'honda' . В точке значение первого элемента заменяется строкой 'ducati' Из вывода видно, что первый элемент действительно изменился, а остальные эле- менты списка сохранили прежние значения: ['honda', 'yamaha', 'suzuki'] ['ducati', 'yamaha', 'suzuki'] Изменить можно значение любого элемента в списке, не только первого. Добавление элементов в список Новые элементы могут добавляться в списки по разным причинам — например, для появления на экране новых космических кораблей, включения новых данных в визуализацию или добавления новых зарегистрированных пользователей на по- строенный вами сайт. Python предоставляет несколько способов добавления новых данных в существующие списки. Присоединение элементов в конец списка Простейший способ добавления новых элементов в список — присоединение эле- мента в конец списка. Используя список из предыдущего примера, добавим новый элемент 'ducati' : motorcycles = ['honda', 'yamaha', 'suzuki'] print(motorcycles) motorcycles.append('ducati') print(motorcycles) 52 Глава 3 • Списки Метод append() в точке присоединяет строку 'ducati' в конец списка, другие элементы в списке при этом остаются неизменными: ['honda', 'yamaha', 'suzuki'] ['honda', 'yamaha', 'suzuki', 'ducati'] Метод append() упрощает динамическое построение списков. Например, вы може- те начать с пустого списка и добавлять в него элементы серией команд append() В следующем примере в пустой список добавляются элементы 'honda' , 'yamaha' и 'suzuki' : motorcycles = [] motorcycles.append('honda') motorcycles.append('yamaha') motorcycles.append('suzuki') print(motorcycles) Полученный список выглядит точно так же, как и списки из предыдущих примеров: ['honda', 'yamaha', 'suzuki'] Такой способ построения списков встречается очень часто, потому что данные, которые пользователь захочет сохранить в программе, нередко становятся из- вестными только после запуска программы. Чтобы пользователь мог управлять содержимым списка, начните с определения пустого списка, а затем присоединяйте к нему каждое новое значение. Вставка элементов в список Метод insert() позволяет добавить новый элемент в произвольную позицию спи- ска. Для этого следует указать индекс и значение нового элемента. motorcycles = ['honda', 'yamaha', 'suzuki'] motorcycles.insert(0, 'ducati') print(motorcycles) В этом примере в точке значение 'ducati' вставляется в начало списка. Ме- тод insert() выделяет свободное место в позиции 0 и сохраняет в нем значение 'ducati' . Все остальные значения списка при этом сдвигаются на одну позицию вправо: ['ducati', 'honda', 'yamaha', 'suzuki'] Удаление элементов из списка Нередко возникает необходимость в удалении одного или нескольких элементов из списка. Например, когда игрок сбивает корабль пришельца, этот корабль нужно удалить из списка активных врагов. Или когда пользователь решает удалить свою учетную запись в созданном вами веб-приложении, этот пользователь должен быть Индексы начинаются с 0, а не с 1 53 убран из списка активных пользователей. Элементы удаляются из списка по по- зиции или по значению. Удаление элемента с использованием команды del Если вам известна позиция элемента, который должен быть удален из списка, вос- пользуйтесь командой del motorcycles = ['honda', 'yamaha', 'suzuki'] print(motorcycles) del motorcycles[0] print(motorcycles) В точке вызов del удаляет первый элемент, 'honda' , из списка motorcycles : ['honda', 'yamaha', 'suzuki'] ['yamaha', 'suzuki'] Команда del позволяет удалить элемент из любой позиции списка, если вам изве- стен его индекс. Например, вот как из списка удаляется второй элемент 'yamaha' : motorcycles = ['honda', 'yamaha', 'suzuki'] print(motorcycles) del motorcycles[1] print(motorcycles) Второй элемент исчез из списка: ['honda', 'yamaha', 'suzuki'] ['honda', 'suzuki'] В обоих примерах значение, удаленное из списка после использования команды del , становится недоступным. Удаление элемента с использованием метода pop() Иногда значение, удаляемое из списка, должно как-то использоваться. Допустим, вы хотите получить координаты x и y только что сбитого корабля пришельцев, что- бы изобразить взрыв в этой позиции. В веб-приложении пользователь, удаленный из списка активных участников, может быть добавлен в список неактивных и т. д. Метод pop() удаляет последний элемент из списка, но позволяет работать с ним после удаления. Удалим мотоцикл из списка: motorcycles = ['honda', 'yamaha', 'suzuki'] print(motorcycles) popped_motorcycle = motorcycles.pop() print(motorcycles) print(popped_motorcycle) Сначала в точке определяется и выводится содержимое списка motorcycles В точке значение извлекается из списка и сохраняется в переменной с именем |