Создание сценариев на языке PYTHON

По мере усложнения и увеличения в объеме программных проектов становятся очевидными преимущества объектно-ориентированного проектирования и реализации. Языку Perl явно не хватало объектно-ориентированного "буксира" в течение почти пяти лет, и хотя разработчики изо всех сил "налегали на весла", чтобы как-то удержаться на плаву, Регl-версия объектно-ориентированного программирования все еще оставляет желать лучшего.

Этот раздел посвящен языку Python (версии 2). Версия Python 3 пока находится в работе и, по всей вероятности, будет выпущена после выхода этой книги. Но, в отличие от Perl 6, она будет значительно усовершенствована.

Разработчикам с сильной подготовкой в области объектно-ориентированного программирования обычно нравятся Python и Ruby — языки написания сценариев с резко выраженным объектно-ориентированным уклоном. Создается такое впечатление, что язык Python в данный момент находится на нисходящей части кривой восприятия, поэтому его распространение — относительно простое направление деятельности для менеджмента. Некоторые операционные системы, включая OpenSolaris, инвестируют значительные средства в развитие Python-возможностей по написанию сценариев. Язык Ruby, наоборот, по-прежнему ассоциируется, главным образом, с веб-разработкой и редко используется для сценариев общего назначения.

Язык Python был создан Гуидо ван Россумом (Guido van Rossum). По сравнению с Perl, здесь проще процесс кодирования, а сам код читабельнее. Python отличается простым для понимания синтаксисом даже для тех, кто сам не разрабатывал код. Если вам трудно запомнить детали использования операторов сравнения, вы оцените унифицированный подход, реализованнный в языке Python. Что касается системных администраторов, то они считают весьма полезными дополнительные типы данных, предлагаемые языком Python.

Если Python еще не инсталлирован в вашей системе, просмотрите список доступных пакетов, предлагаемых вашим поставщиком. Если с этим у вас возникнут проблемы, вы можете получить исходный код Python с сайта python.org. Здесь также вы найдете модули расширений, разработанные сторонними производителями.

Для того чтобы получить более подробное введение в язык Python, чем представленное здесь, начните с книги Марка Пилгрима (Mark Pilgrim) Dive Into Python. Ее можно прочитать и бесплатно загрузить на сайте diveintopython.org.

 

Быстрое погружение в языковую среду Python

Как обычно, начнем с вывода сообщения "Привет, мир!". Как видите, его Python-версия практически идентична Perl-варианту.

#!/usr/bin/python print "Привет, мир!"

Для выполнения этой программы установите "исполнительный" бит или вызовите напрямую интерпретатор языка Python.

$ chmod +х helloworld

$ ./helloworld

Привет, мир!

В этой программе не иллюстрируется самое "возмутительное" отступление Python от традиций, к которым мы так привыкли в программировании. В языке Python не используются ни скобки (фигурные и квадратные), ни специальные ключевые слова (begin и end), ограничивающие блоки. Операторы на одном и том же уровне отступа автоматически формируют блоки. Конкретный стиль отступов (пробелы или табуляция, глубина отступа) не имеет значения. Формирование блоков в Python прекрасно показано на следующем примере, в котором используется оператор if-then-else.

#!/usr/bin/python

import sys

a = sys.argv[1]

if a == "1":

print 'а равно одному'

print 'Это все еще ветвь then оператора if.'

else:

print 'а равно, а

print 'Это все еще ветвь else оператора if. '

print 'А это уже за границей оператора if. '

В третьей строке программы импортируется модуль sys, который содержит массив argv. Обе ветви then и else оператора if имеют по две строки, и все они "отмечены" отступом одинакового уровня. Последний оператор print "выпадает" из контекста оператора if. Как и в языке Perl, Python-оператор print принимает произвольное количество аргументов. Но, в отличие от Perl, Python-оператор print вставляет пробел между каждой парой аргументов и автоматически "приправляет свое блюдо" символом новой строки. Вы можете подавить разделитель строк, включив дополнительную запятую в конец строки print; кроме того, null-аргумент предписывает оператору print не выводить символ новой строки.

Двоеточие в конце строки обычно служит признаком того, что за ней (этой строкой) следует блок, состоящий из строк с отступами.

$ python blockexample 1

а равно одному

Это все еще ветвь then оператора if.

А это уже за границей оператора if.

$ python blockexample 2

а равно 2

Это все еще ветвь else оператора if.

А это уже за границей оператора if.

Соглашение о Python-отступах ограничивает наши возможности в форматировании кода, но зато дает выигрыш в том, что программы, написанные разными программистами, выглядят практически одинаково. Это соглашение также означает, что для программистов отпадает необходимость "сдабривать" код знаками "точка с запятой" для завершения операторов.

Комментарии начинаются с символа # и продолжаются до конца строки (точно так же, как в оболочке bash и языке Perl).

Длинную строку можно разбить на части с помощью символа "\", помещенного 0 конце. В этом случае имеет значение только отступ первой строки. При желании можете использовать отступы и в остальных строках-продолжениях (частях разбитой длинной строки). Строки с несбалансированными скобками (круглыми, квадратными или фигурными) автоматически сигнализируют о продолжении строки даже при отсутствии символа "\", но вы можете вставить этот символ, чтобы прояснить структуру вашего кода.

