Готовый перевод How to Think Like a Computer Scientist: Learning with Python 2nd Edition. / Как стать программистом: учимся вместе с Python. Второе издание.: Chapter 1 The way of the program
1 Путь программы
Цель этой книги - научить вас думать как программист. Этот вид мышления сочетает в себе лучшее от мышления математиков, инженеров и естествоиспытателей. Подобно математику, программист использует формальный язык для описания идей. Подобно инженеру, конструирующему вещи, программист собирает из модулей, отобранных из множества альетрнатив, цельную систему. Подобно ученому-естествоиспытателю, порграммист наблюдает за поведением системы, выдвигает гипотезы ипроверяет опытами и тестированием.
Самым важным качеством программиста является умение решать проблемы. Оно заключается в умении сформулировать проблему, творчески подойти ко всем вариантам ее решения, и чистом и аккуратном ее решении. Как выяснилось, процесс изучения программирования является великолепной возможностью укрепления в себе подобных качеств. Вот почему этот раздел назван "Путь программы".
На первом уровне, вы будете учиться полезному для себя навыку - программированию. На других уровнях вы будете использовать программирование как средство для достижения поставленных целей. Чем дальше мы будем продвигаться, тем яснее будут становиться цели.
1.1 Язык программирования Python
Язык программирования, который вы будете изучать, называется Python [питон]. Python - это высокоуровневый язык; другие высокоуровневые языки, о которых вы, наверное, слышали - это C++, PHP и Java.
Как вы могди сделать вывод из названия "высокоуровневый язык", существуют и низкоуровневые языки, иногда называемые машинными языками или ассемблерами. Грубо говоря, компьютер может выполнить программу, написанную только на низкоуровневом языке. Таким образом, программы, написанные на высокоуровневых языках, должны быть преобразованы, прежде, чем их можно будет запустить на выполнение. Этот процесс преобразования занимает некоторое время, что ставит немного не в выгодное положение высокоуровневые языки.
Но преимуществ гораздо больше. Во-первых, намного проще писать на высокоуровневом языке. Написание программы занимает много меньше времени, текст программы получается короче и проще для прочтения, его проще корректировать. Во-вторых, программы, написанные на высокоуровневых языкх, переносимы, т.е. они, без каких-либо сильных изменений, могут работать на разных типах компьютеров. Программы, написанные на низкоуровневых языках, могут работать только на одной определенной платформе, для запуска на другой - их придется переписывать.
Благодаря этим преимуществам, практически все программы написаны на высокоуровневых языках. Низкоуровневые языки используются только для написания узкоспециализированных приложений.
Два типа программ преобразуют высокоуровневый код в низкоуровневый: интерпретаторы и компиляторы. Интерпретаторы читают программу и выполняют ее, попеременно считываю очередную строку и выполняя вычисление.
Компилятор считывает программу и транслирует ее полностью до того, как программа запустится. В этом случае, тект программы называется исходным кодом, а откомпилированная программа - объектным или исполняемым кодом. Однажды откомпилировав программу, вы можете запускаьб ее любое количество раз без каких-либо изменений.
Множество современных языков поддерживают оба способа. Сначала, они компилируют в низкоуровневый байт-кодом, а затем интерпретурют его специальной виртуальной машиной. Python использует оба подхода, но чаще он рассматриватся как интерпретируемый язык.
Есть два способа использования интерпретатора: из оболочки или из скрипта. В оболочке, вы пишете выражения и интерпретатор немедленно печатает результат:
$ python
Python 2.5.1 (r251:54863, May 2 2007, 16:56:35)
[GCC 4.1.2 (Ubuntu 4.1.2-0ubuntu4)] on linux2
Напишите "help", "copyright", "credits" или "license" для большей информации.
>>> print 1 + 1
2
В первой строчке команда, с помощью которой запускается интерпретатор Python в командной строке Unix. Следующие три строки содержат служебную информацию. Четвертая строка начинается с символов >>>, это приглашение Python ввести команду. Интерпретатор использует приглашение, чтобы показать, что он готов к выполнению инструкций. Мы написали print 1 + 1, и интерпретатор ответил: 2.
С другой стороны, вы можете написать программу в файл, и воспользоваться интерпретатором, чтобы запустить его. Такой файл называется скриптом. Например, мы используем текстовой редактор для создания файла firstprogram.py. Напишем следующее:
print 1 + 1
Принято назвать файлы, сожержащие программы Python, именем с окончанием .py.
Для выполнения программы, мы должны указать интерпретатору имя нашего скрипта.
$ python firstprogram.py
2
Это пример показывает, как Python запускается из командной строки Unix.
Примеры в этой книге используют оба подхода: командную строку и скрипты. Вы можете использовать командную строку для всех примеров, так как интерпретатор готов к работе сразу при запуске Python.
Работа в командной строке удобна для тестирования коротких кусков кода, так как показывает немедленный результат. Используйте ее, как блокнот для заметок, чтобы избежать проблем в работе. Код, длиннее нескольких строк, лучше помещать в скрипт.
1.2 Что такое программа?
Программа - это набор инструкций, указывающих, как выполнить вычисления. Вычисления могут быть как математическими, например, решение системы уравнений или поиск корня полинома, так и символьными, например, поиск и замена текста в документе или (как это ни странно) компилирование программы.
Детали выглядят по разному в разных языках, о основа у всех одна:
Ввод - получить данные с клавиатуры, из файла, или другого устройства.
Вывод - показать данные на экране или отправить их в файл или другое устройство.
Математические вычисления - выполнить простые математические операции, такие как сложение или умножение.
Проверка условия - проверить условие и выполнить соответствующий участок программы.
Повторение - выполнить некоторые действия несколько раз, обычно с некоторыми изменениями.
Верите вы или нет, но это все, что делаю программы. Все программы, которые вы использовали, не важно, насколько они сложные, выполняют инструкции более или менее схожие с перечисленными выше. Таким образом, мы можем описать программирование как процесс разбиения большой, составной задачи на более мелкие до тех пор, пока они не станут настолько простыми, чтобы мы смогли применить к ним одну из наших инструкций.
Все это может показаться немного расплывчатым, но мы вернемся к этой теме попзже, когда будем разговаривать про алгоритмы.
1.4 Что такое отладка?
Программирование - сложный процесс, и так как им занимается человек, ошибки неизбежны. По причудливым причинам, ошибки в программах называются багами, а процесс их поиска и исправления дебаггингом (отладкой).
Три типа ошибок могут появиться в программе: синтаксические ошибки, ошибки выполнения и семантические ошибки. Полезно знать, чем они друг от друга отличаются для более быстрого их поиска и устранения.
1.4 Синтаксические ошибки
Python выполнит программу если она синтаксически верна; в ином случае, процесс аварийно завершиться и выдаст сообщение об ошибке. Синтаксис относится к структуре программы и правилам по этой структуре. Например, в русском языке предложение должно начинаться с Большой буквы и заканчиваться точкой. это предложение содержит синтаксическую ошибку. Как и это
Для большинства читателей, синтаксические ошибки не являются большой проблемой, поэтому и поэзию мы читаем без особых претензий к синтаксису. Python не такой великодушный. Если в программе есть хотя бы одна синтаксическая ошибка, Python выдаст ошибку и завершит выполнение. В течение первых нескольких недель вашей программистской карьеры, вы скорее всего большую часть времени будете проводить в поисках таких ошибок. По мере приобретения опыта, вы будете реже допускать подобные ошибки и находить их гораздо быстрее.
1.5 Ошибки выполнения
Второй тип ошибок - это ошибки выполнения, названные так, потому что никак себя не обнаруживают до запуска программы. Они еще называются исключениями, потому что обычно показывают, что произошло что-то исключительное (или плохое).
Ошибки выполнения редки в простых программах; с ними мы познакомимся в первых главах. Возможно даже, знакомство на страницах учебника случится раньше, чем в столкнетесь с ними на собственном опыте.
1.6 Семантические ошибки
Третий тип ошибок - это ошибки семантические. Если такая встретится в программе, выполнение продолжится; компьютер не выдаст никаких сообщений, но результат выполнения будет не тем, какой ожидался. Программа будет делать нечто иное, вместо того что вы сказали ей делать.
Проблема заключается в том, что написанная вами программа отличается от той, какую вы хотели написать. Понятие программы (ее семантики) в этом случае ошибочно. Определение семантических ошибок довольно хитро: вам нужно следить за выводом результатов вычислений как самой программы, так и отдельный её частей, и стараться определить, что же происходит.
1.7 Экспериментальная отладка
Одим из наиболее важных навыков, который вы приобретете, является отладкой. Это может разочаровать, но отладка является самой интелектуально насыщенной, сложной и интереснейшей составляющей программирования.
Иногда, отладка напоминает работу детектива. Вам необходимо, имея несколько зацепок, сделать вывод, почему произошло так, а не иначе.
Отладка так же похожа на научный эксперимент. Когда у вас возникает догадка, почему все идет не так, вы модифицируете программу, и пробуете снова. Если ваша гипотеза верна, вы получается работающую программу. Если не верна - вы пробуете снова. Как сказал Шерлок Холмс: "Когда вы устранили все невозможное, то что осталось, должно быть правдой" (Конан Дойль "Знак четырех")
Для некоторых программирование и отладка - это одно и то же. Итак, программирование - это процесс постепенной отладки программы до получения желаемого результата. Идея заключается в том, что вы должны добиться желаемого последовательными небольшими модификациями программы, ее отладкой. В итоге вы получаете гаранитированно работающий код.
Например, Linux - это ядро операционной системы, которое состоит их миллионов строк кода, но начиналось все с простой программы Линуса Торвальдса для обзора чипа Intel 80386. По словам Ларии Гринфилда, одним из первых проектов Линуса была программа, которая печатала попеременно АААА и ВВВВ, позже она эволюционировала в Linux (Руководство пользователя Linux. Версия 1)
Позже мы еще больше разовьем тему отладки и прочих проктик программирования.
1.8 Формальные и естественные языки
На естественных языках разговаривают люди. Английский, испанский, французский - языки естественные. Они не были придуманы специально (хотя люди постоянно их развивают); они появились естественным путем.
Формальные языки - это языки, придуманные людьми для специальных целей. Например, математическая нотация использует формальный язык, что упрощает описание отношений между числами и символами. Химия тоже использует формальный язык для описания фимической структуры молекул. И самое важное:
Язык программирования - это формальный язык, разработанный для описания вычислений.
Фомальный язык имеет строгую систему синтаксических правил. Например, 3+3=6 - это синтаксически верное математическое выражение, а 3=+6$ - нет. H2O - синтаксически верное химическое название, а 2Zz - нет.
Синтаксические правила определяют два понятия: знаки и структуру. Знаки - это простейшие элементы языка, такие как слова, числа, химические элементы. Одной из проблем выражения 3=+6$ является знак $, который не имеет смысла в математике (по крайней мере, пока). Также, 2Zz - не имеет смысла, потому что нет такого химического элемента Zz.
Вторым понятием, определяемым синтаксическими правилами, является структура, описывающая взаимоотношения знаков. Выражение 3=+6$ не имеет смысла, потому что нельзя помещать знак сложения сразу после знака равно. Так же и в химических формулах, числовой знак имеет смысл лишь расположенный после имени химического элемента, а не перед ним.
Когда вы читаете предложение на английском или выражение на формальном языке, вы должны определить структуру предложения (хотя в естественном языке это не столь важно). Этот процесс называется парсингом (разбором).
Например, когда вы слышите предложение: "Другой ботинок упал", вы понимаете что "другой ботинок" - это подлежащее, а "упал" - сказуемое. Разобрав предложение, вы можете понять его смысл или семантику предложения. Если предположить, что вы знаете, что такое ботинок, и что значит упал, вы можете понять основной смысл.
Хотя формальные и естественные яхыки имеют схожие черты - знаки, структуру, синтаксис и семантику - они сильно различаются:
Двусмысленность - естественные языки полны двусмысленности, когда подразумевается что-то другое, используются метафоры. Формальные языки создавались строго недвусмысленными, т.е. написанное всегда подразумевает то, что означает, без всякого скрытого смысла.
Избыточность - изобилуя всевозможными двусмысленностями и неопределенностями, естественные языки должны быть избыточными и, как результат, многословными. Формальные языки менее избыточны и более сжаты.
Литературность - естественные языки полны идиом и метафор. Если кто-то скажет: "Другой ботинок упал", возможно нет никакого ботинка и, тем более, какого-то падения. На формальном языке сказанное будет означать именно то, что подразумевалось.
Людям, говорящим на естественном языке - всем людям - требуется определенное время, чтобы настроиться на понимание формального языка. Иногда, разница между формальным и естественным языком сравнима с разницей между поэзией и прозой, но в большей степени:
Поэзия - в словах больше важен звук, произношение, чем смысл, и вся поэма в своей цельности призвана вызвать какие-то эмоции или отклик. Здесь встречаются не только распространенные неопределенности, но и совершенно новые.
Проза - буквальное значение слова стоит на первом месте, структура предложения способствует усилению смысла. Проза легче поддается анализу, нежели поэзия, но все так же не лишена двусмысленности.
Программа - значение компьютерной программы буквально и недвусмысленно, и может быть с легкостью разложено на знаки и структуру.
Приведем несколько подсказок по прочтению программ (и других формальных языков). Во-первых, помните, что формальный язык намного насыщеннее языка естественного, потому для его прочтения необходимо приложить больше усилий. Ещё очень важна структура, поэтому не всегда полезно читать сверху вниз и справа налево. Вместо этого необходимо разобрать программу в уме, определить все знаки и понять стурктуру. И, наконец, детали имеют значение. Мелкие ошибки, типа опечаток или неверной пунктуации, на которые вы можете не обратить внимания в естесвенном языке, могут привести совершенно к другому результату в языке формальном.
1.9 Первая программа
Традиционно, в первой программе на новом языке мы здороваемся с Миром. Называется она Hello, World! (Привет, Мир!), потому что выводит "Hello, World!" на экран. На Python это выглядит так:
print "Hello, World!"
Это пример кода выводит текст на экран, а не на принтер, как могло показаться. В данном случае на экране появиться надпись:
Hello, World!
Кавычки в программе указывают начало и конец значения и на экран не выводятся.
Многие ценители судят по языку программирования на основе этого примера, сколько усилий нужно затратить, чтобы вывести подобную надпись на экран. Python справляется с этой задачей элементарно.
1.10 Словарь
Алгоритм - процесс решения определенного типа проблем.
Ошибка (баг) - ошибка в программе.
Байт-код - промежуточное состояние программы между исходным и объектным кодом. Многие современные языки программирования компилируют исходный код в байт-код, а потом интерпретируют последний с помощью виртуальной машины.
Компиляция - трансляция программы, написанной на высокоуровневом языке, в низкоуровневый язук, для дальнейшего запуска.
Отладка (дебаггинг) - поиск и удаление любых типов ошибок в программе.
Исключение - ошибка выполнения.
Исполнимый код - объектный код, готовый в исполнению.
Формальный язык - искусственно созданный язык для описания узкого круга задач, например, математические формулы или компьютерные программы. Все языки программирования - формальные языки.
Высокоуровневый язык - язык, наподобие Python, созданный для удобного использования человеком.
Интерпретирование - построчное исполнение программы, написанной на высокоуровневом языке.
Низкоуровневый язык (ассемблер) - язык, понятный компьютеру.
Естественный язык - язык, на котором разговаривают люди.
Объектный код - код, получаемый в результате компиляции.
Разбор (парсинг) - синтаксический анализ программы.
Переносимость (портабильность) - свойство программы запускаться более чем на одном типе компьютеров.
Выражение print - инструкция интерпретатору python вывести значение на экран.
Решение проблемы - процесс формулирования проблемы, поиска решений, и определения решения.
Программа - список инструкций, указывающих компьютеру какие действия и вычисления неоходимо произвести.
Оболочка Python - интерактивный пользовательский интерфейс для работы с интерпретатором python. Пользователь в оболочке Python пишет команды после приглашения (>>>), нажимает на клавишу Enter, и интерпретатор немедленно приступает к исполнению введенной команды.
Ошибка выполнения - ошибка, ничем не выдающая себя до самого момента запуска программы. Происходит при появлении незапланированных ситуаций.
Скрипт - программа, сохраненная в файле.
Семантическая ошибка - ошибка, заставляющая программу делать не совсем то, что от нее хотел программист.
Семантика - смысл программы.
Исходный код - текст программы на высокоуровневом языке.
Синтаксис - структура программы.
Синтаксическая ошибка - ошибка в программе, приводящая к невозможности дальнейшего разбора и, следовательно, интерпретирования.
Знак - один из основных элементов синтаксической структуры программы, аналогично слову в естественном языке.
1.11 Задания
Напишите на родном языке предложение с понятным смыслом, но неверным синтаксисом. Напишите синтаксически верное предложение, но с семантическими ошибками.
Запустите оболочку python. Наберите 1 + 2 и нажмитее клавишу Enter. Python вычислит это выражение, напечатает результат и вновь выведет строку приглашения. * - оператор умножения, ** - оператор возведения в степень. Поэкспериментируйте с этими операциями, посмотрите, что пишет оболочка в ответ. Что озачает оператор / ? Всегда ли результаты совпадают с ожидаемым? Объясните.
Наберите 1 2 и нажмите Enter. Python попробует вычислить выражение, но не сможет, потому что это синтаксически неверно. Вместо ответа появиться следующее сообщение об ошибке:
File ___, line 1 1 2 ^ SyntaxError: invalid syntax
В большинстве случаев python указывает, где именно он обнаружил синтаксическую ошибку, но это не всегда верно, и не дает дополнительной информации что же все таки не так.
Так что, по большей части, надежда только на то, что вы хорошо знаете правила синтаксиса.
В этот раз python пожаловался на то, что между числами 1 и 2 отсуттствует какой-нибудь оператор.
Ниже приведено ещё три примера, вызвающие вывод ошибки. Объясните, что не понравилось python в каждом случае.
Наберите print 'hello'. Python вычислиn это выражение и выведет буквы h-e-l-l-o. Кавычки на экран не выводятся, потому как являются указателями начала и конца значения. Теперь напишите просто "hello" и попробуйте объяснить появившийся результат.
Наберите print cheese без кавычек. Вывод будет примерно таким:
Traceback (most recent call last):
File "<stdin>", line 1, in ?
NameError: name 'cheese' is not defined
Это ошибка выполнения; в частности, ошибка именования (NameError), а конкретнее, ошибка возникла потоу что имя chesse не определено. Если вы не знается что это значит, скоро все поймете.
Наберите 'This is a test...' в оболочке Python и нажмите Enter. Посмотрите, что получится.
Теперь, создайте скрипт и назовите его test1.py. Содержание будет следующим (убедитесь, что сохранили изменения, прежде чем запускать скрипт):
'This is a test...'
Что произойдет, когда вы запустите скрипт? Теперь внесите следующее изменение:
print 'This is a test...'
и попробуйте снова запустить.
Что произошло на этот раз?
Всякий раз, когда в оболочке python появлется новое выражение, оно вычисляется и результат выводиться на следующей строке. Результатом вычисления выражения 'This is a test...' будет выражение 'This is a test...' (подобно тому, как результатом вычисления выражения 42 будет 42). В скрипте, однако, результат вычисления таких выражений никуда не выводится, поэтому после запуска скрипта на экране ничего не появляется.
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/9398/28837
Переводчики: czech
Настройки
Готово:
