
Простые конструкции в языке Python: ветвления и циклы имеют свои особенности по сравнению с другими языками. Поэтому я всё же решил потратить на это время и рассказать. Материал совсем простой!
Так же по просьбам читающих добавил в конец статьи разбор простой программки для наглядной демонстрации пройденного материала.
Условная инструкция if
Думаю тут всё понятно:
if условие1:
блок1
elif условие2:
блок2
else:
блок3
Существует так же краткая форма записи (аналог тернарного оператора в Си):
X = A if условие else B
Заменяет собой конструкцию вида:
if условие:
X = A
else:
X = B
Перехват исключений
Общий вид:
try:
блок 1 # интерпретатор пытается выполнить блок1
except (name1,name2):
блок 2 # выполняется, если в блоке try возникло исключение name1 или name2
except name3:
блок 3 # выполняется, если в блоке try возникло исключение name3
except:
блок 4 # выполняется для всех остальных возникших исключений
else:
блок 5 # выполняется, если в блоке try не возникло исключения
finally:
блок 6 # выполнится всегда
Конструкция else была добавлена к инструкции обработки исключений для того, чтобы мы могли разделить ситуации, не прибегая к использованию флагов, когда выполнение программы продолжилось из-за того, что исключений в блоке try не возникло, или же они были перехвачены и обработаны.
Конструкция else в языке Python так же добавлена и в циклы
Цикл while
Общий вид:
while условие:
блок1
else: # необязательная часть else
блок2 # выполняется, если выход из цикла был произведён не инструкцией break
break — осуществляет выход за пределы цикла
continue — осуществляет переход в начало цикла (к строке заголовка)
Цикл for
Общий вид:
for <элемент> in <итерируемый объект>:
блок1
if условие: continue
else: break
блок2 # не выполнится никогда, учитывая инструкцию if
else:
блок3 # выполнится, если выход из цикла не осуществлялся инструкцией break
Примеры использования:
>>> L = [(5,5),(6,6)]
>>> for (x,y) in L: # присваивание кортежа в цикле for
... print x,y, # вывод без добавления символа конца строки
...
5 5 6 6
Рассмотрим типичную задачу поиска общих элементов двух списков. Её можно решить абсолютно разными путями, например, с помощью множеств, но в данном случае нас интересует решение с помощью вложенных циклов for.
for elem1 in list1:
for elem2 in list2:
if elem1 == elem2:
print elem1, u'элемент найден'
break
else:
print elem1, u'не был найден'
Однако, эту задачу можно решить с помощью только одного цикла for, благодаря использованию оператора in:
for elem in list1:
print (elem,'found') if elem in list2 else (elem,'not found')
В данном случае оператор in сам осуществляет обход списка и поиск элемента. Этот вариант решения будет работать быстрее, чем первый. Поэтому во всех случаях, когда это возможно — лучше стараться пользоваться уже описанными конструкциями языка.
Близкая тема к циклам в языке Python — это понятие итератора. И очень кстати, что эта тема была описана сегодняшним же числом на хабре. Некоторые описанные в ней моменты я использовал при написании практического примера, специально для это статьи. Например функцию enumerate() Вообще тенденция единовременного появления большого количества русскоязычного материала по Питону — очень позитивная!
Практика
Условие задачи: построить график изменения курса заданных валют за заданный период времени от текущей даты.
Функция drawCurrency() принимает на вход 4 параметра:
- словарь, ключами которого являются названия валют, а значениями — идентификаторы валют определённые ЦБ.
- количество интересующих нас месяцев
- ширина картинки
- высота картинки
Реализация:
dumpz.org/4991
Результат работы:

Описание:
По адресу www.cbr.ru/scripts/Root.asp ЦБ РФ предоставляет описание интерфейсов для работы с веб-сервисами. Таким образом мы можем переходить по определённой ссылке, содержащей начальную и конечную дату, а так же идентификатор валюты, и в результате получать XML документ, содержащий курсы валют по дням. Далее осуществлять его парсинг.
Эту часть работы в моей реализации проделывает функция getData() для работы с датами используется библиотека datetime, а для парсинга XML — xml.dom. На выход функции поступает словарь, содержащий три объекта:
- список, содержащий значения курса валют по дням
- минимальное значение в списке
- максимальное значение в списке
Два последних элемента нам потребуются для того, чтобы масштабировать картинку. Их можно определять и впоследствии. Но в данном случае я хотел показать, как с помощью встроенных типов данных фактически можно возвращать функцией несколько объектов, перечисленных через запятую.
Так же внутри функции используется конструкция try/except. В том случае, если получить документ с сервера ЦБ не удалось, или на вход функции были переданы неверные значения — функция parse() выбросит исключение и после этого логика программы перейдёт к обработчику исключений except, где наша функция возвратит объект None.
Цикл for j,key in enumerate(currency.keys()): в теле функции drawCurrency() осуществляет обход словаря валют. Для каждой из них вызывает функцию getData(), генерируется случайным образом цвет отображения курса валюты на графике, а так же определяется минимальное и максимальное значение курса среди всех переданных на вход валют.
После этого осуществляется последовательная отрисовка графиков каждой из валют.
Если требуется пояснение каких-то моментов — я отвечу в комментариях. В следующей статье cleg планировал углублённо раскрыть тему функций, однако, учитывая параллельное появление статей — не могу пока знать станет ли он это делать. Становится всё интереснее и интереснее ))