Бібліотека Python містить засоби створення серверів.


Модуль SocketServer містить базові класи, на основі яких пишуться як потокові (TCP), так і датаграммные (UDP) сервери, як многопроцессные (використовуючі os.fork()), так і багатопотокові (multithreading).

Модуль BaseHTTPServer містить базові класи для створення HTTP-серверів.

Модуль SimpleHTTPServer розвиває ці базові класи і дозволяє програмістові писати реакції на запити GET, HEAD і POST.

Модуль CGIHTTPServer дозволяє розширювати функціональність сервера зовнішніми програмами.

Модулі asyncore і asynchat дозволяють писати асинхронні (на основі select/poll) клієнти і сервери. Найбільш відомі асинхронні сервери - однопоточный многопротокольный сервер Medusa і зроблений на її основі багатопотоковий ZServer, що є ядром сервера web-застосувань Zope. Найбільш відомий клієнт: Asynchronous HTTP Client.

Крім мережевих протоколів, Python дозволяє маніпулювати і з даними, бігаючими поверх цих протоколів. Модуль rfc822 дозволяє читати дані у форматі відповідного RFC і отримувати інформацію про заголовки повідомлення.

Модуль mimetools розширює rfc822 у бік відповідного стандарту і дозволяє розбирати складні складені повідомлення.

Модуль MimeWriter дозволяє їх створювати.

Модулі binhex, uu, binascii, base64, quopri дозволяють кодувати і декодувати тексти.

Модулі mailcap, mimetypes, netrc, robotparse витягують інформацію з відповідних файлів.

Модулі mailbox і mhlib дозволяють читати поштові скриньки у форматі UNIX mbox і MH.

Модулі sgmllib, htmllib і xmllib дозволяють створювати парсери для файлів відповідних форматів. Модуль sgmllib підтримує підмножина SGML, достатня лише для обробки HTML. Модуль htmllib розширює попередній модуль у бік написання текстових форматеров для HTML. А ось xmllib дійсно містить повноцінні парсеры XML. Парсеров цих буває 2 типи - що працюють зі всім деревом відразу (DOM, Document Object Model) і розбір, керований подіями (SAX). Бібліотека ця до того ж містить хуки, що дозволяють адміністраторові встановити поверх неї іншу версію, не стираючи старої; існує декілька альтернативних реалізацій, що використовують ці хуки: PyXML і 4Suite. Всі ці бібліотеки використовують низькорівневий парсер Expatякий не входить в дистрибутив Python; його треба встановлювати окремо.

Інші модулі

Крім перерахованих модулів стандартної бібліотеки, що входять в дистрибутив інтерпретатора, для Python існує маса додаткових модулів, які можна узяти в Інтернеті. Існує навіть каталог таких модулів, що називається Парнас. Є навіть комерційні фірми, що випускають модулі для Python, - і багато хто з цих модулів доступний вільно! На перше місце я поставлю фірму Zope Corporationщо вільно віддає сервер web-застосувань Zope. Окрім них відомі PythonWare / Secret Labs з своїми модулями PIL (Python Imaging Library), xmlrpclib, soaplib, нова версія Tkinter, Pythonware Sound Toolkit; ReportLab з своєю бібліотекою генерації PDF; Numerical Python - розширення Python для ефективної обробки матриць; Scientific Python - для наукових розрахунків (використовує NumPy); eGenix з своїми модулями mxDateTime (маніпуляції з датами і часом), mxtextTools (ефективна обробка текстів), mxODBC (комерційний модуль для доступу до реляційних БД, в т.ч. і з юнікса).



Існують модулі, що дозволяють вбудовувати інтерпретатор Python в Apache. Найпростіший з них PyApache. Mod_Python складніший, він інтенсивніше кешує байт-код, має об'єктно-орієнтований API, дозволяє писати хендлери для Апача. Mod_Snake дозволяє писати хендлери для Апача 2.0.

Велика кількість модулів для доступу до баз даних, і не тільки реляційним, наприклад PyBSDDB для доступу до BerkeleyDB3. Модулі для доступу до реляційних БД задовольняють специфікації Python DB API 2.0: PyGreSQL для доступу до PostgreSQL (модуль входить в дистрибутив POSTGRESQL); MySQLdb для доступу до MYSQL.

