Программирование на Python 3. Руководство издательство СимволПлюс
Скачать 3.74 Mb.
|
str. format() , стр. 100 62 Глава 1. Быстрое введение в процедурное программирование а чтобы определить количество символов в строке, можно использо вать функцию len(). При использовании неизменяемых объектов, таких как строки, целые числа и кортежи, мы можем писать программный код, как если бы ссылки на объекты были переменными, то есть как если бы ссылка на объект была самим объектом, на который она ссылается. Точно так же можно поступать и в случае изменяемых объектов, только в этом слу чае изменения в объекте будут затрагивать все ссылки, указывающие на этот объект, – эта проблема будет описываться в главе 3. В языке Python имеется несколько встроенных типов коллекций, а также ряд типов коллекций имеется в стандартной библиотеке. Мы познакомились с типами list и tuple, в частности, мы узнали, как соз давать кортежи и списки из литералов, например, even = [2, 4, 6, 8]. Списки, как и все остальное в языке Python, являются объектами, по этому мы можем пользоваться их методами, например, вызов метода even.append(10) добавит дополнительный элемент в список. Подобно строкам, списки и кортежи являются последовательностями, благода ря чему можно выполнять итерации по их элементам, используя цикл for ... in , и определять количество элементов в коллекции с помо щью функции len(). Кроме того, имеется возможность извлекать из списков или кортежей отдельные элементы, используя оператор дос тупа к элементам ([]), объединять два списка или кортежа с помощью оператора + и дополнять один список другим с помощью оператора +=. Если потребуется добавить в конец списка единственный элемент, можно использовать метод list.append() или оператор +=, которому следует передать список, состоящий из одного элемента, например, even += [12] . Поскольку списки являются изменяемыми объектами, для изменения отдельных элементов можно использовать оператор [], например, even[1] = 16. Быстрые операторы is и not is удобно использовать, чтобы выяснить, не ссылаются ли две ссылки на один и тот же объект, что очень удобно, особенно когда выполняется проверка ссылки на уникальный встроен ный объект None. В вашем распоряжении имеются все обычные опера торы сравнения (<, <=, ==, !=, >=, >), но они могут использоваться только с совместимыми типами данных и только с теми, которые поддержи вают эти операции. Мы пока познакомились только с типами данных int , str, list и tuple – все они поддерживают полный набор операторов сравнения. Попытка сравнения несовместимых типов, например, сравнение типа int с типом str или list, будет приводить к возбужде нию исключения TypeError. Язык Python поддерживает стандартные логические операторы and, or и not. Выражения с участием операторов and и or вычисляются по со кращенной схеме и возвращают операнд, определяющий результат выражения, причем результат не обязательно будет иметь тип Boolean В заключение 63 (хотя и может быть приведен к типу Boolean). Оператор not всегда дает в результате либо True, либо False. У нас имеется возможность проверить вхождение элементов в последо вательности, включая строки, списки и кортежи, используя операто ры in и not in. Проверка на вхождение в списки и кортежи произво дится с использованием медленного алгоритма линейного поиска, а проверка вхождения в строки реализует потенциально более скоро стной гибридный алгоритм, но производительность в этих случаях редко является проблемой, за исключением случаев использования очень длинных строк, списков и кортежей. В главе 3 мы познакомим ся с такими типами коллекций, как ассоциативные массивы и множе ства, для которых операция проверки на вхождение выполняется очень быстро. Кроме того, с помощью функции type() можно опреде лить тип объекта, на который указывает ссылка, но обычно эта функ ция используется только для нужд тестирования и отладки. Язык Python предоставляет несколько управляющих структур, вклю чая условный оператор if … elif … else, цикл с предусловием while, цикл по последовательности for ... in и конструкцию обработки ис ключений try ... except. Имеется возможность преждевременно пре рывать циклы while и for ... in с помощью инструкции break или пе редавать управление в начало цикла с помощью инструкции continue. В языке Python имеется поддержка обычных арифметических опера торов, включая +, – , * и /, единственная необычность состоит в том, что оператор / всегда возвращает число с плавающей точкой, даже если оба операнда являются целыми числами. (Целочисленное деление, имеющееся во многих других языках программирования, реализова но и в языке Python – в виде оператора //.) Кроме того, язык Python предоставляет комбинированные операторы присваивания, такие как += и *=. Они за кулисами создают новые объекты, если слева находится неизменяемый операнд. Как уже отмечалось ранее, арифметические операторы перегружены для применения к операндам типов str и list. Консольный ввод/вывод можно реализовать с помощью функций in put() и print(), а благодаря возможности перенаправлять ввод/вывод в файлы, мы можем использовать те же самые встроенные функции для чтения и записи файлов. В дополнение к богатому набору встроенных функциональных воз можностей имеется обширная стандартная библиотека; модули стано вятся доступными после импортирования их с помощью инструкции import Одним из наиболее часто импортируемых модулей является модуль sys , в котором имеется список sys.argv, хранящий аргументы команд ной строки. Если в языке Python отсутствует какаялибо необходимая нам функция, с помощью инструкции def мы легко можем создать свою собственную функцию, действующую так, как нам нужно. 64 Глава 1. Быстрое введение в процедурное программирование Используя функциональные возможности, описанные в этой главе, уже можно писать короткие и полезные программы на языке Python. В следующей главе мы больше узнаем о типах данных в языке Python, более подробно рассмотрим типы int и str, а также познакомимся с не которыми совершенно новыми типами данных. В главе 3 мы больше узнаем о кортежах, списках, а также о некоторых других типах кол лекций в языке Python. Затем в главе 4 мы более подробно рассмотрим управляющие структуры языка Python и узнаем, как создавать свои функции, позволяющие избежать дублирования программного кода и способствующие многократному его использованию. Упражнения Цель упражнений, которые приводятся здесь и будут приводиться на протяжении всей книги, состоит в том, чтобы стимулировать вас на проведение экспериментов с языком Python и помочь получить практический опыт с одновременным закреплением пройденного материала. В примерах и упражнениях рассматриваются проблемы числовой обработки и обработки текста, что может инте ресовать самую широкую аудиторию, а кроме того, раз меры упражнений настолько невелики, что при их реше нии вам придется главным образом думать и учиться, а не просто вводить программный код. Решение для ка ждого упражнения можно найти в примерах книги. 1. Было бы довольно интересно написать версию программы bigdig its.py , которая для рисования цифр использовала бы не символ *, а соответствующие цифровые символы. Например: bigdigits_ans.py 719428306 77777 1 9999 4 222 888 333 000 666 7 11 9 9 44 2 2 8 8 3 3 0 0 6 7 1 9 9 4 4 2 2 8 8 3 0 0 6 7 1 9999 4 4 2 888 33 0 0 6666 7 1 9 444444 2 8 8 3 0 0 6 6 7 1 9 4 2 8 8 3 3 0 0 6 6 7 111 9 4 22222 888 333 000 666 Эта задача может быть решена двумя способами. Самый простой способ заключается в том, чтобы просто заменить символы * в спи сках. Но этот путь не слишком гибкий, и хотелось бы, чтобы вы по шли другим путем. Попробуйте изменить программный код так, чтобы вместо добавления в строку за один проход целых строк (dig it[row] ), вырезанных из изображений цифр, в строку добавлялись бы символ за символом, и при встрече символа * он заменялся бы соответствующим цифровым символом. Примеры к книге, стр. 15 Упражнения 65 Сделать это можно, скопировав исходный программный код из big digits.py и изменив пять строк. Это упражнение не столько слож ное, сколько с подвохом. Решение приводится в файле bigdigits_ ans.py 2. Среда разработки IDLE может использоваться как мощный кальку лятор, но иногда бывает удобно иметь калькулятор, специализиро ванный для решения определенного круга задач. Напишите про грамму, которая в цикле while предлагала бы пользователю ввести число, постепенно накапливая список введенных чисел. Затем, ко гда пользователь завершит работу с программой (простым нажати ем клавиши Enter), она выводила бы числа, введенные пользовате лем, количество введенных чисел, их сумму, наименьшее и наи большее число и среднее значение (сумма / количество). Ниже при водится пример сеанса работы с программой: average1_ans.py enter a number or Enter to finish: 5 enter a number or Enter to finish: 4 enter a number or Enter to finish: 1 enter a number or Enter to finish: 8 enter a number or Enter to finish: 5 enter a number or Enter to finish: 2 enter a number or Enter to finish: numbers: [5, 4, 1, 8, 5, 2] count = 6 sum = 25 lowest = 1 highest = 8 mean = 4.16666666667 Решение этого упражнения потребует примерно четыре строки для инициализации необходимых переменных (пустой список – это просто литерал []) и не более 15 строк для цикла while, включая об работку ошибок. Для вывода результатов в конце потребуется всего пара строк, поэтому вся программа, включая пустые строки для лучшей читаемости, должна уместиться примерно в 25 строк. 3. В некоторых ситуациях нам может потребоваться сгенерировать тестовый текст, который пригодится, например, при разработке ди зайна вебсайта, когда действительное содержимое еще отсутству ет, или при разработке программы составления отчетов. Напишите программу, которая создавала бы жуткие поэмы (способные посра мить поэзию Вогона (Vogon)). Создайте списки слов, например, артиклей («the», «a» и других), имен существительных («cat», «dog», «man», «woman»), глаголов («sang», «ran», «jumped») и наречий («loudly», «quietly», «well», «badly»). За тем выполните пять циклов и на каждой итерации с помощью функции random.choice() выберите ар тикль, существительное, глагол и наречие. С помо щью функции random.randint() выберите одну из двух структур предложений: артикль, существительное, Функции random. randint() и random. choice() , стр. 54 66 Глава 1. Быстрое введение в процедурное программирование глагол и наречие, или артикль, существительное и глагол, – и выведите предложение. Ниже приводится пример запуска такой программы: awfulpoetry1_ans.py her man heard politely his boy sang another woman hoped her girl sang slowly the cat heard loudly Для решения этого упражнения вам потребуется импортировать модуль random. Списки могут занимать порядка 4–10 строк, в зави симости от того, как много слов вы подберете для каждого из них, и сам цикл будет занимать не более 10 строк, поэтому вся програм ма, включая пустые строки для лучшей читаемости, должна уме ститься примерно в 20 строк. Решение приводится в файле awfulpo etry1_ans.py 4. Чтобы сделать поэтическую программу более универсальной, до бавьте в нее программный код, дающий пользователю возможность определить количество выводимых строк (от 1 до 10 включитель но), передавая число в виде аргумента командной строки. Если про грамма вызывается без аргумента, она должна по умолчанию выво дить пять строк, как и раньше. Для решения этого упражнения вам потребуется изменить главный цикл (это может быть цикл while). Не забывайте, что операторы сравнения в языке Python могут объ единяться в цепочки, поэтому здесь вам не потребуется использо вать логический оператор and при проверке вхождения аргумента командной строки в заданный диапазон. Функциональность про граммы может быть расширена за счет приблизительно десяти строк программного кода. Решение приводится в файле awfulpoet ry2_ans.py 5. В программе из упражнения 2 было бы неплохо реализовать нахож дение не только среднего значения, но и медианы, но для этого при дется отсортировать список. Сортировка списков в языке Python легко осуществляется с помощью метода list.sort(), но мы еще не рассматривали этот метод, поэтому вам не следует использовать его. Дополните программу вычисления среднего значения про граммным кодом, который сортировал бы список чисел. Эффектив ность не имеет значения, поэтому используйте самый простой спо соб сортировки, какой только придет вам на ум. Отсортировав спи сок, можно будет найти и медиану, которая будет являться значе нием элемента в середине, если список содержит нечетное число элементов, и средним значением от двух средних элементов, если список содержит четное число элементов. Найдите медиану и выве дите ее вместе с остальной информацией. Упражнения 67 Решение этого упражнения может оказаться не совсем простым де лом, особенно для неопытных программистов. Даже если у вас име ется опыт работы с языком Python, вы все равно можете столкнуть ся с трудностями, так как вы ограничены только тем кругом воз можностей, которые мы рассмотрели в этой главе. Реализация сор тировки займет примерно дюжину строк, и вычисление медианы (нельзя использовать оператор деления по модулю, так как он еще не рассматривался) еще четыре строки. Решение приводится в фай ле average2_ans.py. 2 Типы данных В этой главе мы приступаем к более подробному изучению языка Py thon. Для начала мы обсудим правила создания имен, которые мы да ем ссылкам на объекты, и познакомимся со списком ключевых слов языка Python. Затем мы рассмотрим наиболее важные типы данных, исключая коллекции, которые будут рассматриваться в главе 3. Типы данных считаются встроенными за исключением тех, что определены в стандартной библиотеке. Единственное отличие встроенных типов данных от библиотечных состоит в том, что, прежде чем воспользо ваться последними, нам необходимо импортировать соответствующие модули и мы должны квалифицировать имена типов именами моду лей, в которых они определяются. Более подробно об импортировании мы поговорим в главе 5. Идентификаторы и ключевые слова Создавая элемент данных, мы можем либо присвоить его переменной, либо вставить в коллекцию. (Как уже отме чалось в предыдущей главе, когда в языке Python вы полняется операция присваивания, в действительности происходит связывание ссылки на объект с объектом в памяти, который хранит данные.) Имена, которые да ются ссылкам на объекты, называются идентификато рами , или просто именами. Допустимый идентификатор в языке Python – это последовательность символов произвольной длины, содержащей «начальный символ» и ноль или более «символов продолжения». Такой идентификатор дол жен следовать определенным правилам и соглашениям. Ссылки на объекты, стр. 29 • Идентификаторы и ключевые слова • Целочисленные типы • Числа с плавающей точкой • Строки Идентификаторы и ключевые слова 69 Первое правило касается начального символа и символов продолже ния. Начальным символом может быть любой символ, который в ко дировке Юникод рассматривается как принадлежащий диапазону ал фавитных символов ASCII («a», «b», …, «z», «A», «B», …, «Z»), символ подчеркивания («_»), а также символы большинства национальных (не английских) алфавитов. Каждый символ продолжения может быть любым символом из тех, что пригодны в качестве начального символа, а также любым непробельным символом, включая символы, которые в кодировке Юникод считаются цифрами, такие как («0», «1», …, «9»), и символ Каталана «·». Идентификаторы чувствительны к реги стру, поэтому TAXRATE, Taxrate, TaxRate, taxRate и taxrate – это пять раз ных идентификаторов. Точный перечень символов, допустимых для использования в качестве начального символа и символов продолжения, описывается в докумен тации по языку Python (справочник «Language reference», раздел «Le xical analysis», подраздел «Identifiers and keywords» 1 ) или в PEP 3131 2 (раздел «Supporting NonASCII Identifiers»). Второе правило гласит, что идентификатор не должен совпадать с ка кимлибо из ключевых слов языка Python, поэтому мы не можем ис пользовать имена, которые приводятся в табл. 2.1. Таблица 2.1. Ключевые слова языка Python С многими из них мы уже встречались в предыдущей главе, хотя 11 ключевых слов – assert, class, del, finally, from, global, lambda, non local , raise, with и yield мы еще не рассматривали. Первое соглашение выглядит так: «Не использовать в качестве своих идентификаторов любые предопределенные имена». Поэтому старай 1 http://docs.python.org/3.0/reference/lexical_analysis.html# identifiersand keywords. – Прим. перев. 2 Аббревиатура «PEP» расшифровывается как Python Enhancement Proposal (предложение по расширению Python). Если ктото желает изменить или дополнить язык Python, и его стремление пользуется широкой поддерж кой сообщества, он посылает PEP с подробным описанием своего предло жения, чтобы его можно было рассмотреть в официальном порядке; в неко торых случаях, как это произошло с PEP 3131, предложение принимается и реализуется. Все предложения PEP можно найти на странице www.py thon.org/dev/peps/ and continue except global lambda pass while as def False if None raise with assert del finally import nonlocal return yield break elif for in not True class else from is or try 70 Глава 2. Типы данных тесь не использовать такие идентификаторы, как NotImplemented и El lipsis , имена любых встроенных типов (таких как int, float, list, str и tuple), а также имена любых встроенных функций или исключений. Как определить, относится ли тот или иной идентификатор к этим ка тегориям? В языке Python имеется встроенная функция dir(), которая возвращает список атрибутов объекта. Если эта функция вызывается без аргументов, она возвращает список встроенных атрибутов языка Python. Например: >>> dir() ['__builtins__', '__doc__', '__name__'] Атрибут __builtins__ в действительности является модулем, в котором определены все встроенные атрибуты языка Python. Его можно ис пользовать в качестве аргумента функции dir(): >>> dir(__builtins__) ['ArithmeticError', 'AssertionError', 'AttributeError', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] В списке присутствует более 130 имен, поэтому мы опустили значи тельную их часть. Имена, начинающиеся с символов верхнего регист ра, являются именами встроенных исключений. Остальные имена представляют функции и типы данных. Если запоминание или поиск идентификаторов, использования кото рых следует избегать, кажется вам слишком утомительным, то можно воспользоваться инструментом проверки программного кода на языке Python, таким как PyLint (www.logilab.org/project/name/pylint). Этот инструмент поможет вам также выявлять множество других фактиче ских или потенциальных проблем в программах на языке Python. Второе соглашение касается использования символа подчеркивания (_). Не должны использоваться имена, начинающиеся и заканчиваю щиеся двумя символами подчеркивания (такие как __lt__). В языке Python определено множество различных специальных методов и пе ременных с такими именами (и в случае специальных методов мы мо жем заменять их, то есть создать свои версии этих методов), но мы не должны вводить новые имена такого рода. Такие имена будут рас сматриваться в главе 6. Имена, начинающиеся с одного или двух сим волов подчеркивания (и не завершающиеся двумя символами подчер кивания), в некоторых контекстах интерпретируются как специаль ные. Мы продемонстрируем это в главе 5, когда будем использовать имена, начинающиеся с одного символа подчеркивания, и в главе 6, когда будем использовать имена, начинающиеся с двух символов под черкивания. Символ подчеркивания сам по себе может использоваться в качестве идентификатора; внутри интерактивной оболочки интерпретатора или в командной оболочке Python в переменной с именем _ сохраняется ре |