Программирование и научные вычисления на языке Python/§1

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



## Первая программа

Первая задача, которую мы рассмотрим — школьная задача о вертикальном движении мяча, подброшенного в воздух. Мы знаем математическую модель, описывающую такое движение и можем найти координату *y*, в которой оказывается мячик в момент времени *t*:

(1.1) |


где *v 0* — начальная скорость мячика,

*g*— ускорение свободного падения и

*t*— время. Заметим, ось

*y*выбрана так, что мячик в начальный момент времени (

*t = 0*) находится в точке с координатой

*y = 0*. Чтобы посмотреть сколько времени займет у мячика вернуться в эту же координату (

*y = 0*), надо с одной стороны в выражении (1.1) правую часть приравнять нулю, с другой — вынести переменную

*t*:



Таким образом, мы определили, что возможное время полета мяча задается интервалом времени .



### Программа как калькулятор

Наша первая программа будет находить координату мяча для выбранных нами значений начальной скорости, ускорения и момента времени. Соответственно выберем *v 0* = 5 м/с,

*g*= 9.81 м/с

2, мяч вернется к нам в руки после

*t*= 2

*v*/

0*g*≈ 1 c. Это значит, что нам интересен только интервал времени [0, 1]. Представим, мы хотим узнать высоту на которой окажется мяч в момент времени

*t*= 0.6 c. Арифметическое выражение и его аналог в виде однострочной программы на Python представлены далее:



```
print 5*0.6 - 0.5*9.81*0.6**2
```


Четыре стандартных арифметических операции в Python, как во многих других языках программирования записываются так +, -, * и /. Возведение в степень записывается двумя звездочками: **. Наша задача теперь написать и запустить программу, что мы вскоре и сделаем. Но вначале поговорим о том, *что* мы должны делать.

### О программах и программировании

Компьютерная программа — это всего лишь набор инструкций для компьютера, написанных на компьютерном языке. Большинство компьютерных языков выглядят похожими на английский, но они гораздо проще. Число зарезервированных слов и устойчивых выражений сильно ограничено, поэтому чтобы совершить какую-то операцию, мы должны комбинировать эти слова и выражения. Текст программы, содержащий эти инструкции, расположен в одном или более файлах. Компьютер делает только то, что программа говорит ему делать.

Другое значение слова "программа" — это файл, который запускается для выполнения какой-то задачи. Иногда это файл с инструкциями, а иногда это "перевод" инструкций на языке программирования в более понятный и потому более эффективный компьютерный язык, который сложно понять человеку. Все программы в этой части состоят из короткого текста, расположенного в одном файле. Другие программы, которые вы часто используете, например, ваш браузер, с помощью которого вы читаете этот текст, состоят из большого числа файлов, написанных множеством людей за несколько лет.

Программирование это написание программ, но этот процесс — не просто задание правильных инструкций, записанных в файле. Во-первых, мы должны понять, как проблема может быть решена заданием инструкций компьютеру. Это обычно наиболее сложная вещь в программировании. Во-вторых, мы должны правильно перевести наши инструкции в язык программирования и записать соответствующий текст в файл. В-третьих, мы должны запустить программу, проверить правильность результатов, и тут обычно наступает "в-четвертых" - найти и исправить ошибки. Овладение всем этим процессом требует долгой тренировки, которая заключается в написании большого числа работающих программ, для начала - решении упражнений в конце параграфов.

## Инструменты для написания программ, установка Python

Поскольку программы состоят из текста, мы нуждаемся в чем-то, что поможет нам записать этот текст в файл. Множество людей используют компьютеры для написания текстов с помощью специальных программ — текстовых редакторов, например Microsoft Word. Эти программы форматируют текст, вставляют специальные символы, чтобы придать документу стандартный вид и эти символы понимают только эти редакторы, поэтому текстовые редакторы не подходят для написания программного кода. Даже если текст сохраняется без форматирования, пробелы и отступы, которые очень важны в программах на Python, в текстовых редакторах могут быть разбиты неправильным образом.

