Опубликован: 22.12.2005 | Доступ: свободный | Студентов: 16501 / 504 | Оценка: 4.18 / 3.71 | Длительность: 16:16:00
ISBN: 978-5-9556-0109-0
Лекция 1:

Введение в программирование на языке Python

Лекция 1: 12345678 || Лекция 2 >

Циклы

Третьей необходимой алгоритмической конструкцией является цикл. С помощью цикла можно описать повторяющиеся действия. В Python имеются два вида циклов: цикл ПОКА (выполняется некоторое условие) и цикл ДЛЯ (всех значений последовательности). Следующий пример иллюстрирует цикл ПОКА на Python:

s = "abcdefghijklmnop"
while s != "":
  print s
  s = s[1:-1]

Оператор while говорит интерпретатору Python: "пока верно условие цикла, выполнять тело цикла ". В языке Python тело цикла выделяется отступом. Каждое исполнение тела цикла будет называться итерацией. В приведенном примере убирается первый и последний символ строки до тех пор, пока не останется пустая строка.

Для большей гибкости при организации циклов применяются операторы break (прервать) и continue (продолжить). Первый позволяет прервать цикл, а второй - продолжить цикл, перейдя к следующей итерации (если, конечно, выполняется условие цикла).

Следующий пример читает строки из файла и выводит те, у которых длина больше 5:

f = open("file.txt", "r")
while f:
  l = f.readline()
  if not l:
    break
  if len(l) > 5:
    print l
f.close()

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

В языке Python логическое значение несет каждый объект: нули, пустые строки и последовательности, специальный объект None и логический литерал False имеют значение "ложь", а прочие объекты значение "истина". Для обозначения истины обычно используется 1 или True.

Примечание:

Литералы True и False для обозначения логических значений появились в Python 2.3.

Цикл for выполняет тело цикла для каждого элемента последовательности. В следующем примере выводится таблица умножения:

for i in range(1, 10):
  for j in range(1, 10):
    print "%2i" % (i*j),
  print

Здесь циклы for являются вложенными. Функция range() порождает список целых чисел из полуоткрытого интервала [1, 10). Перед каждой итерацией счетчик цикла получает очередное значение из этого списка. Полуоткрытые диапазоны общеприняты в Python. Считается, что их использование более удобно и вызывает меньше программистских ошибок. Например, range(len(s)) порождает список индексов для списка s (в Python-последовательности первый элемент имеет индекс 0 ). Для красивого вывода таблицы умножения применена операция форматирования % (для целых чисел тот же символ используется для обозначения операции взятия остатка от деления). Строка форматирования (задается слева) строится почти как строка форматирования для printf из C.

Функции

Программист может определять собственные функции двумя способами: с помощью оператора def или прямо в выражении, посредством lambda. Второй способ (да и вообще работа с функциями) будет рассмотрен подробнее в лекции по функциональному программированию на Python, а здесь следует привести пример определения и вызова функции:

def cena(rub, kop=0):
  return "%i руб. %i коп." % (rub, kop)

print cena(8, 50)
print cena(7)
print cena(rub=23, kop=70)

В этом примере определена функция двух аргументов (из которых второй имеет значение по умолчанию - 0 ). Вариантов вызова этой функции с конкретными параметрами также несколько. Стоит только заметить, что при вызове функции сначала должны идти позиционные параметры, а затем, именованные. Аргументы со значениями по умолчанию должны следовать после обычных аргументов. Оператор return возвращает значение функции. Из функции можно возвратить только один объект , но он может быть кортежем из нескольких объектов.

После оператора def имя cena оказывается связанным с функциональным объектом.

Исключения

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

try:
  res = int(open('a.txt').read()) / int(open('c.txt').read())
  print res
except IOError:
  print "Ошибка ввода-вывода"
except ZeroDivisionError:
  print "Деление на 0"
except KeyboardInterrupt:
  print "Прерывание с клавиатуры"
except:
  print "Ошибка"

В этом примере берутся числа из двух файлов и делятся одно на другое. В результате этих нехитрых действий может возникнуть несколько исключительных ситуаций, некоторые из них отмечены в частях except (здесь использованы стандартные встроенные исключения Python). Последняя часть except в этом примере улавливает все другие исключения, которые не были пойманы выше. Например, если хотя бы в одном из файлов находится нечисловое значение, функция int() возбудит исключение ValueError. Его-то и сможет отловить последняя часть except. Разумеется, выполнение части try в случае возникновения ошибки уже не продолжается после выполнения одной из частей except.

В отличие от других языков программирования, в Python исключения нередко служат для упрощения алгоритмов. Записывая оператор try-except, программист может думать так: "попробую, а если сорвется - выполнится код в except ". Особенно часто это используется для выражений, в которых значение получается по ключу из отображения:

try:
  value = dict[key]
except:
  value = default_value

Вместо

if dict.has_key(key):
  value = dict[key]
else:
  value = default_value

Примечание:

Пример уже несколько устаревшей идиомы языка Python иллюстрирует только дух этого подхода: в современном Python лучше записать так value = dict.get(key, default_value).

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

class MyError(Exception):
  pass

try:
  ...
  raise MyError, "my error 1"
  ...
except MyError, x:
  print "Ошибка:", x

Кстати, все исключения выстроены в иерархию классов, поэтому ZeroDivisionError может быть поймана как ArithmeticError, если соответствующая часть except будет идти раньше.

Для утверждений применяется специальный оператор assert. Он возбуждает AssertionError, если заданное в нем условие неверно. Этот оператор используют для самопроверки программы. В оптимизированном коде он не выполняется, поэтому строить на нем логику алгоритма нельзя. Пример:

c = a + b
assert c == a + b

Кроме описанной формы оператора, есть еще форма try-finally для гарантированного выполнения некоторых действий при передаче управления изнутри оператора try-finally вовне. Он может применяться для освобождения занятых ресурсов, что требует обязательного выполнения, независимо от произошедших внутри катаклизмов:

try:
  ...
finally:
  print "Обработка гарантированно завершена"
Лекция 1: 12345678 || Лекция 2 >
Андрей Егоров
Андрей Егоров

def bin(n):

"""Цифры двоичного представления натурального числа """

if n == 0:

   return []

n, d = divmod(n, 2)

return bin(n) + [d]

print bin(69)

Что значит здесь return[] ? Возвращает список? Непонятно какой список? Откуда он? 

 

 

Асмик Гаряка
Асмик Гаряка

Почему при вычислении рейтинга не учитывается уровень, как описано? Для всех курсов У=1, хотя для Специалист должно быть 2.

Лариса Матросова
Лариса Матросова
Россия
Аделина Федорова
Аделина Федорова
Россия, 155900