Kodomo

Пользователь

Использование Python в качестве калькулятора

Вводные слова

Python был создан когда-то давно, лет двадцать, наверное уже, тому назад. Создавал его – да и поныне создаёт – Guido van Rossum. Когда-то двано сложилась традиция упоминать о нём не иначе как Benevolent Dictator For Life, BDFL (Милостивый Диктатор По Жизни). Рассказывать о том, почему Гвидо взялся писать новый язык, какими языками вдохновлялся и почему это всё осталось жить и выросло до большого и хорошего языка – интересно и долго – но я и сам этого как следует не знаю, а потому врать не буду. Скажу лишь, что название языка никак не связано ни с какими змеями, а происходит от названия комической труппы: Monty Python. Впрочем, всяческие околопитоновские проекты всё же принято называть змеиными именами.

О том, как устроен этот курс

Курс этот годовой, хотя в учебной программе он и обозначен как семестровый. Должные зачёты я проставлю, но всё же за семестр я не смогу обучить вас не бояться программировать и уметь использовать питон для чего бы вам не потребовалось. Поэтому курс будет длиться год. С формальной точки зрения может быть это будет называться ещё одним спецкурсом – посмотрим как получится.

Моя основная надежда и основной подход состоит в том, чтобы обучать программированию как плаванию: сначала вы побарахтаться в воде, а уж потом можно обучаться тому, как нужно грести. То же самое и тут: сначала вы будете делать что-то, что может у вас будет получаться, а может быть, нет, а лишь потом я буду объяснять, что же вы делали, и подводить всяческую красивую и умную теорию. (А теория у питона действительно красивая и умная).

Когда у вас что-то не получается, не отчаивайтесь. Во-первых, чем важнее материал, тем раньше я его вам подаю – чем раньше я его подаю, тем больше вам, как уж не крутите, придётся с ним иметь дело и им пользоваться, и тем больше у вас времени в нём разобраться. Во-вторых, вы можете спросить меня, – в личном диалоге дорассказывать непонятное интереснее и полезнее. Ну и в-третьих, скорость, тему и объём подачи материала на очередном занятии я определяю по тому, как вы сделали задания.

Чему я надеюсь вас учить? Мне кажется, что навык программирования складывается из нескольких частей: умение строить / применять алгоритмы, владение средствами (языками и библиотками) и умение овладевать новыми средствами, дисциплина / традиции. Алгоритмист из меня и самого плохой, поэтому я буду вас учить тому, что я умею: владению средствами, поиску документации, дисциплине.

Так как поиск документации – это один из важнейших навыков, которым я хочу вас научить, то довольно принципиальный момент состоит в том, что во время лекции я буду рассказывать вам заведомо меньше информации, чем нужно для выполнения заданий. Впрочем, я буду давать к заданиям подсказки и говорить, где можно прочитать то, что я не рассказывал.

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

Собственно, питон

В классе стоит дистрибутив питона с python.org, в который входит графическая среда Idle (тем, кто ставит питон дома: чтобы установился Idle, нужно указать инсталлятору, чтобы он ставил графическую библиотеку Tcl/Tk). Когда вы запускаете Idle, вы попадаете в интерпретатор командной строки: каждый раз, когда он вам пишет >>>, он ожидает от вас каких-нибудь слов на питоне.

Поиск документации

Прежде, чем рассказывать что-либо о самом языке, самое важное: как искать документацию.

Источников документации я вам пока что советую два: встроенная документация и сайт питона. Документация вся на английском, так что если вы себя неуверенно в нём чувствуете, будет вам заодно в нём и практика. Всё равно английский язык – основной язык программирования (и науки в целом), и английского языка я от вас буду требовать много где.

Встроенная документация: предположим, у вас есть какой-нибудь питоновский объект, например, 42 (слово "объект" здесь корректно употребить с точки зрения питона, но если с точки зрения обычного русского языка оно вас смущает, – пусть оно будет называться не "объект", а "сущность" или "штука"), и вы хотите о нём узнать. Вы пишете так:

   1 >>> help(42)
   2 ...

Питон вам напишет на две страницы (а то и больше) всяких буковок, которые с некоторыми усилиями можно будет понять, что же они значат, и что с ними делать.

