Это старая версия документа.


Автор — Грэг Валтерс (Greg Walters)

В прошлый раз мы изучали списки, подстановку переменных, комментарии, сравнение и присвоение, операторы if и while. Я обещал, что в этой части мы изучим модули и функции. Давайте начнём.

Модули

Модули предлагают способ расширить программирование на Python. Вы можете создать свои модули, использовать те, которые поставляются с Python или которые написали другие. В самом Python есть сотни модулей, которые облегчают написание программ. Список модулей, поставляемых с Python, находится по адресу: http://docs.python.org/modindex.html. Некоторые модули предназначены для опреде-лённых операционных систем, но большинство из них кроссплатформенные и работают одинаково на Linux, Mac и Microsoft Windows. Для использования внешнего модуля необходимо импорти-ровать его в программу. Один из модулей, поставляемых с Python, называется «random». Он даёт возможность генерировать псевдослучайные числа. Мы используем этот модуль в нашем первом примере.

Давайте разберём код по строкам. Первые четыре строки — это комментарии, о которых мы говорили в прошлый раз. Пятая строка говорит Python, что нужно использовать модуль «random». Мы должны явно указать Python на это.

В седьмой строке находится цикл «for», который печатает 14 случайных чисел. В строке восемь вызывается функция randint(), которая отображает случайное целое число в диапазоне от 1 до 10. Обратите внимание, что мы должны указать из какого модуля эта функция. В этом случае мы вызываем её random.randint. Зачем вообще создавать модули? Если бы все возмож-ные функции включались непосредственно в Python, Python был бы очень большим и медленным, к тому же отладка стала бы кошмаром. Используя модули, мы можем разбить код на группы, специфичные для определённых потребностей. Если, например, вам не нужно использовать функциональ-ность баз данных, то вам и не нужно знать, что здесь есть модуль для SQLite. Однако, когда он вам понадобится, вы его легко найдёте. Мы ещё будем использовать модули баз данных в последующих статьях.

Начав работать с Python, возможно, вы создадите свои собственные модули, чтобы использовать уже написанный код снова и снова, без необходимости повторного набора. Если вам нужно поменять что-то в этом коде, вы сможете сделать это с минимальным риском для кода в основной программе. Правда, на это есть ограничения, и мы разберёмся с этим позже. Когда мы использовали команду «import random», мы получили доступ ко всем функциям в модуле random. Если же нам нужна только функция randint(), можно привести оператор импорта к такому виду:

from random import randint

Теперь при вызове функции не надо указывать иденти-фикатор «random.», и наш код меняется на:

from random import randint
# print 14 random integers
for cntr in range(1,15):
print randint(1,10)

Функции

Когда мы импортировали модуль random, мы исполь-зовали функцию randint(). Функция — это блок кода, который создан для того, чтобы вызывать его в программе, обычно, более одного раза. Это упрощает работу над програм-мой и предотвращает набор одного и того же кода снова и снова. Грубо говоря, если вам нужно написать некоторый код больше, чем 1-2 раза, стоит сделать его функцией. Хотя следующие два примера очень простые, это хорошие примеры функций. Теперь мы хотим, скажем, взять два числа, сложить их, перемножить, вычесть одно из другого, затем вывести на экран эти числа и результаты одновременно. Допустим, нам нужно сделать это три раза для трёх наборов чисел. Тогда наш пример будет выглядеть как текст справа.

Здесь нужно не только набрать много текста, но и непременно возникнут ошибки как при написании, так и при внесении изменений. Вместо этого мы создадим функцию, которую назовём «DoTwo». Она будет каждый раз брать два числа, проводить математические операции и выводить результат. Начнём с ключевого слова «def», которое сигнализирует о том, что мы собираемся определить функцию. После слова «def» добавим название функции и список параметров, если таковые имеются, в круглых скобках. Эту строку необходимо завершить двоеточием. Код функции набирается с отступом. Наш улучшенный простой пример (№2) показан ниже.