Специальный редактор программ на Python поставляется вместе с интерпретатором языка. Этот редактор называется IDLE и инсталлируется под этим же именем. С этого момента, если вы еще этого не сделали, рекомендую вам скачать Python 2.6 c официального сайта. Обращаю ваше внимание, что в этом курсе мы будем работать именно с этой версией языка (2.6). Стандарт Python 3 относится к новым разработкам, под которые еще не переписаны те библиотеки, что мы будем использовать.

Установка Python происходит аналогично другим установкам и обычно не вызывает каких-либо сложностей. После инсталляции вы можете найти программу среди другого программного обеспечения вашей операционной системы.



### Использование IDLE

Первое, что стоит сделать это определить свое рабочее место, то есть создать папку, в которой вы будете работать и экспериментировать. Второе,— это запустить интерактивную оболочку языка — IDLE.

IDLE поставляется вместе с Python. После того как вы установили на свой компьютер Python, вы можете запустить IDLE в Windows, пройдя по следующему пути: Пуск → Все программы → Python 2.6 → IDLE (Python GUI). На экране появляется окно с заголовком Python Shell.

В меню File выберите пункт New Window. Появится окно, в котором мы запишем нашу однострочную программу:



```
print 5*0.6 - 0.5*9.81*0.6**2
```


Теперь ваша программа находится в редакторе IDLE, но перед тем как программу запустить, ее нужно сохранить. Выберите File, затем Save As и найдите в обозревателе папку, которую вы создали для наших программ. Введите название программы. Название может быть любым, но рекоммендуем вам выбрать ball_numbers.py, чтобы легче ориентироваться в наших примерах. Не стоит забывать про расширение .py, сам IDLE за вас его писать не будет и может сохранять текст в различных форматах.



### Как запустить программу

Для того, чтобы уже сейчас запустить программу, достаточно выбрать Run → Run Module или нажать F5. В окне IDLE, в котором мы оказались как только его запустили мы увидим результат расчета:



```
1.2342
```


Естественно в нашей простой программе мы можем подставить любые другие интересующие нас начальную скорость и момент времени и повторить те же действия. Выберем теперь *v 0* = 1,

*t*= 0.1. Наша программа примет следующий вид:



```
print 1*0.1 - 0.5*9.81*0.1**2
```


Сохранив файл и запустив программу заново, в новых условиях получаем новую координату мячика:



```
0.05095
```



### Проверка результатов

Мы должны всегда внимательно контролировать, что программа дает правильные результаты. Вы увидите что в большинстве случаев, пока вы еще не набрались опыта программирования, выходные данные будут оказываться неверными и вам придется искать ошибки. В нашем первом примере для того, чтобы проконтролировать действия программы, мы можем просто использовать калькулятор и подставить заданные значения в формулу. Для *t* = 0.6 and *v 0* = 5, калькулятор покажет 1.2342. Это и будет означать, что наше решение работает правильно. Сейчас мы обсуждаем очень простые вещи, но пропуская их и не видя друг друга, мы можем ошибаться в нашем взаимном понимании.



## Переменные

Конечно, простая подстановка чисел не очень интересная задача, поскольку как мы только что убедились, на такое способен и калькулятор. Если мы хотим узнать *y(t)* для многих значений времени *t*, нам бы требовалось изменять *t* в двух местах. А если еще нужно изменить значение *v 0*, то мы можем и вовсе запутаться и совершить ошибку. Такие изменения проще оформлять в виде переменных. Большинство языков программирования, в том числе и Python используют переменные также как это делается в математике. Это означает, что мы можем задать

*v*,

0*g*,

*t*и даже

*y*как переменные нашей программы. Первые три мы будем задавать, придавая им какие-то численные значения, а последнюю выражать через них.

Альтернативная версия нашей программы с использованием переменных будет выглядеть так:



```
v0 = 5
g = 9.81
t = 0.6
y = v0*t - 0.5*g*t**2
print y
```


Заметим, что так программу гораздо более удобно читать и становится понятно что она делает, поскольку ее вид очень близок к тому как мы математически записали выражение (1.1). Программа также более безопасна относительно наших исправлений, потому что мы видим к чему относится изменяемое нами число. К тому же, нам достаточно изменить переменную (например, *t*) всего лишь в одном месте, в остальных местах, где она появится она будет ссылаться на введенное нами значение.



### Имена переменных

Имена переменных могут содержать любые заглавные и строчные английские буквы, цифры (кроме первого символа, первый знак не может быть числом). Python, в отличие от некоторых языков программирования различает заглавные и строчные буквы, поэтому X никогда не то же самое, что x.

К хорошему стилю программирования относится тот случай, когда вводимые переменные сообщают достаточную информацию, для того чтобы понять, какое значение они принимают. Для решения нашей задачи было абсолютно естественно выбрать переменную для времени как *t*, ускорение свободного падения как *g* и т.д., поскольку это общепринятые обозначения. Они будут понятные вам и через час, и через год, и тому, с кем вы совместно работаете, будет несложно понять из текста программы какую задачу вы решали. Представим что мы записали названия наших переменных в примере с мячиком вот так:



```
initial_velocity = 5
acceleration_of_gravity = 9.81
TIME = 0.6
VerticalPositionOfBall = initial_velocity*TIME - 0.5*acceleration_of_gravity*TIME**2
print VerticalPositionOfBall
```


Очевидно, что такой вариант программы сложнее читать, чем предыдущий с переменными *v 0*,

*g*,

*t*,

*y*. Старайтесь давать переменным ясные короткие имена, отражающие проблему в терминах этой задачи. Если две переменные претендуют на одно и то же название, старайтесь дать более короткое название наиболее встречаемой в тексте программы. Но не уходите в крайности.



### Зарезервированные слова Python

Некоторые слова в Python в качестве названий переменных вы использовать не можете, эти слова зарезервированы языком, поскольку именно они его составляют. Эти слова выстроились по алфавиту:

`and, as, assert, break, class, continue, def, del, elif, else, except, False, finally, for, from, global, if, import, in, is, lambda, None, nonlocal, not, or, pass, raise, return, True, try, with, while, yield`.

Попробуйте приписать любому из слов какое-то значение и, запустив программу, вы увидите как Python намекнет вам на ошибку. Поскольку мы учимся и языку, и *думать* на этом языке, в скором будущем мы сможем общаться с помощью этих слов.



## Комментарии

Вместе с компьютерным языком в своих программах, люди практически всегда пишут и "человеческим" языком. Это помогает и себе, и другим объяснить какие идеи послужили для того, чтобы применить именно это решение, пояснить что обозначает эта переменная, что делает эта функция и т. д. Комментарии в Python начинаются со знака #, и все, что следует после этого знака в одной строке игнорируется компьютером, поскольку он понимает, что эти записи не для него. Далее напишем пример программы, в которой вначале опишем, что она делает, потом опишем переменные:



```
# program for computing the height of a ball thrown up in the air
v0 = 5 # initial velocity
g = 9.81 # acceleration of gravity
t = 0.6 # time
y = v0*t - 0.5*g*t**2 # vertical position
print y
```


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



## Форматирование текста и чисел

Вместо того, чтобы только выводить значение *y* в нашей первой программе, мы бы теперь хотели написать более информативный текст, что-то вроде:

`At t=0.6 s, the height of the ball is 1.23 m.`

где бы мы также аккуратно форматировали числа (допустим, нам интересно значение до сотых долей метра — сантиметров). Такой результат достигается с помощью специальных выражений, часто называемых printf-форматированием наподобие аналогичного форматирования в языке С. Для начинающего программиста, синтаксис такого форматирования может показаться неуклюжим, но он вполне прост для изучения и очень удобен и гибок для работы. Задача выше решается так:



