Осваиваем Python. Унция ноль. Введение.

Предыстория



Присоединяюсь к MaxElc, DarwinTenk и Devgru :) Начинаю цикл статей посвященных Python. Сам я имею некоторый опыт обращения с PHP и Java. Но каждый раз, при относительном освоении какого-то инструмента — оставалось определённое неудовлетворение им, связанное с чем-то конкретным, и поиски продолжались. На сегодняшний день наиболее близко к идеалу в моих глазах стоит Python. Идеал недостижим — это понятно, посему и у Python есть недостатки. Прежде всего — это скорость выполнения, однако, эта проблема решаема несколькими путями и об этом мы обязательно поговорим чуть позднее.
Сам я начал осваивать Python буквально недавно. Начиная этот цикл статей — я преследую несколько целей. Во-первых, это дополнительная само мотивация + интерактивность, во-вторых, опыт. В-третьих, блуждая по просторам рунета — вижу, что Python куда менее популярен, чем в мире. Ситуацию надо исправлять :)
В соответствии с идеологией Python, а именно с тем, что одни из главных его козырей — это быстрота в освоении и скорость разработки, мы достаточно быстро, практически тезисно пронесёмся по основам синтаксиса и построения программ и перейдём к основной цели данного цикла — освоение django.
Итак, мы начинаем.

Архитектура



Python — интерпретируемый, скриптовый язык программирования. При первом запуске скрипта, интерпретатор транслирует инструкции языка в байт-код, сохраняя их в файле с расширением .pyc. Далее байт-код запускается на виртуальной машине Python (PVM). При вторичном запуске скрипта, интерпретатор отслеживает были ли внесены изменения в нём. Если нет, то запускается сразу .pyc файл.
Реализации Python:
  • CPython — стандартная реализация Python
  • Jython — альтернативная реализация Python. Основная цель которой — бесшовная интеграция с платформой Java. Состоит из java-классов, которые транслируют программный код на языке Python в java байт-код, который затем запускается на виртуальной машине Java (JVM).
  • IronPython — реализация Python предназначенная для интеграции с .NET платформой.
  • Shedskin C++ — нетрадиционный подход к выполнению программ на языке Python. Цель — оптимизация скорости выполнения. Преобразует исходный код Python в исходный код C++, который затем может быть скомпилирован в машинный код.
  • PyPy — реализация PVM на самом языке Python + JIT компилятор.


Варианты запуска программ



На хабре уже была написана хорошая инструкция для новичков, как быстро организовать рабочую среду для разработки на Python и django. Если вы уже проделали описанную в ней последовательность действий, то это означает, что на вашей машине уже установлен интерпретатор python. В большинстве Linux дистрибутивов он установлен по-умолчанию.

Вариант 1. Интерактивный режим


Для попадания в интерактивный режим необходимо ввести в командной строке команду python.

$ python
Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print 'Hello World!'
Hello World!


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

str1 = 'Hello World!'
str2 = " It's my second script"
print 'import has been done successfully'


И сохранить их в файле hi.py. Далее в командной строчке используя команду cd перейти в тот каталог, в котором вы сохранили файл и набрать команду python.
Для импорта инструкций можно использовать инструкцию import <имя файла без расширения .py>. Файлы в языке Python являются модулями, которые внутри себя содержат пространство имён. Импортируя модуль мы получаем доступ к пространству имён верхнего уровня.

