Актуально: ИТ-решение

Оборудование за 1 рубль

Позволяет корпоративным клиентам до 31 августа этого года приобрести оборудование для подключения к Интернету по мобильной сети оператора всего за 1 рубль.
Читайте подробности>>
 




White Papers

45% руководителей компаний считают информацию ключевым стратегическим ресурсом, но лишь 7% уверены, что смогут успешно использовать ее для роста.

Рассматриваются три типичных метода хищения данных: добронамеренные сотрудники, нацеленные атаки извне и мстительные сотрудники. Наряду с обзором способов противодействия даны конкретные советы по предотвращению взлома.

Мир ПК :: Студия программирования

Сценарные языки: Python

в buzz в мой мир в twitter версия для печатисохранить в pdf

Вы когда-нибудь ловили себя на мысли, что привычные стандартные действия над файлами, документами, объектами испытывают ваше терпение?

Роман Сузи

Вы когда-нибудь ловили себя на мысли, что привычные стандартные действия над файлами, документами, объектами испытывают ваше терпение? Совсем недавно вы радовались тому, что с помощью окон и меню все делается просто, но теперь рутинность работы начинает казаться неизбежным злом.

Можете ли вы ждать, пока разработчики программного обеспечения включат в свою программу нужную вам операцию? А что делать, если ее нужно выполнять чуть иначе для каждого из тысячи объектов? Мы назвали «болевые точки»? Значит, вы готовы к следующему шагу в освоении компьютерного пространства — пора познакомиться с такими понятиями, как сценарий (script).

До недавнего времени сценарные языки не находили широкого распространения при работе на персональных компьютерах. Местом их применения были мощные рабочие станции с операционными системами семейства UNIX. Однако сегодня средний ПК — это суперкомпьютер по меркам недалекого прошлого. Уже не так важно, что сам по себе сценарный язык — интерпретируемый и по сравнению с компилируемыми языками программы на нем исполняются медленнее (есть иная точка зрения [1]). Существенно другое: сценарные языки позволяют кратко и выразительно описать требуемые действия, существенно сократив общее время решения проблемы.

Между сценариями и «настоящими» программами граница очень расплывчатая. Сценарий — это та же программа, но управляющая целыми программными компонентами. Любая достаточно сложная программная система имеет возможности для написания сценариев. Разнятся языки, их гибкость и специализация, но остается главное — возможность программного управления средой.

В последнее десятилетие стали появляться универсальные сценарные языки. Это такие же «настоящие» языки программирования, как Си или Паскаль, однако они имеют более высокий уровень абстракции, рассчитанный как на программиста-профессионала, так и на просто подготовленного пользователя.

Эти языки часто применяются для системной интеграции, чтобы «склеить» разнородные программные компоненты или среды. Для таких приложений не столь важна скорость выполнения программ на сценарном языке, сколько возможность интеграции (расширения, встраивания) в любые программные системы. Существует немало сценарных языков: Perl, Tcl, Python, PHP, Lua, Rep, Ruby, Pike. Одним из наиболее интересных в этом ряду является язык Python.

Особенности языка Python

История языка Python началась в 1991 г., когда Гвидо ван Россум приступил к работе над ним. Впоследствии он назвал его Python (по словам автора, вовсе не в честь змеи, а в честь шоу на BBC «Monty Python?s Flying Circus»). В основу языка были положены следующие принципы:

  • простота и удобство программирования,
  • наглядный синтаксис,
  • объектная ориентация,
  • возможность расширения,
  • встраиваемость,
  • переносимость,
  • свободное распространение.

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

Одним из недостатков языка Python считается невысокое быстродействие написанных на нем программ (однако см. www.bagley.org/~doug/shootout/). Этот недостаток с лихвой компенсируется скоростью разработки программ на Python. Некоторые разработчики замечают, что это единственный язык, на котором они могут писать программы со скоростью мысли, не отвлекаясь на сооружение вспомогательных конструкций, отчасти из-за того, что нет необходимости описывать типы, отчасти благодаря наличию высокоуровневых типов данных, например списка или словаря (хэш, ассоциативный массив).

Задумывался Python и как язык для опытных пользователей-непрограммистов. Этому был посвящен даже проект Computer Programming for Everybody (CP4E, программирование для всех), а сейчас образовательными аспектами Python занимается специальная группа Edu-SIG (Special Interest Group).

Язык Python имеет продуманные средства для объектно-ориентированного программирования. К тому же все элементы, используемые в программе, являются... объектами, включая функции, классы и модули.

Этим языком поддерживается несколько парадигм программирования, в том числе функциональное программирование (ФП). Ярким представителем языков этого направления является Лисп. Конечно, никто не заставляет умещать всю программу в одно выражение, но элементы функционального стиля часто используются в программах на языке Python.

ФП приводит к существенному сокращению объема кода программы и при грамотном подходе к построению алгоритма — к большему быстродействию.

Уникальная особенность языка Python — использование отступов для выделения блоков операторов в программе. Автор языка исходил из того, что программисты для наглядности все равно делают отступ, так зачем же заставлять их вводить бесконечные скобки, когда изменение отступа само по себе способно отмечать начало и конец блока. Эту особенность языка обычно сильно критикуют те, кто не писали программы на Python или не привыкли делать отступы.

На Python создано значительное количество полезного ПО. О больших коммерческих проектах, в которых используется Python, можно узнать на www.python.org/psa/Users.html. На языке Python пишут и ПО для систем реального времени.

Примеры программирования на Python

Для начала рассмотрим что-нибудь несложное, например программу для поиска простых чисел от 1 до N (см. листинг 1).

Листинг 1
import math
N = input("Введите N: ")
if N > 1:
print 2,
for number in xrange(3, N+1, 2):
for divisor in xrange(3, math.sqrt(number)+1, 2):
if number % divisor == 0:
break
else:
print number,

Для N=100 получается ряд:

2 3 5 7 11 13 17 19 23 29 31 37 41
 43 47 53 59 61 67 71 73 79 83 89 97.

Думается, программисты без труда узнают типичный алгоритм для нахождения простых чисел. В этой программе видны сразу несколько особенностей, присущих языку Python:

  1. Выделение операторов в блоки осуществляется с помощью отступов.
  2. Цикл for работает с последовательностью. Очевидно, что xrange() строит необходимую последовательность.
  3. Функция xrange(A, B) — и это проявляется везде в Python — порождает числа от A до B, не включая B. Подобный подход (использование полуоткрытых интервалов) может показаться на первый взгляд странным, но на самом деле он очень логичен при программировании.
  4. Функция sqrt (нахождение квадратного корня) берется из стандартной библиотеки.
  5. Оператор цикла for (и это сюрприз!) имеет часть else, которая выполняется только в том случае, когда цикл не был прерван по break, а исполнился до конца. В нашем случае именно это и нужно: если делитель не был найден, мы заявляем, что число простое.

А теперь маленький фокус, требующий отдельного пояснения: при создании программы использован интерактивный режим интерпретатора Python (см. листинг 2).

Листинг 2
>>> a = [1, 2, 3]
>>> b = a
>>> a[0] = 0
>>> print b
[0, 2, 3]

Дело в том, что в Python объекты можно связывать с тем или другим именем с помощью оператора присваивания, а убирать эту связь с помощью оператора del. Имя содержит лишь ссылку на объект. Только числа и строки копируются при присваивании, все же остальные объекты получают новые имена.

В следующей программе (см. листинг 3) мы выделим из текста все URL-ссылки и напечатаем полученный список, сгруппированный по хостам.

В этой программе тоже есть особенности:

  • Python позволяет вызывать функцию для произведения действий над найденным фрагментом. Мы пользуемся этим для занесения хостов в словарь.
  • Используется встроенный высокопроизводительный метод sort().
  • Присваивание может производиться сразу для списка значений. Этот прием применен в программе два раза:
    «host, url = ...» и «for
     (host, urls) in ...».
  • Основная хитрость заключена в составленном регулярном выражении. Python использует регулярные выражения, которые совместимы с утилитой grep от GNU, выражениями языка Perl и поддерживают Unicode.

    В нашем примере регулярное выражение было «скомпилировано», чтобы последующие его применения выполнялись быстрее.
  • Регулярное выражение записано в тройных кавычках. Строки Python можно записывать внутри апострофов, кавычек, тройных кавычек, тройных апострофов. Тройные кавычки (или апострофы) позволяют записывать текст на нескольких строках.
  • Наверное, вы обратили внимание на выражение ""*4. Тот же прием пригоден для других последовательностей.

Теперь из списка файлов выбираются те, которые находятся в текущем (см. листинг 4).

Листинг 4
import os, glob, string
print string.join(filter(os.path.isdir,
 glob.glob("*")), "
")

Метод glob() порождает список файлов, удовлетворяющих шаблону "*", т. е. все нескрытые файлы и каталоги. Функция filter() для каждого элемента этого списка вызывает функцию os.path.isdir(), чтобы проверить, является ли указанное имя именем каталога. Наконец, string.join() объединяет все элементы списка в один текст, используя признак конца строки в качестве разделителя.

А вот как выглядит программа (заимствована из справочника FAQ по языку Python), показывающая, как получить список простых чисел, меньших 1000 (см. листинг 5).

Листинг 5
print filter(None,map(lambda
 y:y*reduce(lambda x,y:x*y!=0,map(lambda
 x,y=y:y%x,range(2,pow(y,0.5)
+1)),1),range(2,1000)))

Конечно, это скорее курьез, но игнорировать элементы функционального программирования в Python — значит не использовать очень мощные средства, подчас делающие программы компактнее, понятнее и быстрее. В этом примере применены три коронных приема функционального подхода: map(), reduce() и filter(). Функция map(f, list) порождает новый список, применив к нему f(). Функция filter(f, list) порождает на основе list список, куда входят только те элементы list, которые дают логическое значение «истина» (в языке Python такими являются непустые и ненулевые значения). Наконец, reduce(f, list) позволяет организовать цепочечные вычисления. Например, вычислить факториал от 1000 можно с помощью следующего оператора:

print reduce(lambda x, y: x*y,
 range(1, 1000), 1L)

Заметьте, что для получения этого результата использовались длинные целые. Этот тип данных имеет в Python неограниченную точность, лишь бы хватило памяти для представления числа. (На применение длинных целых указывает буква L у первого элемента цепочки вычислений.)

В языке Python все используемые величины являются объектами, даже функции, классы и модули. Описать собственный класс очень просто. Класс без атрибутов будет аналогом структуры (записи). Соблюдение инкапсуляции объекта лежит на совести программиста: атрибуты являются только открытыми (public), а для акцентирования их приватности (private) имена начинаются с «_» (подчеркивание). Атрибуты, которые начинаются с двойного подчеркивания (но не заканчиваются им!), можно считать аналогом приватных имен, так как доступ к ним затруднен необходимостью указывать имя класса (см. листинг 6).


22.10.2001г


Комментарии:


Для того, чтобы оставить комментарий авторизуйтесь или зарегистрируйтесь.

Новости ОСП-ТВ - 03.09.10


В номере

01/11/2004 №11


Эта рубрика в архиве
Список номеров за



Инфозоны

DIRECTUM EVERYWHERE

УРАЛХИМ признал DIRECTUM

Система DIRECTUM стала корпоративным стандартом электронного документооборота в масштабах всего холдинга "Уралхим".

Уфа внедряет электронный муниципалитет

Платформа DIRECTUM стала центральным звеном в создаваемой информационной системе, направленной на повышение эффективности и открытости местных органов власти.

Цена вопроса

Кто и когда должен оценивать эффективность ECM-проектов? Как перейти от общих результатов к конкретным количественным характеристикам?

DIRECTUM во власти

Внедрение СЭД в Правительстве Астраханской области: система управления делами для 12 министерств и более 1300 сотрудников.

OSP.RU :: Написать письмо.