Сразу две оговорки про help: если ему дать строку, то он будет писать не документацию о том, что можно делать с этой строкой, а будет писать текст об устройстве самого питона. (Я не нахожу это особо полезным). Если же ему не дать ничего, вызвать его с пустыми скобками, он запустит режим "командной строки отображения документации". Этот режим я нахожу особенно бесполезным и предупреждаю, что если вы случайно в него попали, то "quit" – это ваш спаситель, он вернёт вас в питон:

   1 >>> help("print")
   2 ...
   3 >>> help()
   4 ...
   5 help> print
   6 ...
   7 help> quit
   8 >>>

Второй важный источник документации – сайт питона. А именно – Library reference. Как название и говорит, это справочник. Когда вы хотите что-то в питоне найти совсем для вас новое – ищите тут. Тут есть вся стандартная библиотека и более человекочитаемые (чем во встроенной документации) объяснения про стандартные типы – строки, числа и что мы там дальше изучать будем.

Строки и числа

Два первых типа данных в питоне: числа и строки. С ними всё довольно интуитивно и как и в любых других языках программирования (но проще и интуитивнее).

Примеры:

   1 >>> print(1+2*4)
   2 9
   3 >>> print("hello, world!")
   4 hello, world
   5 >>> print(" 1 " + " 2 ")
   6  1  2 
   7 >>>

Сложение строк – это их склеивание. Довольно интуитивная операция, по-моему. Обратите внимание: чтобы между строками оказались пробелы, я их вручную вставлял в слагаемые.

Задача
а как вы думаете, в питоне обозначается возведение в степень? Есть идеи, почему так?

Когда я говорю вам "напечатайте что-нибудь", это всегда обозначает, что вам нужно использовать print(), как в примере выше. Но когда вы используете командную строку для себя, удобнее print не писать:

   1 >>> 1+2*4
   2 9
   3 >>> "hello"
   4 "hello"

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

   1 >>> print(15 % 4)
   2 3

% – остаток от деления по модулю для чисел. Для строк эта операция имеет другое очень важное значение: подстановка значений в шаблоны. Это контринтуитивно1, но очень полезно и потому я рассказываю об этой возможности сразу:

   1 >>> print("Hello, %s!" % ("world"))
   2 Hello, world!

Мы создаём шаблон "Hello, %s!" и подставляем в него вместо %s значение "world". В шаблоне можно указывать разные типы подстановок, я расскажу о двух самых полезных, остальные ищите в документации: %s подставляет строку (или превращает продставляемое в строку, если оно ещё строкой не является); %5.2f ожидает число, и если это число с плавающей точкой, то из этого числа он делает запись длиной не менее 5 символов, оставляя не более 2 знаков после запятой.

   1 >>> print("Hello, %.2f %s!" % (3.141592, "diggers"))
   2 Hello, 3.14 diggers!

Ещё тут видно, что если мы подставляем более одного значения в шаблон, значения пишутся в скобках через запятую.

Переменные

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

   1 >>> x = 2*2
   2 >>> y = "Hello, world!"
   3 >>> print(x)
   4 4
   5 >>> print(y)
   6 Hello, world!

Сразу же пример, чтобы было понятно, что есть что в шаблонах:

   1 >>> template = "Hello, %.2f %s!"
   2 >>> values = (3.141592, "diggers")
   3 >>> print(template % values)
   4 Hello, 3.14 diggers!
Задача
а какие ещё стандартные арифметические операции вы думаете, что в питоне можно применять к строкам? Попробуйте (или почитайте документацию). Насколько ожидаемыми оказались результаты?

Модули

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

Так вот. Свалка штук к питону называется модулем. И пользоваться ими так:

   1 >>> import math
   2 >>> print(math.pi)
   3 3.1415926535897931

Узнать, что есть в модуле math, кроме числа пи, можно как обычно:

   1 >>> help(math)
   2 ...
   3 >>> help(math.sin)
   4 ...
   5 >>> print("%.2f" % (math.sin(10)))
   6 -0.54

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

Теперь у вас в руках калькулятор с полным стандартным набором математики, да ещё и возможностью красиво оформлять ответы.

  1. Для людей, программировавших на языке Си или каком-нибудь из языков, унаследовавших из него функцию printf и её форматы (в их числе Perl, Java, PHP и много других языков), это даже не контринтуитивно, а понятно и удобно. (1)