$ python
Python 2.5.2 (r252:60911, Oct 5 2008, 19:24:49)
[GCC 4.3.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import hi
import has been done successfully
>>> print hi.str1+hi.str2
Hello World! It's my second script


Используя в инструкции конструкцию вида: hi.str1, мы обращаемся к имени str1, определённом внутри модуля hi.
Строки, числа в языке Python — это тоже объекты. Здесь прослеживается наследование парадигмы берущей начало от языка SmallTalk «Всё — объекты». Однако, если мне не изменяет память там речь шла и о том, что операторы — тоже были объектами. В python оператор «+» — это перегруженный оператор для строк выполняющий конкатенацию.
Для импортирования конкретных имён можно использовать инструкцию from:

>>> from hi import str1
>>> print str1
Hello World!


После чего мы сможем обращаться к импортируемому имени непосредственно.
После внесения каких-то изменений в файл, для того чтобы изменения вступили в силу — необходимо перезагрузить модуль с помощью функции reload().

>>> reload(hi)
<module 'hi' from 'hi.pyc'>


Для получения списка всех доступных имён модуля можно использовать функцию dir():

>>> dir(hi)
['__builtins__', '__doc__', '__file__', '__name__', 'str1', 'str2']


Вариант 2. Запуск из командной строки.


Запустить сценарий из командной строки можно следующим образом:

$ python hi.py

Так же сценарию можно передавать параметры командной строки. Доступ к ним из сценария можно получить, импортировав встроенный модуль sys. Изменим файл hi.py следующим образом:

import sys
print sys.argv


После чего вызовем его из команжной строки, передав несколько произвольных параметров:

$ python hi.py 1 2 3 'param-pam-pam'
['hi.py', '1', '2', '3', 'param-pam-pam']


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

$ python hi.py 1 2 3 'param-pam-pam' > text.txt

Вариант 3. IDE.


Интерактивный режим удобен в некоторых случаях, например, когда нужно поэкспериментировать с какой-то определённой инструкцией. Однако, постоянно работать в нём неудобно т.к. Нужно постоянно вспоминать про перезагрузку модулей.
Поэтому гораздо удобнее воспользоваться описанной выше процедурой настройки IDE и запускать программы из неё. Так же при разработке программ на Python вполне приемлем вариант написания кода в блокноте с подсветкой синтаксиса и запуском программы из консоли.

На сегодня всё. В следующих статьях мы перейдём непосредственно к изучению конструкций языка. Не сомневаюсь, отклики будут и я буду на них ориентироваться.
Спасибо за внимание!
+66
18 января 2009, 12:48
100
Gerlion 16,5

комментарии (85)

+6
GooRoo #
В целом хорошая статья, спасибо. Только начинаю учить Python, поэтому пока большего сказать не могу.

P.S. Вот только однотипные названия a la «капля первая», «первая чашка», «унция ноль», «ведро первое» etc. начинают резать глаз… сугубо IMHO.
+5
Adrior #
Такими темпами скоро закончатся емкостные единицы измерения. :)

А вообще мне эта тенденция на Хабре очень нравится. Только вот глаза разбегаются — что бы такое начать учить. :)

