Краткая справка по Python

Этот документ — именно краткая справка. За подробностями лучше обращаться к официальной документации.

Общая структура программы

Программа на языке Python представляет собой последовательность команд: каждая команда — на отдельной строчке (допускается также разделять команды точкой-с-запятой).

Самые частовстречающиеся команды:

  • вычислить значение формулы (оформляется этой самой формулой)
  • изменить что-нибудь (оформляется знаком =, справа от которого стоит формула, а слева — то, что нужно изменить)
  • ветвление (оформляется при помощи слов if, elif, else)
  • цикл (оформляется при помощи слов for или while)
  • определение подпрограмм (оформляется при помощи слова def)
  • использование внешнего модуля (оформляется при помощи слова import)

Также в программе могут встречаться комментарии, начинающиеся знаком # и длящиеся до конца строчки.

Синтаксис формул

Формулы — отдельная грамматическая категория. Команды внутри формул не встречаются, а вот формулы являются частью почти всех команд!

Формулы составляются из литералов, переменных и операторов.

Переменные

С точки зрения грамматики переменная — одно слово, не совпадающее ни с одним из небольшого набора зарезервированных (таких как if, else и т.п.). В слове допускаются буквы, нижние подчёркивания, цифры (но цифра не может стоять в начале слова).

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

переменная = формула

которая сначала вычисляет значение формулы, а потом привязывает указанную переменную к этому значению.

Допускается множественное изменение (в нём может участвовать и больше двух переменных):

переменная1, переменная2 = формула1, формула2

Операторы

Оператор применяется к одной или нескольким формулам, называемым операндами этого оператора. Количество таких формул называется арностью этого оператора.

Среди операторов наиболее часто встречаются:

  • вызов функции XXX(YYY)
  • доступ к атрибуту XXX.YYY
  • индексация коллекции XXX[YYY]
  • проверка на вхождение XXX in YYY
  • сумма XXX + YYY, разность XXX - YYY, произведение XXX * YYY
  • частное XXX / YYY, неполное частное XXX // YYY, остаток XXX % YYY
  • унарный минус -XXX
  • степень XXX ** YYY
  • эквивалентность XXX == YYY, неэквивалентность XXX != YYY
  • строгие неравенства XXX < YYY и XXX > YYY
  • нестрогие неравенства XXX <= YYY и XXX >= YYY
  • логические операции: не not XXX, и XXX and YYY, или XXX or YYY
  • поразрядные/поэлементные операции: и XXX & YYY, или XXX | YYY, сумма XXX ^ YYY

Литералы

Литералами называются специальные обозначения для некоторых объектов. Можно считать их операторами с уникальным (для каждого из них) синтаксисом.

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

Наиболее часто встречаются:

  • числа 123, 12.3, 1.23e1, 2+3j и тому подобное
  • тексты 'foo' или "foo" (одинарные и двойные кавычки не различаются)
  • функции lambda x,y: x + 2*y
  • списки (массивы) [1,2,3]
  • кортежи (неизменяемые массивы) (1,2,3)
  • множества {1,2,3}
  • словари (ассоциативные массивы) {"foo": 1, 3: "bar", 5+1: 3+1}

Семантика формул

Арифметика

Всё более-менее стандартно по модулю одной особенности: неполное частное — результат округления соответствующей дроби вниз, а не к нулю (как принято в большинстве языков программирования). При этом всегда выполняется

a == (a // b) * b + (a % b)

Логика

В качестве основных логических значений используются «истина» True и «ложь» False. К ним можно применять конъюнкцию (& или and), дизъюнкцию (| или or), сложение ^ и отрицание not.

Отдельно выделим and и or: они вычисляют свой правый операнд только если левый истинный (для and) и ложный (для or). Ложными считаются None, False, всевозможные нули и всевозможные пустые контейнеры.

Остальные объекты встроенных типов считаются истинными.

Функции

Скоро появится

Списки

Список работает как набор «безымянных переменных», называемых его элементами. Элементы нумеруются последовательными натуральными числами (начиная с нуля).

Элемент списка можно получить при помощи формулы список[номер], где список — формула, значением которой является интересующий нас список, а номер — формула, значением которой является интересующий нас номер элемента.

Узнать количество элементов списка можно функцией len.

Изменить элемент списка можно командой изменения. Например:

foo[3] = 5  ## привязать третий элемент к пятёрке

Очень важный момент: каждый списковый литерал создаёт новый список, а перепривязка переменной — нет.

foo = [1,2,3,4,5]
bar = foo         # bar привязана к тому же списку, что и foo
bar[0] = 5        # теперь и foo[0] == 5
baz = [1,2,3,4,5] # а это -- уже совсем другой список
bar[1] = baz[1]   # первый элемент списка bar теперь привязан к 
                  # значению формулы baz[1], то есть числу 2 
                  # (но не к первому элементу списка baz!)

Чтобы скопировать часть списка (то есть создать новый список с теми же привязками), можно воспользоваться срезом:

foo = [1, [2, 3], 4]
bar = foo[1:3] # копируем элементы списка с 1-го (включая) по 3-й (исключая)
bar[1] = 5     # foo[2] по-прежнему 4
bar[0][0] = 5  # теперь и foo[1][0] == 5: срез делает "неглубокую" копию

В срезе можно опустить один или оба индекса. Тогда они считаются равными нулю и количеству элементов списка соответственно. В частности, foo[:] делает копию всего списка foo.

Также допускаются срезы с тремя индексами (подробности — в документации).

Добавить новые элементы к списку можно при помощи метода (атрибута-подпрограммы) append: foo.append(123) добавляет в конец списка foo элемент, привязанный к числу 123.

Кортежи

Кортежи отличаются от списков только тем, что их структуру (длину и привязки элементов) нельзя изменять. Тем не менее, никто не мешает на основе список и кортежей делать, например, «списки постоянной длины»:

foo = ([1], [2], [3])
foo[1][0] = 5  # теперь foo == ([1], [5], [3])

# можно даже спрятать соответствующие формулы с [0] за функциями
def get_elem(a, i): return a[i][0]
def set_elem(a, i, v): a[i][0] = v
# теперь, не зная о внутренней структуре "списков постоянной длины", их
# "элементы" невозможно (зло)намеренно удлинить

Множества

Скоро появится

Словари

Скоро появится

Семантика команд

Скоро появится