Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Python_самоучитель.pdf
Скачиваний:
1296
Добавлен:
29.03.2015
Размер:
835.6 Кб
Скачать

Ревизия: 226

Глава 6. Циклы

 

 

 

6.02.58496250072

7.02.80735492206

8.03.0

9.03.16992500144

Как видите, 1, 2, 4 и 8 являются степенями 2. Модифицируем нашу программу, чтобы найти другие степени 2:

import math x = 1.0

while x < 100.0:

print x, "\t", math.log(x)/math.log(2) x *= 2.0

Таким образом, мы получили:

1.00.0

2.01.0

4.02.0

8.03.0

16.04.0

32.05.0

64.06.0

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

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

Упражнение. Измените программу так, чтобы программа вывела все степени 2 до 10-й включительно. Постарайтесь запомнить результаты. Почему в килобайте не 1000 байт, а 1024?

§6.6. Специальные и экранируемые символы

В этом разделе мы немного отвлечемся от циклов, чтобы внести ясность в вопрос специальных текстовых последовательностей, с одной из которых мы уже столкнулись в предыдущем разделе: "\t". Дело в том, что в кодовых таблицах (наборах цифровых кодов,

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

Последовательность

Назначение

\t Табуляция

66

Ревизия: 226

Глава 6. Циклы

 

 

 

Последовательность

Назначение

 

 

\n

Перевод на новую строку

\r

Возврат «каретки» (курсора) в начало строки13

Таким образом, если в программе нужно вывести текст из нескольких строк, то на помощь приходят специальные последовательности:

>>> print "hello\rH\n\tworld" Hello

world

Разберем, что происходит при выводе строки "hello\rH\n\tworld". Сначала выводится строка "hello" – только после нее интерпретатор встречает первую специальную последовательность: "\r" – символ возврата «каретки» на начало строки. Затем Выводится символ "H", но происходит это на позиции первого символа! При этом уже имеющийся на этой позиции символ заменяется новым14. После этого последовательности "\n" и "\t"

дают указание произвести перевод на новую строку и оставить отступ в одну табуляцию. Далее выводится оставшаяся часть строки "world".

Разумеется, не стоит применять специальные последовательности там, где это не обязательно: например, проще было исправить первый символ строки вместо добавления "\rH". Иначе вашу программу будет сложнее читать.

13Термин «каретка» возник с появлением механических пишущих машинок, которые были устроены так, что после перехода на новую строку нужно было возвращать специальную подвижную часть механизма в положение, соответствующее началу строки. Эта подвижная часть и называлась «кареткой». В процессе печати «каретка» перемещалась справа налево вместе с листом бумаги, «подставляя» место для следующего символа под рычажки с их оттисками, приводимые в в движение клавишами машинки.

14Кстати, опытные секретарши, работавшие с пишущими машинками, так исправляли опечатки в документах: они перемещали «каретку» в нужное положение и перепечатывали символ поверх старого, который обычно немного подтирали стирательной резинкой или закрашивали корректором.

67

Ревизия: 226

Глава 6. Циклы

 

 

 

Упражнение. Напишите выражение на языке Питон, которое будет выводить строку такого вида:

I can use tabs and

new lines in program output.

Теперь рассмотрим такую ситуацию: предположим, что нам необходимо вывести, например, такую строку "Main \template/".

>>> print "Main \template/" Main emplate/

Интерпретатор распознал последовательность "\t" и вставил специальный символ, а это не то, чего мы хотели добиться.

В подобных ситуациях перед специальным символом "\" ставится так называемый экранирующий символ: еще одна косая черта "\".

>>> print "Main \\template/" Main \template/

Теперь все в порядке. А как вывести кавычки?

>>> print "I said: "Hello world"" File "<stdin>", line 1

print "I said: "Hello world""

^

SyntaxError: invalid syntax

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

>>> print "I said: \"Hello world\"" I said: "Hello world"

Еще один вариант решения проблемы – использование одинарных кавычек:

>>> print 'I said: "Hello world"' I said: "Hello world"

Главное, чтобы каждая неэкранированная кавычка имела пару и при этом не нарушалась синтаксическая структура выражения. Поэтому, работая с кавычками, будьте внимательны.

Кстати, в тексте программ тоже используются специальные символы. Более того, символ переноса на новую строку является признаком завершения выражения, или, иначе говоря, разделителем выражений. Интересно, что в Питоне его тоже можно экранировать.

68

Ревизия: 226

Глава 6. Циклы

 

 

 

Зачем? Ну, например, если выражение слишком длинное, и для удобства чтения программы вы хотите разбить его на несколько строк. Вот пример из реальной программы:

print "Значение переменной n должно быть целым положительным" \

+" числом,\nпопробуйте еще раз."

Вконце первой строки стоит символ "\" (обратите внимание: он находится за

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

§6.7. Числа Фибоначчи и оператор цикла while

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

В предыдущей главе мы написали программу, вычисляющую числа Фибоначчи с помощью рекурсивной функции, но она имела ограничение, связанное с максимальной глубиной рекурсии. Это существенный недостаток (хотя решение, бесспорно, красивое).

Но теперь мы знаем о циклах и разберем еще один способ решения задачи нахождения чисел Фибоначчи. Итак, мы имеем следующую формулу:

f1= f 2=1, f n= f n1 f n2 , n .

Вней используется три переменные. Обозначим их так: fn – результирующее значение функции, fn1 и fn2 – промежуточные значения функции используемые в формуле. Знак

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

На первых двух шагах значение функции равно 1. Для расчета последующих чисел из ряда Фибоначчи применим оператор цикла while. На каждом шаге цикла будем вычислять значение fn = fn1 + fn2, а затем изменять значения в переменных fn1 и fn2, подготавливая их для следующего шага цикла: на следующей итерации fn2 будет равняться fn1, а fn1 fn. Разумеется, для контроля количества итераций цикла мы будем использовать переменную-счетчик i. Вот, что у нас должно получиться:

def fibonacciWithWhileLoop(n):

"""Функция вычисления чисел Фибоначчи с использованием оператора цикла while."""

fn = fn1 = fn2 = 1 i = 3

while i <= n:

fn = fn1 + fn2 fn2 = fn1

fn1 = fn

69

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]