```
print 'At t=%g s, the height of the ball is %.2f m.' % (t, y)
```


Посмотрим, что здесь написано. Инструкция print выводит на экран то что заключено в кавычки (как одинарные: ', так и двойные: "), которые показывают, что это строка. Сама строка отформатирована в printf-стиле. Это означает, что в строке имеются два "разъема", обозначенные знаком процента, здесь это %g и %.2f, в которые программа ждет, что вы вставите переменные, по форме подходящие для этих разъемов. И после того как строка закончилась мы после знака процента перечисляем эти самые переменные в том порядке, как мы их ожидаем увидеть в строке. Первая переменная *t* идет в первый разъем, символ после процента показывает что переменная это число и говорит как это число надо отформатировать - записать как можно более компактно. Вторая переменная *y* идет во второй разъем, форматирование .2f показывает, что это число с плавающей (float) точкой, после точки оставить два знака.

Для полноты приведем теперь как выглядит наша программа с форматированным выводом:



```
# program for computing the height of a ball thrown up in the air
v0 = 5
g = 9.81
t = 0.6
y = v0*t - 0.5*g*t**2
print 'At t=%g s, the height of the ball is %.2f m.' % (t, y)
```


Существует множество других методов форматирования, то есть того, что мы указываем после знака процента. Например, часто используется scientiﬁc notation, форматирование через символ e или E в тех случаях, когда числа имеют большие порядки. Например, в таком формате удобно представить заряд электрона, равный 1.6·10-19 Кл можно записать так: q = 1.6e-19.

В рассмотренном нами f-формате, числа до и после точки показывают соответственно сколько символов отводится под число и сколько знаков следует после точки. Форматирование с буквой g выводит в "научном" формате, через e для очень больших и очень маленьких чисел и десятичный вывод для остальных, то есть как и было сказано, выводит числа в наиболее компактном варианте.

Для понимания пара примеров: формат 10.4f и 14.6E. Первое означает, что это число с плавающей точкой, записанное в десятичном формате с четырьмя знаками после точки, а все число вместе с точкой занимает 10 символов. Во втором случае мы имеем число с плавающей точкой, после точки точность нашего числа 6 знаков, места в тексте мы отводим ему 14 символов.

Приведем здесь наиболее часто встречающееся форматирование:



%s | строка |

%d | целое число |

%f | десятичное представление с шестью знаками после запятой |

%e | "научное" представление |

%g | компактное представление десятичного числа |

%xz | вывод в формате z в поле ширины x, выравнивание по правой стороне |

%-xz | вывод в формате z в поле ширины x, выравнивание по левой стороне |

%.yz | вывод в формате z с y знаков после запятой |

%x.yz | вывод в формате z с y знаков после запятой в поле ширины x |

%% | вывод знака процента |



Часто мы хотим, чтобы текст располагался в несколько линий. Возможно как минимум два способа как мы можем это осуществить. Первый - для перехода на новую строку используется специальное сочетание символов - \n. Когда интерпретатор встречает это сочетание, происходит то же, что когда вы нажимаете Enter. Другой способ - использование тройных кавычек, как и одинарных, так и двойных. В этом случае текст выводится как он введен, специальные символы, начинающиеся с \ игнорируются. Следующие два текста программ



```
print 'y(t) is\nthe position of\nour ball.'
```



```
print """y(t)is
the position of
our ball."""
```


выводят на экран одно и то же:


`
y(t) is
the position of
our ball.`



## Чему мы научились

Теперь мы знаем как написать, сохранить и запустить программу. При этом с разумно выбранными именами переменных и поясняющими комментариями мы сможем понять, что делает наша программа и через пять лет. Программа не просто выводит число, а может и рассказать нам, что сделано. Да и сами числа мы можем вывести с требуемой точностью, не думая о лишних знаках после запятой. Правда в том, сможете ли вы все это? Вы сможете убедиться, решив следующие упражнения.



## Упражнения

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