При выполнении некоторых операций вырезки и вставки символы табуляции преобразуются в пробелы, что может иметь для вас неожиданные последствия. Поэтому следуйте золотому правилу: никогда не смешивайте символы табуляции и пробелы; для создания отступов используйте либо табуляцию, либо пробелы. Работа многих программных продуктов основана на традиционном предположении, что символ табуляции соответствует интервалу, состоящему из восьми пробелов, что на практике "выливается" в слишком большие отступы для получения читабельного кода. Большая часть Python-сообщества предпочитает использовать пробелы и 4-символьные отступы.

Если вы захотите кардинально решить проблему отступов, то, "идя навстречу вашим пожеланиям", многие текстовые редакторы включают средства, которые помогают сохранить в здравии вашу психику, либо запрещая символы табуляции (в пользу пробелов), либо отображая эти "конкурирующие" символы по-разному. В качестве последнего средства можете переводить символы табуляции в пробелы с помощью команды expand или использовать команду peri -ре для замены табуляции строкой символов, которая лучше видна.

 

Объекты, строки, числа, списки, словари, кортежи и файлы.

Все типы данных в языке Python являются объектами, и это придает им больше силы и гибкости, чем в языке Perl.

В языке Python списки заключаются в квадратные скобки (а не в круглые). Индексация массивов начинается с нуля (это один из немногочисленных принципов, который не меняется для всех трех "сценарных" языков, рассматриваемых в этой главе).

"Новым словом" в языке Python прозвучали "кортежи," которые, по сути, представляют собой неизменяемые списки. Кортежи работают быстрее, чем массивы, и оказываются весьма полезными для представления данных, которые должны быть немодифицированными. Синтаксис для кортежей такой же, как для списков, за исключением того, что разделителями у них служат круглые скобки (а не квадратные). Поскольку запись (thing) похожа на простое алгебраическое выражение, кортежи, содержащие только один элемент, должны иметь дополнительную запятую, которая не оставит у вас сомнений, с чем именно вы имеете дело, — (thing,   ).

Рассмотрите пример использования некоторых основных типов данных в языке Python.

 

#!/usr/bin/python

name = 'Gwen'

rating = 10

characters = [ 'ГубкаБоб', 'Патрик', 'Сквидвард' ]

elements = ( 'литий', 'углерод', 'бор' )

print "Имя:\t%s\nРейтинг:\t%d" % (name, rating)

print "Герои:\t%s" % characters

print "Элементы:\t%s" % (elements, )

Вот как выглядит результат выполнения этого примера.

$ python objects

Имя:       Gwen

Рейтинг:    10

Герои:     ['ГубкаБоб', 'Патрик', 'Сквидвард']

Элементы:   ('литий', 'углерод', 'бор')

 

Переменные в языке Python не отмечаются синтаксически и не объявляются с указанием типа, но объекты, на которые они ссылаются, имеют базовый тип. В большинстве случаев язык Python автоматически не преобразует типы за вас, но это могут сделать отдельные функции или операторы. Например, вы не можете сцепить строку и число (с помощью оператора "+") без явного преобразования числа в его строковое представление. Однако операторы форматирования приводят объекты любого типа к строковому внцу. Каждый объект имеет строковое представление.

Действие оператора строкового форматирования "%" во многом подобно действию Функции sprintf из языков С или Perl, но его можно использовать везде, где может находиться строка. Это бинарный оператор, в левой части которого стоит строка, а в правой — вставляемые значения. Если вставляемых значений несколько, они должны быть представлены в виде кортежа.

Словарь в языке Python — это то же самое, что хеш в языке Perl, т.е. список пар "ключ/значение". Словарные литералы заключаются в фигурные скобки, а элементы, составляющие пару "ключ/значение", отделяются друг от друга двоеточием.

#!/usr/bin/python

ordinal = { 1: 'первый', 2: 'второй', 3: 'третий' }

print "Массив ordinal содержит", ordinal

print "Значением ordinal для ключа 1 является", ordinal [1]

На практике Python-словари во многом подобны массивам, за исключением того, что "словарные" индексы (ключи) могут быть объектами, отличными от целых чисел.

$ python dictionary

Массив ordinal содержит  {1:   'первый',  2:   'второй',  3:   'третий'} Значением ordinal для ключа 1 является первый

В языке Python файлы открываются как объекты с помощью соответствующих методов. Метод readline, вполне оправдывая свое имя, считывает одну строку. При выполнении приведенного ниже примера считываются (и выводятся) две строки из файла /etc/passwd.

#!/usr/bin/python

f = open('/etc/passwd', 'rf)

print f.readline(),

print f.readline(),

f .close ()

$ python fileio

at:x:25:25:Batch jobs daemon:/var/spool/atjobs:/bin/true

bin:x:1:1:bin:/bin:/bin/true

Замыкающие запятые в операторах print используются для подавления символов новой строки, поскольку каждая строка и так уже включает этот символ, считанный из исходного файла.

 

Комментарии (0)

Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.