Крім Tk, програми з графічним інтерфейсом на Python можна писати з використанням багатьох інших бібліотек: WxPython для WxWidgets; PyGTK для GTK; а бібліотека Python XLib є повністю переписаною бібліотекою xlib! PLWM - це Window Mnager написаний на Python.

 

Змінні, операції і вирази

Використання інтерпретатора Python, як калькулятора

Спробуємо використати Python, як калькулятор.

>>> 2+5

>>> 3*6

Після натиснення Enter виконуються дії, інтерпретатор видає результат і че­кає на введення наступного оператора. Операція множення виконана вірно з додержанням пріоритету виконання арифметичних дій.

Можемо спробувати виконати інші операції множення і ділення.

>>> 3/3

>>> 1/3

В другому випадку отримали нуль, бо ділення в цьому випадку є цілочисленним. Математичні операції будуть використовуватись при роботі з лінгвістичними даними в Python. Якщо ввести вираз без змісту то інтерпретатор видає повідомлення про помилку з вказуванням місця помилки і її типу.

>>> 1+

SyntaxError: invalid syntax

Представлення тексту

Спробуємо працювати з текстом, його можна безпосередньо вводити в інтерпретатор.

>>> Hello World

SyntaxError: invalid syntax

Отримали помилку. Текст або частини тексту в програмах на Python представляються за допомогою рядків (string) і повинен відділятися від решти програми лапками (одинарними(1), подвійними(2) або потрійними).

>>> 'Monty Python' (1)

'Monty Python'

>>> "Monty Python's Flying Circus" (2)

"Monty Python's Flying Circus"

>>> 'Monty Python\'s Flying Circus' (3)

"Monty Python's Flying Circus"

>>> 'Monty Python's Flying Circus' (4)

File "<stdin>", line 1

'Monty Python's Flying Circus'

^

SyntaxError: invalid syntax

Якщо рядок містить одинарні лапки необхідно використовувати лівий слеш перед апострофом (3) для того, щоб символ апострофа не розглядався як символ завершення рядка або використовувати подвійні лапки (2). Якщо цього не зробити, то отримаємо помилку (4).

>>> "Hello World"

'Hello World'

>>> 'Hello World'

'Hello World'

Деколи рядки можуть складатися з кількох рядків. Python забезпечує декілька способів роботи з ними. В наступному прикладі послідовність з двох рядків об’єднується в одну. Потрібно використовувати лівий слеш (1) або круглі дужки (2) для того щоб інтерпретатор знав що ввід стрічки ще не завершився після введення першого рядка.

>>> "Shall I compare thee to a Summer's day?"\

"Thou are more lovely and more temperate:"

Shall I compare thee to a Summer's day?Thou are more lovely and more temperate:

>>>

>>> ("Rough winds do shake the darling buds of May,"

"And Summer's lease hath all too short a date:")

Rough winds do shake the darling buds of May,And Summer's lease hath all too short a date:

Застосування потрійних лапок дозволяє представляти рядок так як він введений з розділенням окремих рядків:

>>> """Shall I compare thee to a Summer's day?

Thou are more lovely and more temperate:"""

 

Shall I compare thee to a Summer's day?

Thou are more lovely and more temperate:

 

>>> '''Rough winds do shake the darling buds of May,

And Summer's lease hath all too short a date:'''

 

Rough winds do shake the darling buds of May,

And Summer's lease hath all too short a date:

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

>>> print """

Usage: thingy [OPTIONS]

-h Display this usage message

-H hostname Hostname to connect to

"""

 

 

Usage: thingy [OPTIONS]

-h Display this usage message

-H hostname Hostname to connect to

Спробуємо використати оператори додавання і множення для роботи з рядками.

>>> 'Hello'+ 'World'

'HelloWorld'

Оператор додавання виконує операцію поєднання. Він дозволяє створити новий рядок на основі двох існуючих, але він не додає пробіл між словами. Спробуємо поєднати три однакових рядка за допомогою операторів множення та додавання.

>>> 'Hi'+'Hi'+'Hi'

'HiHiHi'

>>> 'Hi'*3

'HiHiHi'

Значення і типи