Как видите, здесь написано меньше кода — 8 строк вместо 12. Если нам нужно будет что-либо поменять в функции, мы сможем сделать это, не создавая проблем для нашей программы. Чтобы вызвать функцию, нужно написать её имя и параметры.

Теперь другой пример функции. Рассмотрите следующие условия.

Мы хотим создать програм-му, которая будет выводить список покупок в красивом формате. Это должно выгля-деть примерно как текст ниже. Стоимость каждой покупки и сумма должны быть в долларах и центах. Ширина вывода должна быть изменяемой, значения слева и справа — тоже. Чтобы всё сделать, нам понадобятся три функции. Первая будет выводить верхнюю и нижнюю линии, вторая будет выводить строки покупок, включая строку суммы, а третья — разделительную линию. К счастью, в Python есть символов. Мы вычитаем два, чтобы вставить «| » слева. Part2.rjust(rightbit-2,' ') выравнивает по правому краю форматированную строку со стоимостью с (rightbit-2) пробелами. Завершаем строку символами « |».

Вот и всё. Теперь стоит заняться поиском ошибок. Вы можете сделать это в качестве самостоятельного упражнения. Итак… наша функция «Fmt» состоит всего из двух строчек кода, не включая определение функции и комментарии. Можно вызвать её так.

print Fmt('Item 1',30,item1,10)

И снова, мы можем назначить возвращённое значение другой строке, но можем и просто вывести его на печать. Напоминаю, что мы указываем ширину слева — 30, а справа — 10. Сумма равна 40. Это число мы и передали в функцию «TopOrBottom» раньше. Теперь запустите ваш редактор и введите код, который расположен ниже.

Сохраните код в файл «pprint1.py» и запустите его. Должно получиться что-то похожее на текст справа вверху. Хоть этот пример и простой, он должен дать вам понять, как и зачем использовать функции. Теперь давайте немного углубимся и узнаем побольше о списках. Помните во второй статье цикла я впервые упомянул списки? Я лишь забыл вам сказать, что списки могут включать всё, даже другие списки. Давайте создадим список в нашей программе и заполним его так:

itms = [['Soda',1.45],['Candy',.75],['Bread',1.95],['Milk',2.59]]

Если нам нужно обратить-ся к этой пере-менной, как к обычному списку, то следует напи-сать print items[0]. Однако, в этом случае мы получим ['Soda',1.45]. Это не то, чего мы добиваемся при обычных обстоятельствах. Мы хотим обратиться к каждому элементу в этом первом списке. Тогда нужно использовать «print itms[0][0]», чтобы получить «Soda» и [0][1], чтобы получить стоимость — 1.45. Теперь у нас есть 4 покупки, и мы хотим использовать информацию о них в нашем красивом шаблоне. Всё, что нам нужно поменять, это информацию в конце программы. Сохраните последнюю версию кода как «pprint2.py», закомментируйте два определения пунктов и введите список, который вы видите сверху. Это должно выглядеть так.

#item1 = 3.00
#item2 = 15.00
itms = [['Soda',1.45],['Candy',.75],['Bread',1.95],['Milk',2.59]]

Удалите все строки, в которых вызывается Fmt(). Затем добавьте следующие (с #NEW LINE в конце) так, чтобы код стал похож на текст, написанный справа.

Я создал переменную-счётчик для цикла, которая обходит весь список для каждого элемента. Заметьте, что я также добавил перемен-ную «total». Делаем её равной нулю прежде, чем мы зайдём в цикл «for». Теперь, выводя на печать каждую покупку, мы прибавляем её стоимость к «total». В конце мы выводим саму «total» после раздели-тельной линии. Сохраните вашу программу и запустите её. Вы увидите что-то, похожее на текст снизу.

Если вы хотите ещё услож-нить программу, можете доба-вить строку с налогом. Выво-дить её нужно примерно так же, как и итоговую сумму, но вместо цены поставить (total * .086).

print Fmt('Tax:',30,total*.086,10)

Если вы хотите, вы можете добавить в список ещё больше наименований и посмотреть, как будет работать программа.

На этот раз хватит. На следующем занятии мы подробно изучим классы. Не скучайте!