Академический Документы
Профессиональный Документы
Культура Документы
r u
У Ч Е Б Н О - М Е Т О Д И Ч Е С К И Й Ж У Р Н А Л Д Л Я У Ч И Т Е Л Е Й И Н Ф О Р М А Т И К И
13 сентября –
День программиста!
Ура!
Неплохой вопрос для де-
тей, например, на каком-
нибудь интеллектуальном
конкурсе: почему День
программиста отмечается
в России 13-го или 12 сен-
тября?
И почему когда-то 13-го,
а когда-то 12-го?
(Ответ на второй странице
обложки.)
версия жур
ая на
нн
о
ла
тр
ные
тель ы
лек
л н и л
допо риа
мате бин
ете
но м ка
ч
в Ли айте
ru
на с
r.
w
ww be
.1septem
сентябрь
1september.ru
ИНФОРМАТИКА Подписка на сайте www.1september.ru или по каталогу «Почта России»: 79066 — бумажная версия, 12684 — СD-версия
2014
сентябрь 2014 / ИНФОРМАТИКА
ПОДПИСНЫЕ ИНДЕКСЫ
ИНФОРМАТИК по каталогу “Почта России”: 79066 — бумажная версия, 12684 — электронная версия
проходит трансляцию и может быть запущена, по- проблемы, предполагая, что вы знаете, что делаете.
тому что переменные с именами this и spam мо- Ведь переменная B не объявляется и тип ее неиз-
гут существовать (их объявление не требуется!), вестен. Если в Паскале нельзя вызывать процедуру
а is — это оператор языка Python. Если же таких как функцию, то в Python — можно, и это еще один
переменных нет, то ошибка будет обнаружена толь- источник ошибок.
ко во время выполнения блока после else. Поэтому
программы на Python требуют тщательного тести-
рования всех ветвей алгоритма. Компактность кода
Еще более серьезная проблема может быть вы- Одно из очевидных достоинств языка
звана опечаткой в имени переменной. Например, Python — компактность программного кода.
в программе Например, решение классической задачи — по-
x1 = 0 менять местами значения двух переменных —
if a > b: на языке Паскаль решается в три оператора, на-
xl = 1 пример, так:
ошибка не обнаруживается даже во время выпол- c := a;
нения. Ее тяжело обнаружить и визуально, пото- a := b;
му что цифра 1 и латинская строчная буква “эл” b := c;
выглядят очень похоже. При выполнении условия — а на Python — в одну строку:
a > b будет создана новая переменная xl, рав- a, b = b, a
ная 1, а значение переменной x1 не изменится. Алгоритм Евклида, который на Паскале записы-
Конечно, в языке со статической типизацией эта вается в виде
ошибка будет выявлена при трансляции — ведь while b <> 0 do begin
переменная xl скорее всего не объявлена. c := a mod b;
Отсутствие проверки типов параметров при вы- a := b;
зове функций тоже чревато неожиданными пробле- b := c
мами. Предположим, что мы написали функцию, end;
которая удаляет лишние пробелы в начале сим- на языке Python значительно “ужимается”:
вольной строки: while b:
def trimLeft ( s ): a, b = b, a % b
while len(s) and s[0] == ' ': Рассмотрим еще один класс задач — так называе-
s = s[1:] мую “длинную арифметику”, операции с большими
return s целыми числами. Например, задача вычисления
При правильном вызове мы передаем ей строку: факториала числа 100 (100! = 1 × 2 × 3 × … × 100) на
s1 = trimLeft ( " 123 " ) Паскале решается с использованием вспомогатель-
— но по ошибке можем передать и целое число ного массива для хранения “длинного” числа [4]:
(или данные другого типа): const N = 33;
s1 = trimLeft ( 123 ) # ошибка! d = 1000000;
Эта ошибка будет обнаружена только во время вы- var A: array[0..N] of longint;
полнения, причем программа завершится аварийно. i, k, s, r: integer;
Тип значения, возвращаемого функцией, тоже begin
не проверяется. Например, мы забыли написать в A[0] := 1;
предыдущей функции оператор return: for k := 2 to 100 do begin
def trimLeft ( s ): r := 0;
while len(s) and s[0] == ' ': for i := 0 to N do begin
s = s[1:] s := A[i] * k + r;
Такая функция (в терминах Паскаля это процеду- A[i] := s mod d;
r := s div d
6 ра) тоже допустима, просто она вернет пустое зна-
end
чение None. Поэтому при вызове
end
сентябрь 2014 / ИНФОРМАТИКА
write ( "Введите три числа " ); бираем все подходящие значения и строим из них
read ( a, b, c ); новый массив:
Заметим, что здесь числа можно вводить как в a = [x for x in a
одной строке, так и в разных, нажимая клавишу if 100 <= x and x <= 999 and x % 9 != 0]
x после каждого числа. Теперь остается проверить размер массива (най-
Функция input, которая выполняет ввод данных ден ли хотя бы один элемент) и вывести результат:
в Python, вводит сразу всю строку. Ее нужно разбить if len(a) > 0:
на части (“слова”) и каждое слово отдельно преобра- print ( max(a) )
зовать в целое число. Разделение строки на слова (по else:
пробелам-разделителям) выполняет метод split: print ( "Не найдено" )
s = input("Введите три числа ") Заметим, что при этом в принципе нельзя сде-
L = s.split() лать некоторых ошибок, предусмотренных крите-
Если ввести строку "1 2 3", в переменную L по- риями проверки [9]. Например, невозможно не-
падет список строк ["1", "2", "3"]. Теперь каждый верно задать начальное значение переменной max,
элемент списка нужно преобразовать в целое число: потому что она вообще не используется.
a = int(L[0]) Рассмотрим теперь задачу C4 из того же демон-
b = int(L[1]) страционного варианта [9].
c = int(L[2]) По каналу связи передается последовательность
Эти операции можно записать в краткой форме, положительных целых чисел, все числа не превы-
используя функцию map, которая применяет какую- шают 1000. Количество чисел известно, но может
то другую функцию (в данном примере — int) ко быть очень велико. Затем передается контрольное
всем элементам списка: значение последовательности — наибольшее чис-
a, b, c = map(int, L) ло R, удовлетворяющее следующим условиям:
Можно обойтись вообще без переменной L: 1) R — произведение двух различных переданных
a, b, c = map(int, s.split()) элементов последовательности (“различные” озна-
Заметим, что при этом ожидается, что все три чает, что не рассматриваются квадраты передан-
значения будут введены в одной строке. Если зна- ных чисел; допускаются произведения различных эле-
чений будет меньше или больше, программа завер- ментов последовательности, равных по величине);
шится аварийно. 2) R делится на 21.
Теперь пусть требуется ввести массив из N эле- Если такого числа R нет, то контрольное значение
ментов. На Паскале мы запишем цикл: полагается равным 0. Напишите программу, кото-
for i := 0 to N - 1 do рая проверяет правильность контрольного значения.
read ( A[i] ); Решения этой задачи на Python короче и понят-
— а на Python — одну строчку, хотя более сложную: нее, чем аналогичные эталонные решения на Па-
A = list( map(int, input().split()) ) скале и Бейсике, приведенные в [9]:
В сравнении с предыдущими примерами, здесь N = int(input())
добавляется вызов функции list, которая строит M3 = M7 = M21 = M = 0
список из всех полученных элементов. Обратите for i in range(N):
внимание, что размер массива нам знать не тре- x = int(input())
буется — программа введет столько элементов, if x % 21 != 0:
сколько записано во входной строке. if x % 3 == 0: M3 = max(M3, x)
if x % 7 == 0: M7 = max(M7, x)
Задачи ЕГЭ if x % 21 == 0 and x > M21:
Поскольку пока решения задач ЕГЭ по програм- M = max(M21, M)
мированию разрешено писать на любом языке, M21 = x
можно использовать и Python. Рассмотрим задачу else: M = max(M, x)
10 C2 из демоварианта ЕГЭ-2014 [9]. R0 = int(input())
Дан целочисленный массив из 20 элементов. Эле- R = max(M3*M7, M21*M)
сентябрь 2014 / ИНФОРМАТИКА
граммиста, с одной стороны, и полная ответствен- Строим обработчик события “изменение текста
ность за свои действия с другой. в поле ввода”:
Еще одна проблема связана с обязательным ис- def onNumChange(sender):
пользованием описателя self при обращении к hexLabel.text = "{:X}".format(sender.value)
полю объекта в методе класса. В отличие от боль- Он принимает один параметр — вызвавший объ-
шинства объектно ориентированных языков опу- ект, переводит введенное число (значение свойства
скать self нельзя, хотя транслятор об этой ошибке value) в шестнадцатеричную систему и изменяет
не сообщит. Например, если бы конструктор был текст метки.
записан так: Остается создать и разместить на форме поле для
class dog: ввода целого числа (объект класса TIntEdit)
def __init__(self, _age): decEdit = TIntEdit(app, width=12, font=f)
age = _age decEdit.position = (5, 5)
У объектов класса dog не было бы поля age. Вме- decEdit.text = "1001"
сто этого в конструкторе создается локальная пере- decEdit.onChange = onNumChange
менная age, жизнь которой заканчивается при вы- и запустить приложение:
ходе из конструктора. Объект создается без проб- app.Run()
лем, а ошибка будет обнаружена только при обра- В Python-версии учебника [4] рассмотрены еще
щении к полю age (которого на самом деле нет!). несколько программ с графическим интерфейсом.
Например, при выводе на экран Это программа для просмотра рисунков с диска
print ( tuzik.age )
программа завершится аварийно. Понятно, что в
этом отчасти тоже “виновата” динамическая типи-
зация переменных в Python.
Графический интерфейс
На Python можно создавать программы с графи-
ческим интерфейсом. Для этого есть несколько би-
блиотек: встроенная библиотека tkinter, а также программа для перевода RGB-кода цвета в HTML-
более сложные варианты — сторонние библиотеки формат
wxPython (www.wxpython.org), PyGTK (www.pygtk.org)
и PyQt (www.riverbankcomputing.com/software/pyqt).
Большинство практических задач можно решить
с помощью tkinter. Эта библиотека используется
для разработки программ с графическим интер- и два типа калькуляторов:
фейсом в Python-версии учебника [4]. Для упроще-
ния работы и приближения к привычной многим
идеологии Delphi авторами разработан модуль-
обертка simpletk, который можно скачать на сай-
те поддержки [6].
Напишем простую программу для перевода чи-
сел в шестнадцатеричную систему счисления, кото-
рая создает окно с полем ввода и меткой:
valid_pass = "123"
check = checkFact ( valid_pass )
Теперь check — это переменная класса function
(функция). При вызове не нужно каждый раз пере-
давать функции правильный пароль, потому что
она его запомнила при создании:
OK = check ( s ) # сравнивает s c "123" Если флажок выключен, место портрета запол-
В каких задачах может пригодиться такой при- няется белым фоном.
ем? Во-первых, для хранения данных, которые Для разработки программы будем использовать
стандартный модуль tkinter с “оберткой” в виде
1
В Python 2.x импортировать этот модуль не нужно. модуля simpletk [6]. Пусть первый флажок (объект
TCheckBox, “отвечающий” за портрет Пушкина) на- • SymPy — библиотека для символьных вычисле-
зывается cb1, соответствующее место для рисунка ний (sympy.org);
(объект TImage) называется image1, а файл с портре- • wxPython, PyGTK и PyQt — библиотеки для соз-
том — pushkin.gif. Тогда подключение обработчи- дания графического интерфейса;
ка события “переключение флажка” выглядит так: • pygame — для программирования игр
(www.pygame.org).
def changeImage1(sender):
if sender.checked: Дистанционное образование
image1.picture = "pushkin.gif"
else: image1.picture = "" В последние годы быстрыми темпами развива-
cb1.onChange = changeImage1 ется дистанционное образование. Ведущие сайты
Но таких пар “флажок – рисунок” в программе дистанционного обучения проводят бесплатные
несколько, и для каждого флажка придется напи- курсы по изучению языка Python. Среди них нуж-
сать свою функцию-обработчик, причем эти функ- но выделить основательный курс Массачусетсского
ции отличаются только названием объекта-рисун- технологического института (MIT), размещенный
ка и именем файла. Поэтому имеет смысл постро- на платформе edX [10].
ить “функцию-фабрику”, которая будет принимать Для желающих научиться программировать
эти два параметра и возвращать новую функцию- игры на Python университетом Райса (США) пред-
обработчик, запоминая все изменяющиеся данные лагается курс “Введение в интерактивное про-
с помощью замыкания: граммирование на Python” [11]. Специально для
def changer(image, filename): этого курса разработана интерактивная веб-среда
def change(sender): CodeSkuptor [12] с обширной документацией, ко-
if sender.checked: торая позволяет не только отлаживать программы
image.picture = filename на Python, но и наблюдать за изменениями в памя-
else: image.picture = "" ти при их выполнении в режиме визуализации.
return change Еще один вводный курс по Python размещен на
сайте Codecademy [13].
Теперь назначение обработчиков флажкам
Существует несколько сайтов, где можно отла-
(имеющим имена cb1, cb2 и cb3) выглядит так:
живать программы на Python в браузере в интерак-
cb1.onChange = changer (image1, "pushkin.gif") тивном режиме:
cb2.onChange = changer (image2, http://www.codeskulptor.org/
"lermontov.gif") http://pythontutor.com/
cb3.onChange = changer (image3, http://ideone.com/
"bulgakov.gif") http://www.compileonline.com/execute_python_
Таким образом, с помощью замыкания мы изба- online.php
вились от дублирования кода. Полную программу http://www.skulpt.org/
на Python 3 вы можете найти в приложении к этому Первые два из перечисленных сайтов поддержи-
номеру. вают визуализацию, то есть показывают измене-
ния данных в памяти во время пошагового выпол-
Библиотеки нения программы.
К сожалению, большинство учебных материалов
Одно из бесспорных достоинств языка Python —
по Python представлено на английском языке. Сре-
разнообразие готовых библиотек, в том числе
ди русскоязычных ресурсов следует отметить раз-
встроенных. Назовем только некоторые из часто
работки Д.П. Кириенко [14] и [15].
используемых модулей:
• math — математические функции;
• fractions — рациональные дроби; Заключение
15
• decimal — десятичная арифметика; Говоря о достоинствах языка Python с точки зре-
• random — случайные числа, случайный выбор, ния обучения школьников программированию,
сентябрь 2014 / ИНФОРМАТИКА