И в связи с обилием подобных статей, лучше бы их было все же в раздел «Стартап „Программист“» постить, ИМХО. А то главная скоро будет только такими статьями завалена.
0
sovnarkom #
Питон, хорошо хоть не в мышах статьи решили измерять :)
+7
Halt #
Надо было мерять в попугаях %)
0
daken #
эмм, тогда уж в кубических попугаях =)
0
JC_Piligrim #
Не, в сферических. В ваккууме. ;)
0
kurokikaze #
В попугаях :)
0
Stepanow #
Изучаем клавиатуру. Кнопка «0».
+1
barbuza #
есть волщебный софтвер — ipython — представляет собой более интерактивный шел
+3
UkrDay #
Спасибо, начну изучать Python с вами. :)
+13
chetzof #
Вы бы не брали дурной пример и называли темы нормально: Часть 1, часть 2 — так понятнее.
+6
lizendir #
+1
+8
iv_s #
Вместо унций назвали бы например «Попугай первый», как в мультике:). Правда там удав был, но тоже змейка:)
НЛО прилетело и опубликовало эту надпись здесь
0
Halt #
Или в позвонках =)
0
iv_s #
В позвонках как то жестоко получается:)
+1
JIP #
квант python'а :)
+6
nwalker #
Несмотря на то, что начинание хорошее, «лемминговость» таких циклов вызывает неприязнь.
+4
Lamo #
Все, начну цикл статей по бейсику. Обычному классическому бейсику.
0
nwalker #
Может, Лисп или Форт? Еще можно Erlang или Haskell.
+1
VovixLDR #
Для леммингов по хаскеллу придется дробить уже не на капли, а на молекулы:)
+1
mraleph #
разложим Lisp на атомы =)
0
laQie #
А ассемблер тогда в чем измеряться будет?
0
nwalker #
В нуклонах, наверное. А машинный код — в кварках.
+3
Fess #
В бозонах :)
0
asmadews #
Лисп удобнее всего мерять в скобках. Только их много понадобится
+1
mraleph #
между скобками-то атомы (http://en.wikipedia.org/wiki/Lisp_programming_language#Atoms) находятся, как не крути =)
+9
laberso #
Erlang, клизьма первая :))
0
ksurent #
Про Erlang с огромным удовольствием бы почитал. Сам потихоньку пробую, лишний материал не помешал бы.
0
nwalker #
Я бы присоединился к всем этим каплям с Erlang-ом, но 1 — пока не хватит времени, 2 — не хочу присоединяться к леммингам прямо сейчас. Попозже. Ну, еще нехватка кармы — но это мелочи.
+1
Unkn0wn #
Мне нравится эта тенденция на хабре :)
Про питон почитаю.
+17
jawbreaker #
У вас флешмоб чтоли? Я за одно воскресенье начать учить C#, Java, Prolog, Python и Ruby не смогу =(
+5
Ins1ght #
До этого на хабре было много статей по тайм-менеджементу :)
+4
Optik #
И про то как спать по 4 часа в сутки)
+3
nwalker #
Лучше начинайте учить SmallTalk, например, и пишите об этом свой цикл.
0
Halt #
У меня вот была мысль описать Dolphin Smalltalk. Для начинающих в самый раз. Хоть я и не такой уж крутой смоллтокер %)
0
nwalker #
Пишите, почему нет. Про Smalltalk я бы почитал с интересом. Но лучше — попозже, когда волна ведер-унций-попугаев схлынет, впечатление будет приятнее.
0
VolCh #
Где я Prolog пропустил? :)
0
quiet_drago #
был, был — страницы на 1-2 назад ушел. habrahabr.ru/blogs/programming/49399/
правда название не стандартное)
0
CrashMax #
Перенесите пожалуйста в Стартап Программист, там легче отслеживать все капли ведра и т.д., все таки начать изучать столько языков программирования за одно воскресенье очень сложно и придеться некоторые откладывать на потом.
Очень прошу.
+1
laQie #
Спасибо, что начали. А то я уже начал бояться, что про питон никто не начнет.
0
ndee #
Давно уже хотел изучить Python, даже начинал, но потом забросил.
Есть повод вернуться к изучению, спасибо!
0
merlin_rterm #
А ещё можно считать «байт 0, байт 1», «бит 0, бит 1», или, как в tcp — номер последнего написанного символа.
0
DuMMeR #
Cпасибо. Буду тоже приручать питона. Жду продолжения.
0
Iskin #
В Smalltalk + — это просто вызов метода с именем «+». А вот if и т. д. действительно были объектами.
0
Halt #
Ну дык метод это тоже объект :)
+3
opieqo #
Очень хорошо, языки выучим, а программировать не научимся :) Может еще создать топик «Алгоритмы»?
0
VolCh #
Кто-то уже занял программирование и алгоритмизацию. с примерами на бейсике и дельфи :)
–3
witdex #
не надо ля-ля, главное синтаксис и кое какие принципы выучить, и если есть понятие о программировании, хотя бы на одном языке, другие легко учатся, тем более узнаешь много нового что можно применить в другом языке, и выбирать начинаешь какой больше подойдет для конкретной задачи, а нет тот что _я знаю_,… да и никто не скрывает что лучшая практика и теория получается при работе.
+3
iv_s #
Ага, и в итоге знать 38 языков но не уметь программировать:)
+1
witdex #
Мужик, спасибо, только не переставай писать унции, ждал кто же напишет про питон :)
+2
naonau #
где-то встречал такую фразу: хочешь изучить чтото — напиши об этом книгу
похоже пошла мода претворять этот принцип в действие :)
0
s3ek #
Кстати действительно полезно, помогает привести мысли в порядок и укрепить изученный материал. Можно даже просто в закрытом блоге писать для себя)
+1
michurin #
Мне кажется, что в разделе «Архитектура» надо было хотя бы вскользь упамянуть о том, что питон имеет LL(1) парсер (вернее, грамматика питон всё же чуть сложнее, чем LL(1), но не значительно). Это позволяет сделать время компилляции практически пропорциональным длине программы. У большинства языков это не так. И это очень большой плюс питона и свидетельство его изачально отличного дизайна.
wiki.python.org/moin/LanguageParsing
0
kewgram #
Может кто нибудь и про Stackless напишет, и про Python + Vim…
0
f33l #
stackless тоже крайне интересует, но сомневаюсь, что что-либо появится.
потом буду обязательно изучать, и, если не опередят, напишу.
–2
Sov1et #
Не хватает кармы всех благодарить… *crazy*
+1
gigimon #
А уже кто-то пытался учить людей питону, здесь на хабре но после 5 урока перестал :( Может продолжите?
+3
cleg #
я начинал. и перестал, так как особо и времени не было и фидбек попер негативный. но может по свободе продолжу. если единицу измерения придумаю.
0
vectoroc #
пишите тоже в унициях, а то читателям сложнее будет мержить знания ;)
0
cleg #
у меня тогда нестыковка с автором этого топика будет :)
0
Optik #
Ну от чего же. На пару вы быстрей накормите народ фунтами знаний)
+1
cleg #
да, списался с автором топика, надеюсь так и будет.
в 4 руки — оно круче получится :-)
0
mPuT #
Да, а давольно интересные статьи были!
+2
lizendir #
После внесения каких-то изменений в файл, для того чтобы изменения вступили в силу — необходимо перезагрузить модуль с помощью функции reload().

