Боевое крещение. Python

On: 30 сентября 2010 г.

Я не стремлюсь создать идеальный справочный материал. Моя цель написать текст, который бы меня очень выручил пару месяцев назад. Для того что бы показать основные разбежности замеченные мной при изучении основы языка программирования Python. Данное пособие предназначается тем кто уже знаком с языками програмирования и заинтересован в кратчайшие сроки овладеть навиками написани кода в Python.

Предупреждение
Язык Python чувствительный к регистру. Это означает что регистр функций, методов, констант, процедур, операторов и т. д. должен быть использован в точности как описано в справочных руководствах. В противном случае Питон вызовет ошибку.



Типы данных

Самое первое про что хочу поговорить это о типах данных. В Python они как мне казалось раньше поставлены с ног на голову. Так как Питон рассчитан на динамическое программирование все переменные создаются «на ходу». Мои первые попытки найти массивы , такие какими я их знал до этого, не увенчались успехами. Я считаю что мой рассказ должен начаться именно с типов данных потому что без них не будет работать не одна программа.

Текст

a = 'Python'
a = "Python"

Текст помещенный в одинарные или двойные кавычки (',") будет восприниматься как текстовый тип. Для превращения числового типа в текстовый используется функция str().

a = str(d)

Функция unicode возвращает строку заданной кодировки.

a = unicode('Питон','UTF-8')

Если перед кавычками указать букву u то текст превратиться в строку Unicode.

a = u'Питон'

Это поможет с отображением русского текста. Сочетание знаков \n указывает на переход на новую строку.

a = u'Питон правильно\nназывать Пайтон'

Также знак \ может использоваться для отображения некоторых символов например кавычек ".
Если заключить текст в тройные кавычки то он будет восприниматься программой со всеми символами с которыми вы его укажете в тройных кавычках. Например переход на новую строку уже не вызывает необходимости использовать символ \.

a = u""Питон правильно
называть Пайтон""

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

a=u'Питон'.rjust(10)

Создает строку длинной в 10 символов где исходный текст будет расположен по правую сторону от добавленных пробелов

a=u'Питон'.ljust(10)

Создает строку длинной в 10 символов где исходный текст будет расположен по левую сторону от добавленных пробелов

a=u'Питон'.center(10)

Создает строку длинной в 10 символов где исходный текст будет расположен по центру строки (пробелы добавляются слева и справа)

В модуле string есть функции для работы с текстом (строками). Пример функция zfill, которая возвращает строку из числа (число тоже должно быть строкой) добавляя определенное количество нулей перед ним.

a=string.zfill('120',4)

Добавляет один один ноль перед 120. То есть второй аргумент функции (4) действует аналогично аргументу методов rjust, ljust, center и указывает на то какой длинны строка должна получиться на выходи функции. Интересное в этом то что функция zfill может работать и с отрицательными числами, добавляя нули после знака минус но перед числом (Пример '-0120'). Забегая на перед я использовал модуль string. В примере видно что функция находиться в модуле и это первое из двух возможных описаний функций которые принадлежат другим модулям.

Числа

a=5
a=5.
a=5.0

Стоит сказать только то что по умолчанию любое число, которое вы вручную присваиваете переменной без оператора точки будет считаться целым. Таким образом выражение 5/2 будет возвращать 2. Перепившим с точкой 5./2 и получим результат 2.5. это так называемое вычисление с плавающей точкой при которой количество чисел после запятой в дроби будет не ограничено. Для вывода конкретного количества чисел после запятой нужно после точки указать столько нулей сколько необходимо вывести чисел после запятой. Так же можно перевести в выражении одно из целых чисел в дробное вызвав функцию float().

a=float(f)/g

Как и в других языках есть возможность переводить значение среди разных числовых типов функциями long(), int() и т.д. В особенности языка можно отнести работу с комплексными числами. В которых если переменная после присваивания несет в себе два объекта real и imag.

a=0.3+5.0j

После описания переменная a имеет два объекта a.real и a.imag. Первый это действительное число, а второе мнимое.
Главное это соблюдение условия что числа при описании комплексных чисел задаются с плавающей точкой.
Массивы

Самое интересное и непривычное для новичка в Python это работа с массивами данных. Рассмотрим простой и удобный тип данных, который схожий с массивами (такими какими мы их знаем с низкоуровневый языков программирования). Это списки.

a=[]

Это вариант регистрации массива. Список может включать в себя элементы разных типов что сразу воспринялось мной скептически и я бы даже сказал враждебно.

a=['er',23,'r',4]

Но позже я начал проводить параллели со стеками и понемногу привык. Возникают вопросы как можно создать многомерные массивы данных. Я уже говорил о том что элементы списка могут быть различными типами потому из этого не сложно сделать вывод что элементом списка может быть тоже список.

a=[[1,3,4,5],[3,5,'tttt',6]]

Список представляет собой стек (кто знает а кто нет прошу для начала ознакомиться с этим определением, конечно если есть желание полностью понимать меня). При создании списка определяются и его размеры. Но это динамический язык потому его размеры не могут быть постоянными (если вы этого конечно не захотите). Для добавления «ячеек» в списку можно пойти разными путями путями. Например соединить два списка в один через оператор суммы. Но существует специальный метод добавления элементов списка. Он называется append.

a.append(f)

Он добавляет еще один указанный элемент к списку (при добавлении еще одного пустого списка аргумент не должен отсутствовать потому стоит использовать append([])). Еще хочу сказать пару слов о вызове списков.

d=a[2:3]
d=a[:3]
d=a[:-1]
d=a[0][1]

Как видно из примера можно указывать и списки отдельных элементов списка но когда вызов идет от первого или до последнего элемента проще всего использовать пропуск в цифре (если элемент в списке находиться первым и последним). Так же полезно знать то что элементы с конца списка пронумерованы от -1 (предпоследний элемент списка). Так же для определения позиции (индекса) элемента с определенным значением в списке существует метод index().

a.index('er')

Возвращается первая позиция этого значения в списке.

! Я не берусь описывать все детально, а делаю акцент на особые детали синтаксиса языка. Данное руководство просто дает понятие о внутреннем мире Питона. Хоть оно и ориентировано на людей с хорошим багажом знаний о программировании но может быть полезным для новичков в программировании. Для этого некоторые термины в ходе объяснений я «упрощаю».


На последок о типах данных расскажу интересную вещь. В отличии от многих языков программирования Питон не содержит переменных ячеек в памяти. Он использует «ярлыки». То есть если вы вводите a=4 это означает что переменная а содержит ссылку на число 4, которое заводиться в пространстве программы. Это интересный подход. Ценности его я не вижу смысла описывать да и боюсь я и сам полностью не могу это оценить. Потому о типах данных достаточно.

Арифметические и битовые операторы

Для манипулирования данными необходимо пользоваться операторами (наиболее чаще арифметическими). Здесь у Питона не так много различий с «коллегами».

Пример
Комментарии
x**y
Возведении в степень y числа x
+x
Определить положительное число
-x
Определить отрицательное число
~x
Определить число
x*y
Умножение
x/y
Деление
x//y
Возвращает целое число после деления
x%y
В случае если при делении x на y получилось не целое число то возвращает 1
x+y
Сочетание
x-y
Вычитание
x<
Перемещение
x>>y

x&y
Альтернатива оператору and
x^y
Альтернатива оператору xor
x|y
Альтернатива оператору or
x!=y
Альтернатива оператору <>
x==y
Оператор сравнения.
Пример на языке Pascal:
if a=b then
Пример на языке Python:
if a==b:
x=y
Присвоение значения (возможны варианты типа a=b=c=0, где все переменные принимают значение 0. Но вы помните что это объяснение образное в действительности a,b,c теперь содержат ссылки на число 0)
x+=y
Подобная конструкция используется и на языке С. Она означает что к первичному значению x добавляется значение y. И так можно использовать эту конструкцию с другими арифметическими операторами (Но на практике оказалось что она выполняется медленней чем обычное присвоение типа x=x+y. Потому я не советую применять эту конструкцию в длительных циклах, что заметно увеличит время обработки цикла) .

Выше приведенные различные примеры с так называемыми булевыми операторами. Я не приводил и старые варианты (and, or, not...), а лишь их альтернативы в Питоне. если вам проще использовать их вам это никто не запрещает. Вот только их основная задача это уменьшение объема кода и времени на его написание.
Вывод данных на экран

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

Пример использования
Результат вывода
print 'Python'
Python
print 'Python','C','php','Perl'
Python C php Perl
print 'Python',
print 'C',
print 'php',
print 'Perl'
Python C php Perl
print 'Python'
print 'C'
print 'php'
print 'Perl'
Python
C
php
Perl
print 'Python %s v' % 2.7
Python 2.7 v
print '%s %s %s %s %s %s %s %s' % ('до','ре','ми','фа','со','ля','си','до')
до ре ми фа со ля си до
print '%2d %1d %7d' % (5,9,10)
5 9 10

Символ % дает возможность форматировать строки при выводе на экран таким образом что бы можно было задавать расстояние между элементами. Упрощенная «версия» строковых методов rjust, ljust, center. Ее возможности велики но с ними я предлагаю ознакомиться в специальной литературе.
Ввод данных
Для ввода данных из консоли рассмотрим две функции. Первая функция это input(). Она считывает с клавиатуры данные являющиеся типами Питона. Как бы это проще объяснить. Она ожидает что пользователь введет данные относящиеся к какому либо типу Питона. Эта функция не защищена от пользовательских ошибок потому рекомендую использовать функцию raw_input(). Которая является эквивалентом функции input() но может считывать даже пустые строки. Так же возможно в этих функциях указать приглашение к вводу в таком случае в строке ввода будет помещен текст с строкой приглашения.

Пример использования
Результат вывода
a=input()

a=input('Enter a ->')
Enter a ->
a=raw_input()

a=raw_input('Enter a ->')
Enter a ->

Исполняемые отступы
Перед описанием разделов ниже есть смысл ознакомить с самым приятным (личное мнение автора) отличием и изюминкой синтаксиса Питона. Это конечно же исполняемые отступы. В Турбо Паскале вы использовали конструкцию из begin <код> end; для записи группирующих инструкций (вспомним определении «тело цикла»). На языке С это кавычки { <код> }. В Питоне для экономии места да и просто для повышения читаемости кода (опять же чисто личное мнение автора) для записи группирующих инструкций необходимо перед каждой строкой инструкции с помощью табуляции либо пробелов создать отступ на определенное расстояние от левого края. В следствии текст будет считаться «сгруппированным». Это немного сложно описывать но проще показать на примере. Я решил не размещать здесь примеры, а использовать их в примерах других разделов. Главное помнить что если вам необходимо было сделать отступ в например одну табуляцию то если вы укажите после кода с отступами строку без отступа либо с меньшим числом отступов то эта группа кода будет считаться закрытой.
Управление логикой
В Питоне как и в многих языках программирования существует один и тот же «набор» средств управления логикой. Но так можно сказать только условно. Но конструкции и методы использования как и ожидалось отличаются.

Инструкция использования if

if <логическое выражение>: <код выполняемый если выражение возвращает истину>

if <логическое выражение>:
<код выполняемый если выражение возвращает истину>

Замете что в последней конструкции я использовал отступ. Некоторые редакторы в частности IDLE идущий с языком в комплекте будут ставить отступ на следующей строке после символа двоеточия автоматически. Здесь как бы подталкивает на то что вы если не использовали первую конструкцию в одно действие то будете использовать несколько действий в случае возвращения истины от логического выражения. If в Питоне используется не только в традиционной форме но и выступает в роли набора условий. То есть как аналог case в Турбо Паскале или switch в bash. В таком конструкция измениться.

if <логическое выражение>:
<код выполняемый если выражение возвращает истину>
elif <логическое выражение>:
<код выполняемый если выражение возвращает истину>
elif <логическое выражение>:
<код выполняемый если выражение возвращает истину>

Как видно из конструкции вводиться использование elif. Его описание в точности такое же как и у if. То есть поле двоеточия можно и не переходить на следующую строку но при этом выполниться лишь одно действие описанное поле двоеточия либо использовать отступы для группирования строк действий с помощью отступов со следующей строки. Как и в других языках конструкция с if может заканчиваться else после чего описаны далее текст выполняется в случае возвращения логического выражения значения лжи.

if <логическое выражение>: <код выполняемый если выражение возвращает истину>
else: <код выполняемый если выражение возвращает лож>

if <логическое выражение>:
<код выполняемый если выражение возвращает истину>
else:
<код выполняемый если выражение возвращает лож>

if <логическое выражение>:
<код выполняемый если выражение возвращает истину>
elif <логическое выражение>:
<код выполняемый если выражение возвращает истину>
elif <логическое выражение>:
<код выполняемый если выражение возвращает истину>
else:
<код выполняемый если выражение возвращает лож>
Пример:
if a==0:
print 'a=0'
elif a==1:
print 'a=1'
elif a==2:
print 'a=2'
else:
print 'a не равно 0,1,2'

Этот пример простоват с точки зрения написания кода но я стараюсь усреднить уровень необходимый для чтения этого текста. Мне необходимо показать простые конструкции для того что бы не заморачиваться на смысле, а делать акцент на особенность языка.

Циклы
В этот раздел входят не только сами циклы но и дополнительные функции для их работы. Так как подход Питона к циклу необычный. И в будущем вам прейдется выбирать в коком виде описывать цикл для того что бы недостатки методов не повлияли на быстродействие. Мое мнение даже читаемость кода (на которую делает ставку Питон как и некоторые интерпретируемые языки программирования) не должна стоять на пути оптимизации выполнения и достижения быстродействия (о этом позже). В инструкции Питона for тоже имеются отличия как в описании так и выполнении. for в Питоне перебирает произвольные элементы в выстроенные в определенной последовательности (вспомните списки, где элементы не обязательно должны быть одного типа данных).
Инструкция for

for <переменная> in <список значений>:
<действие которое будет выполняться на каждом шаге цикла>

Здесь переменная будет принимать значение элемента списка на каждом обороте цикла.


Пример использования
Результат вывода
a=['red','blue','cyan']
for i in a:
print i
red
blue
cyan
a=['red','blue','cyan']
for i in a:
print a.index(i)
0
1
2
a=['red','blue','cyan']
for i in a[:]:
a.append(i+'d')

a='Python'
for i in a:
print i
P
y
t
h
o
n

Примечание: В второй строке таблицы примеров показано что переменная может принимать значения списка. Но что если вы хотите изменить этот список во время выполнения цикла. Как показано в третьей строке таблицы примеров вам необходимо сделать копию списка в которой и будет работать переменная (используется a[:]). Метод index тратит «много» времени на определение индекса элемента. Не используйте его в больших циклах без особой необходимости.

Для того что бы перемененная принимала значения индексов в определенной последовательности и с определенным шагом можно переменить функцию range. Она возвращает список чисел (арифметическую прогрессию) в зависимости от аргументов которые вы укажете.

Пример использования
Результат вывода
print range(3)
[0, 1, 2]
print range(3,10,2)
[3, 5, 7, 9]
print range(10,2,-2)
[10, 8, 6, 4]
for i in range(5):
print i
0
1
2
3
4
a=['red','blue','cyan']
for i in range(len(a)):
print a[i]
red
blue
cyan

Примечание: функция len, как вы наверное уже догадались по аналогии с другими языками программирования возвращает длину элемента (в списке количество элементов, в тексте символов.

Инструкция while

while <логическое выражение>:
<действие>

Если логическое выражение возвращает правду то выполняется оборот цикла и так до тех пор пока логическое выражение не вернет лож.
Для работы с циклами в Питоне этого почти достаточно. Но для комфортного управления циклами рассмотрим еще пару процедур.
Процедура break указывается в теле цикла и прерывает этот цикл (именно тот цикл внутри которого она непосредственно находиться остальные циклы продолжают работать дальше).
Процедура continue аналогична процедуре break но в точности наоборот. Она продолжает выполнение текущего цикла о следующей итерацией (аналогично как и в C)
Процедура pass используется для «пропуска хода». Это процедура пустышка.
Так же в циклах можно использовать else. Если использовать else в связке с for тогда ветвь else будет выполнятся когда закончиться диапазон цикла, а использованая else с while будет выполняться если логическое выражение вернуло лож.
Функции
В работе с функция не так много нового. Необходимо только привыкнуть к их описанию.

def <название функции>(<аргументы>):
return <результат>

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



Пример использования
Результат вывода
def x(a,b):
return a==b
a=3
b=4
print x(a,b)
False
def x(a,b):
print a==b
return
a=3
b=4
x(a,b)
False
def x(a,b):
print a==b
a=3
b=4
x(a,b)
False
def x(a,b):
global y
y=a
print a==b
y=5
a=3
b=4
x(a,b)
print y
False
3

Классы

Модули

Работа с файлами

Практика

2 коммент. on "Боевое крещение. Python"

Анонимный комментирует...

мда. статья может и путёвая, но сил дочитать эти серые буковки на чёрном фоне ну нету совсем. Итог - нахуй ф топку

CryptSpirit комментирует...

И сам не помню зачем я ее опубликовал не отформатировав. Думаю либо удалю либо переоформлю.