Всі програми працюють із значеннями. Значенням може бути число або стрічка.

Наприклад, в першій програмі ми вже друкували на екрані стрічкове значення "Hello world!". Аналогічним чином можна вивести і число:

>>> print 12

"Hello world!" і 12 належать до різних типів: str (від англ. string – рядок) і int (від англ. integer – ціле число). В деяких версіях Python ці типи носять нескорочені назви: string і integer. Інтерпретатор відрізняє рядок від числа по лапках, в які він поміщений.

Якщо ви не впевнені в тому, до якого типу належить значення, це можна перевірити так:

>>> type("Hello world!")

<type 'str'>

>>> type(12)

<type 'int'>

>>> type(2.4)

<type 'float'>

Рядковий тип називається в Python str, цілочисельний носить назву int, а дріб – float (від англ. floating-point number – число з плаваючою точкою).

· Вправа. Проведіть самостійно наступний експеримент: перевірте типи значень "12" і "2.4"? Якого вони типу і чому?

· Вправа. Що відбудеться, якщо рядок "8.53" спробувати перетворити в ціле число за допомогою функції int()? Як вирішити цю проблему?

Перетворення типів

Функція int() перетворює значення в цілочисельний тип. Якщо перетворення провести неможливо, то буде виведено повідомлення про помилку:

>>> int("32")

>>> int("Hello")

Traceback (most recent call last):

File "", line 1, in ?

ValueError: invalid literal for int(): Hello

Функція int() може приводити до цілого типу і дробові числа, але не забувайте, що при перетворенні вона просто відкидає дробову частину:

>>> int(3.99999)

>>> int(-2.3)

-2

Функція float() перетворює цілі числа і рядки в дробовий тип:

>>> float(32)

32.0

>>> float("3.14159")

3.14159

І, нарешті, функція str() відповідає за перетворення до рядкового типу. Саме його заздалегідь запускає команда print:

>>> str(32)

'32'

>>> str(3.14149)

'3.14149'

Python розрізняє ціле число 1 від дробового 1.0: це одне і те ж число, але воно належить до різних типів. Від типу значення залежить спосіб його зберігання в пам'яті.

Змінні

Як будь-яка інша мова програмування Python підтримує концепцію змінних, але з невеликою відмінністю. Якщо в мовах C++ або Pascal змінна – це ім'я елементу пам'яті, в якій зберігається значення, то в Python змінна – це посилання на комірку пам'яті. Відмінність, на перший погляд, неістотна, але насправді це трохи іншої підхід до організації зберігання об'єктів в пам'яті.

Для того, щоб «запам'ятати» значення достатньо привласнити його змінній. Це робиться за допомогою спеціального оператора привласнення, який позначається знаком рівності (=).

>>> message = "Hello world!"

>>> n = 12

>>> pi = 3.14159

У даному прикладі змінній message присвоюється (або зіставляється) значення "Hello world!", змінній n присвоюється значення 12, а змінній pi – 3.14159.

Команда print працює і зі змінними:

>>> print message

Hello world!

>>> print n

>>> print pi

3.14159

Як бачите, команда print виводить не імена змінних, а їх значення. Змінні так само як і значення, мають тип. Давайте це перевіримо за допомогою функції type():

>>> type(message)

<type 'str'>

>>> type(n)

<type 'int'>

Тип змінної співпадає з типом привласненого нею значення. Розглянемо ще один приклад:

>>> message = "Hello world!"

>>> n = 12

>>> type(message)

<type 'str'>

>>> message = n

>>> print message

>>> type(message)

<type 'int'>

Цей приклад є цікавим з двох причин. По-перше, в ньому використана можливість привласнювати значення однієї змінної іншій. Конструкція message=n працює аналогічно привласненню змінній значення: змінній message привласнюється значення змінної n. При цьому значення 12 зберігається в пам'яті тільки один раз – Python досить економно витрачає пам'ять.

По-друге, як видно з прикладу, змінна message після привласнення їй значення n поміняла свій тип. Далеко не кожна мова програмування «вміє» це робити так просто.









Последнее изменение этой страницы: 2016-04-07; Нарушение авторского права страницы

infopedia.su не принадлежат авторские права, размещенных материалов. Все права принадлежать их авторам. Обратная связь