Изменения будут видны, только если мы обращаемся к объектам по имени, начинающемуся с имени перезагруженного модуля, иначе получится вот что:

>>> open('/tmp/foo.py', 'w').write('bar = 4')
>>> import foo
>>> from foo import bar
>>> foo.bar
4
>>> bar
4
>>> open('/tmp/foo.py', 'w').write('bar = 100')
>>> reload(foo)
<module 'foo' from 'foo.py'>
>>> foo.bar
100
>>> bar
4
+2
lizendir #
Python — интерпретируемый, скриптовый язык программирования. При первом запуске скрипта, интерпретатор транслирует инструкции языка в байт-код, сохраняя их в файле с расширением .pyc. Далее байт-код запускается на виртуальной машине Python (PVM). При вторичном запуске скрипта, интерпретатор отслеживает были ли внесены изменения в нём.


Не совсем так, питон не создаёт pyc файлы для файла, который он исполняет, он создаёт pyc файлы для файлов, которые он подгружает в качестве модулей. Пример:

lorien@lorien:/tmp$ echo 'foo = 4' > spam_mod.py
lorien@lorien:/tmp$ echo 'import spam_mod; print spam_mod.foo' > spam_run.py
lorien@lorien:/tmp$ python spam_run.py
4
lorien@lorien:/tmp$ ls spam*.pyc
spam_mod.pyc

Поправьте меня кто-нить, если я заблуждаюсь.
0
Guria #
Все верно пишите. Можно добавить, что компиляцию можно форсировать.
+1
cleg #
habrahabr.ru/blogs/python/29778/#habracut
на всякий случай — просамопиарюсь. так как суть та же.
0
Yustos #
Я вот про IDE не понял :) Раздел третий о том, что такое IDE?
Ну или пару примеров полезнее были бы, например, PyScripter или Wing IDE… К тому же в обеих очень даже можно поэкспериментировать стоя на брекпойнте в полноценном таком интерактивном режиме. Объекты созданные в программе доступны, можно их порассматривать, поменять, методы повызывать — сказка.
0
iwuvjhdva #
???
производительность — сильная сторона Python, он намного быстрее Java и PHP
> у Python есть недостатки. Прежде всего — это скорость выполнения
0
maxp #
Python не быстрее Java по ряду объективных причин, но быстрее PHP.

Возможно там изначально Javascript имелся ввиду?
+5
maxp #
На мой взгляд не совсем правильно начинать рассказ о Питоне с модулей.
Этак очень долго не будет понятно, что же в нём такого хорошего :)

Перво-наперво следует рассказать о том, какие есть структуры данных в распоряжении питонистов.
string: " ", u" ", r" "
tuple: ( )
list: [ ]
dict: { }

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

Затем рассказть про def и lambda, и обязательно про итераторы и генераторы.
Чем отличается конструкция [ x for i in… if… ] от ( x for i in… if… )
и почему второй вариант может оказаться очень эффективным во многих алгоритмах.

При рассказе о функциях удачно упомянуть такие милые вещи, как декораторы.

После такого ознакомления с, непосредственно, языком (добавив еще try: except: else: )
можно переходить к battaries included — т.е. к штатной библиотеке Питона.
0
niksite #
Это очень правильно, что в blogs/starting_programming это написано. А не в blogs/python, как мне по rss пришло. В blogs/python то, полагаю, люди давно уже стартовавшие.
+1
Cim #
Унции про джангу бы еще :). А то порой и подсмотреть некуда.
0
nwalker #
А djangobook вам не достаточно?
0
Cim #
Джангобук приятно, но, порой, его не хватает.
0
ixside #
Ждемс 2 унцию!…
0
Loengreen #
Хорошая тенденция. Вот только нашелся бы человек, который провел сравнительный анализ всех языков. Я конечно понимаю, что для многих этот призыв звучит как призыв к религиозной войне, но… глаза разбегаются хочется ну хоть какой-то ясности.

Сам занимаюсь разработкой клиентской части, но очень хочу хотя бы на примитивном уровне освоить серверную часть.

Помогите! Должен же среди нас быть гуру, который проведет беспристрастный анализ в чиселках и выдаст показатели производительности, скорости разработки и легкости реализации стандартных алгоритмов, расскажет о том, насколько просто/сложно выполняются стандартные операции (подключение к базе, выборки, передача данных [JSON, XML], вывод).

Смешаем капельки, ведра, чашечки и унции в сравнительный анализ?!
0
GooRoo #
Сферы применения языков программирования настолько обширны (и не всегда совместыми), что не представляется возможным выделить критерии оценивания. Так что, боюсь, обширный и в то же время объективный анализ «в чиселках» никто не осилит.
0
Loengreen #
Я имел ввиду не вообще всех языков.
Ruby, Java (servlet, portlet), Python, C# (PHP, Perl).

Я понимаю, что те же JAVA, C# (да и наверное любой другой язык) имеют куда более широкое применение нежели web, но было бы интересно почитать мнение эксперта (опытного программиста) относительно возможностей этих языков для web.
0
GooRoo #
Лично я почему-то воспринимаю Java, C#, Python не как языки написания web-приложений. И если «легкость реализации стандартных алгоритмов» я могу понять, то подключение к БД, работу с XML и т.д. «стандартными операциями» у меня язык не поворачивается назвать. Наверное, это потому что я учусь на системного программиста.

Так что даже для приведенного Вами списка языков будет довольно трудно (но не невозможно) провести беспристрастный анализ. У каждого языка свои фичи, поэтому под каждую задачу свой язык.
0
tema_sun #
Эх, только вот судя по скорости выхода «капель» — про руби цикл был готов сразу.
Но ничего — буду ждать:)
0
VolCh #
Может просто дело в наличии большего количества свободного времени у автора капель?
0
RinKaMeAri #
надеюсь, в вашем курсе будет практика на python.
здесь на хабре есть отличные задачи для начинающих на Java.
думаю и для python они сгодятся: habrahabr.ru/blogs/java/44031/
0
cybergrind #
только reload, имхо стоит рассматривать вместе с импортом (когда рассматривать импорт более подробно, а то можно получить очень интересное поведение), и указать что так можно релоадить только модуль.

да и вообще все не так просто с перезагрузкой модулей.

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