
Мгновенный Python
Перевод: Михаил Александрович Беланов (belanov@starcity.tcnet.ru)
Это минимальный экспресс - курс программирования на языке Python (или Пайтон). Для более глубокого изучения ищите документацию на посвящённом ему WEB-сайте, http://www.python.org , особенно на странице "Tutorial" Если вы не понимаете, почему вы должны интересоваться языком Python, то посмотрите там же страницу "Comparison" , где даётся сравнение Python с другими языками.
1. Основы
Для начала рассматривайте Python как псевдокод. Это почти правда. Переменные как-будто не имеют типов - поэтому их не требуется их объявлять. Они возникают, когда вы присваиваете им значения, и исчезают, когда вы больше их не используете. (Типы переменных определяются автоматически при выполнении программы). Присваивание осуществляется оператором = , а равенство проверяется оператором == . Вы можете присвоить значения нескольким переменным зараз:
x, y, z = 1, 2, 3
first, second = second, first
(прим.перев.: сначала вычисляются все выражения в правой части равенства, слева направо, потом эти значения по очереди присваиваются переменным, перечисленным в левой части)
a = b = 123
Блоки операторов обозначаются отступами, и только отступами (никаких "операторных скобок" вроде BEGIN - END или фигурных скобок). Вот некоторые обычные управляющие структуры:
if (x > 10) and (x < 20) :
print "икссс хороший"
if 10 < x < 20 :
print "икссс хороший"
for i in [1, 2, 3, 4, 5] :
print "это - номер цикла: ", i
x = 10
while x > 0 :
print "x всё ещё положительный"
Первые два примера эквивалентны.
Переменная цикла (индекс) в примере цикла for принимает все возможные значения из списка (list), (который записывается как в примере). Чтобы сделать "обыкновенный" цикл (т.е. со счётчиком количества выполнений), используйте встроенную функцию range() .
#Печатает все значения от 0 до 99 включительно:
for value in range (100) :
print value
(Строка программы, начинающаяся с "#", является комментарием и
игнорируется интерпретатором).
Хорошо, теперь вы знаете достаточно (в теории), чтобы записать любой алгоритм на Python. Давайте добавим некоторый элементарный интерфейс пользователя. Чтобы он мог вводить данные (по приглашению программы), используйте функцию input :
x = input ("Введи сюда число:")
print "Квадрат этого числа составляет ", x * x
Функция input показывает заданное приглашение (которое может быть пустым), позволяя пользователю ввести любое допустимое в Python значение. В данном примере мы ожидаем, что будет введено число. Но если будет введено что-то другое (скажем, строка), то случится "крах" программы. Чтобы избежать этого, нам понадобится какой-то контроль ошибок. Я не хочу углубляться в это. Достаточно сказать, что если вы хотите, чтобы то, что ввёл пользователь, было запасено в программе буквально, в виде строки символов, то используйте вместо input функцию raw_input . Замечание. Если вы хотите, чтобы по функции input вводилась строка символов, то пользователь должен в явном виде указывать кавычки вокруг неё. В Python для строк может использоваться пара как одинарных, так и двойных кавычек.
Итак, у нас есть управляющие структуры, ввод-вывод, теперь мы хотим иметь какие-то интересные структуры данных (то есть типы всё же есть). Наиболее важными из них являются списки (list) и словари (dictionary). Списки записываются в квадратных скобках и, естественно, могут быть вложенными:
name = ["Cleese", "John"]
x = [[1, 2, 3], [y, z], [[ ]] ]
Одним из привлекательных качеств списков является то, что вы можете обращаться к их элементам не только по отдельности, но и по группам, используя индексацию (indexing) и сечения (slicing). Индексация, как и во многих других языках, производится добавлением к имени списка индекса в квадратных скобках (учтите, что первый элемент имеет индекс 0).
print name [1], name [0]
Печатает: "John Cleese"
name [0] = "Smith"
Сечения напоминают индексы, однако вы указываете начальный и конечный индекс, через ":", получая в результате подсписок:
x = ["мусор", "мусор", "мусор", "яйца", "и", "мусор"]
print x [3:5]
Печатает список: ["яйца", "и"]
Обратите внимание, что верхняя граница диапазона индексов не включительная. Если одна из границ диапазона опущена, то подразумеваются все элементы в том направлении. Например, выражение spisok [:3] означает "каждый элемент списка spisok с первого и до третьего, не включительно". (Вы можете возразить, что индекс 3 на самом деле означает четвёртый элемент, поскольку счёт идёт с 0. Действительно ...). С другой стороны, выражение spisok [3:] означает "все элементы списка, начиная с имеющего индекс 3, включительно, и до конца списка, включая последний". Действительно интересный результат можно получить, применяя отрицательный индекс: spisok [-3] это третий элемент с конца. Говоря об индексах, нужно упомянуть, что встроенная функция len даёт длину списка.
Теперь насчёт словарей. Говоря попросту, они похожи на списки, только элементы в них не упорядочены. Как вы можете делать индексацию в них? Для этого каждый элемент имеет ключ (key), или "имя", по которому его можно найти точно так же, как в обычном словаре. Вот несколько примеров словарей:
{"Alice" : 23452532, "Gennady" : 252336, "Clarice" : 2352525}
person={'имя' : "Robin", 'фам.' : "Hood", 'занятие' : "партизан"}
Теперь чтобы узнать, чем занимается человек, перечисленный в словаре person, мы используем выражение вида person ['занятие']. Если мы хотим изменить фамилию человека, мы пишем:
person ['фамилия'] = "of Locksley"
Просто, не так ли? Как и списки, словари могут содержать в себе другие словари. Или списки, кстати. И, естественно, списки могут содержать в себе словари. Это позволяет вам создавать довольно сложные структуры данных.
2. Функции
Следующий шаг: абстракция . Мы хотим присвоить имя куску программного кода и затем вызывать его, задавая параметры. Другими словами, мы хотим определять функции (или процедуры). Это легко. Для определения функции используйте ключевое слово def , как в примере:
def square (x) :
return x*x
print square (2)
Печатает: 4
Для тех из вас, кто понимает, что это такое: все параметры функций в Python передаются по ссылке (как, например, в Java). Для тех, кто не понимает: не заботьтесь об этом. Python имеет такие привлекательные особенности, как именованные аргументы функций и значения для аргументов по умолчанию. Более подробно об этом см в Разделе 4.7 "Tutorial" -а, или в пункте 10.4 "Семинара"
Если вы имеете общее представление о том, как пользоваться функциями, то это в основном и всё, что вам надо знать об их использовании в Python (Да, ещё: ключевое слово return останавливает работу функции и возвращает указанное значение в качестве её результата). Важно, однако, знать, что Python функции являются значениями. Поэтому, если вы имеете функцию, скажем, square, то вы можете написать:
queeble = square
print queeble (2)
Печатает: 4
Вызывая функцию без аргументов, не забывайте писать её имя со скобками, т.е. doit (), а не doit. В последнем случае будет, как показано выше, возвращена сама функция как значение (это бывает нужно для задания методов для объектов, о чём см. ниже).
3. Объекты и всё, что к ним относится
Я предполагаю, что вы знаете, как действует объектно-ориентированное программирование. (В противном случае этот раздел для вас будет не слишком полезен, но это неважно. Можно начать программировать и без объектов). В Python вы определяете класс, используя (вот сюрприз) ключевое слово class . Например:
class Basket :
#создаём класс Basket ("корзина") с
#методами add("поместить что-то в корзину")
# и print_me ("распечатать всё содержимое
#корзины").Не забывайте использовать
#аргумент "self"
def __init__(self, contents=NONE):
self.contents = contents or []
def add (self, element):
self.contents.append (element)
def print_me (self):
result = ""
for element in self.contents:
result = result + " " + `element`
print "Содержит:" + result
Здесь новым является то, что:
Все методы (функции, заданные для объекта) имеют дополнительный аргумент, находящийся в начале списка аргументов - а именно self ( "сам" ). Он имеет специальное значение - обозначает сам объект определяемого класса.
Методы вызываются в программе так: Объект.Метод (Аргументы) .
Некоторые имена методов, такие как __init__ , предопределены и имеют специальное значение. Так, __init__ - это имя конструктора класса, т.е. функции, которая автоматически вызывается каждый раз, когда вы создаёте экземпляр класса (т.е. переменную).
Некоторые аргументы являются необязательными и им даётся значение по умолчанию (как было упомянуто выше, в рассказе о функциях). Значение по умолчанию задаётся следующим образом:
def f (x=100):
...
Здесь функция f может быть вызвана с одним параметром или без параметров. Если она вызвана без параметров, то по умолчанию параметру x присваивается значение 100.
"Логика коротких заключений" (short cirquit logic). Это умно. См. ниже.
Кавычки с обратным наклоном преобразуют объект в его строковое представление (так что если element содержит число 1, то `element` это строка "1", в то время как 'element' это строка со словом element).
Знак сложения + используется для конкатенации списков, а также и строк, поскольку они в действительности являются списками символов (это означает, что вы можете использовать для строк индексацию, сечения и функцию len . Потрясно, правда?.
В Python никакие методы классов не являются защищёнными (приватными и т.п.). Инкапсуляция в основном является вопросом стиля программирования.
Теперь о "логике коротких заключений" ... Все значения в Python могут использоваться как логические. Те, которые "пусты" (как 0, [] или "" и None ) представляют логическое значение "ложь" , а большинство других (напр., [0], 1, "Hello, comrade") представляют логическое значение "истина" . Поэтому значения логических выражений вроде a and b ("a И b") вычисляются следующим образом: сначала проверяется, является ли a истиной. Если нет, то просто возвращается a. Если да, то возвращается b (которое будет представлять истиностное значение выражения). Аналогично, для значения выражения a or b ("a ИЛИ b") имеем: если a истинно, то возвращается a. Если нет, то возвращается b.
Этот позволяет операторам and и or действовать наподобие булевых операторов "и" и "или", которые они призваны представлять, но он также даёт способ короткой записи условных выражений. Например, выражение:
if a:
print a
else:
print b
можно записать короче:
print a or b
Фактически, подобное сокращение представляет собой нечто вроде идиомы в Python, поэтому вам надо к нему привыкнуть. Мы уже использовали его в методе Basket.__init__. Аргумент contents имеет значение по умолчанию None (ничего), которое помимо прочего означает логическую "ложь" . Поэтому, чтобы проверить, что contents имеет какое-то значение, мы могли бы написать: