Как стать автором
Обновить

Осваиваем Python. Унция 2. Ветвления, циклы + практика.

Время на прочтение4 мин
Количество просмотров90K
image
Простые конструкции в языке 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

Результат работы:


image

Описание:


По адресу 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 планировал углублённо раскрыть тему функций, однако, учитывая параллельное появление статей — не могу пока знать станет ли он это делать. Становится всё интереснее и интереснее ))
Теги:
Хабы:
+49
Комментарии63

Публикации

Изменить настройки темы

Истории

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн