Язык программирования Python
Шрифт:
Листинг
# Импортируются модули из Java
from java.lang import System
from java.awt import *
# А это модуль из Jython
import random
# Класс для рисования линий на рисунке
class Lines(Canvas):
# Реализация метода paint
def paint(self, g):
X, Y = self.getSize.width, self.getSize.height
label.setText("%s x %s» % (X, Y))
for i in range(100):
x1, y1 = random.randint(1, X), random.randint(1, Y)
x2, y2 = random.randint(1, X), random.randint(1, Y)
g.drawLine(x1, y1, x2, y2)
#
panel = Panel(layout=BorderLayout)
label = Label(«Size», Label.RIGHT)
panel.add(label, «North»)
button = Button(«QUIT», actionPerformed=lambda e: System.exit(0))
panel.add(button, «South»)
lines = Lines
panel.add(lines, 'Center')
# Запуск панели в окне
import pawt
pawt.test(panel, size=(240, 240))
Программы на Jython можно компилировать в Java и собирать в jar–архивы. Для создания jar–архива на основе модуля (или пакета) можно применить команду jythonc, которая входит в комплект Jython. Из командной строки это можно сделать примерно так:
Листинг
jythonс–d–c–j lns.jar lines.py
Для запуска приложения достаточно запустить lines из командной строки:
Листинг
java–classpath "$CLASSPATH» lines
В переменной $CLASSPATH должны быть пути к архивам lns.jar и jython.jar.
Prolog
Для тех, кто хочет использовать Prolog из Python, существует несколько возможностей:
Версия GNU Prolog (сайт: интегрируется с Python посредством пакета bedevere (сайт:
Имеется пакет PyLog для работы с SWI–Prolog из Python
Можно использовать пакет pylog (доступен с сайта:, который добавляет основные возможности Prolog в Python
Эти три варианта реализуют различные способы интеграции возможностей Prolog в Python. Первый вариант использует SWIG, второй организует общение с Prolog–системой через конвейер, а третий является специализированной реализацией Prolog.
Следующий пример показывает использование модуля pylog:
Листинг
from pylog import *
exec(compile(r»""
man('Socrates').
man('Democritus').
mortal(X) : — man(X).
«""))
WHO = Var
queries = [mortal('Socrates'),
man(WHO),
mortal(WHO)]
for query in queries:
print "?», query
for _ in query:
print " yes:", query
Что выдает результат:
Листинг
? mortal(Socrates)
yes: mortal(Socrates)
? man(_)
yes: man(Socrates)
yes: man(Democritus)
? mortal(_)
yes: mortal(Socrates)
yes: mortal(Democritus)
Разумеется, это не «настоящий» Prolog, но с помощью модуля pylog любой, кому требуются логические возможности Prolog в Python, может написать программу с использованием Prolog–синтаксиса.
OCaml
Язык программирования OCaml — это язык функционального программирования (семейства ML, что означает Meta Language), созданный в институте INRIA, Франция. Важной особенностью OCaml является то, что его компилятор порождает исполняемый код, по быстродействию
Следующий пример (из Pycaml) показывает программу для OCaml, которая определяет модуль для Python на OCaml и вызывает встроенный интерпретатор Python:
Листинг
let foo_bar_print = pywrap_closure
(fun x -> pytuple_fromarray (pytuple_toarray x)) ;;
let sd = pyimport_getmoduledict ;;
let mx = pymodule_new «CamlModule» ;;
let cd = pydict_new ;;
let cx = pyclass_new (pynull , cd, pystring_fromstring «CamlClass») ;;
let cmx = pymethod_new (foo_bar_print,(pynull ),cx) ;;
let _ = pydict_setitemstring (cd, «CamlMethod», cmx) ;;
let _ = pydict_setitemstring (pymodule_getdict mx, «CamlClass», cx) ;;
let _ = pydict_setitemstring (sd, «CamlModule», mx) ;;
let _ = pyrun_simplestring
(«from CamlModule import CamlClass\n» ^
«x = CamlClass\n» ^
«for i in range(100000):\n» ^
« x.CamlMethod(1,2,3,4)\n» ^
«print 'Done'\n»)
Pyrex
Для написания модулей расширения можно использовать специальный язык — Pyrex — который совмещает синтаксис Python и типы данных C. Компилятор Pyrex написан на Python и превращает исходный файл (например, primes.pyx) в файл на C — готовый для компиляции модуль расширения. Язык Pyrex заботится об управлении памятью, удаляя после себя ставшие ненужными объекты. Пример файла из документации к Pyrex (для вычисления простых чисел):
Листинг
def primes(int kmax):
cdef int n, k, i
cdef int p[1000]
result = []
if kmax > 1000:
kmax = 1000
k = 0
n = 2
while k < kmax:
i = 0
while i < k and n % p[i] <> 0:
i = i + 1
if i == k:
p[k] = n
k = k + 1
result.append(n)
n = n + 1
return result
В результате применения компилятора Pyrex, нехитрой компиляции и компоновки (с помощью GCC):
Листинг
pyrexc primes.pyx
gcc primes.c–c–fPIC–I /usr/local/include/python2.3
gcc–shared primes.o–o primes.so
Получается модуль расширения с функцией primes:
Листинг
>>> import primes
>>> primes.primes(25)
[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]
Разумеется, в Pyrex можно использовать C–библиотеки, именно поэтому он, как и SWIG, может служить для построения оберток C–библиотек для Python.