Учим python. Пишем "Задачник". Часть 1.

Будем учить питон на практике.

Начинаем писать консольную утилиту, для ведения учета списка задач.

Исходники

Техническое Задание

Написать консольную утилиту, после запуска которой, оно должно спросить у пользователя:

Выберите действие:
0. Выход
1. Добавить задачу
2. Изменить задачу
3. Удалить задачу
4. Удалить выполненные задачи
5. Список всех задач
6. Список выполненных задач
7. Список будущих задач
8. Список задач на сегодня
9. Список задач на эту неделю

И просто вывести то что выбрал пользователь

Вы выбрали -> "Название задачи"

Предлагаю самим для начала выполнить задачу, а потом уже смотреть дальше.

Этап 1. Решение в лоб

Исходники

# coding: utf-8

"""
Задачник
"""

# создадим строку, которая будет выводится при опросе пользователя
actions_help_text = u"""Выберите действие:
0. Выход
1. Добавить задачу
2. Изменить задачу
3. Удалить задачу
4. Удалить выполненные задачи
5. Список всех задач
6. Список выполненных задач
7. Список будущих задач
8. Список задач на сегодня
9. Список задач на эту неделю
=> """

# вызовем функцию, передав ему нашу строку, опросник
# в коде, строка представлена в юникоде, 
# но в консоль необходимо вывести байты, поэтому мы декодируем строку в кодировку консоли
action_index = raw_input(actions_help_text.encode('utf-8'))

# action_index хранит строку, то что ввел пользователь

# проверим то что ввел пользователь, и выведем ему сообщение
if action_index == '0':
    print u"Вы выбрали:", u"Выход"
elif action_index == '1':
    print u"Вы выбрали:", u"Добавить задачу"
elif action_index == '2':
    print u"Вы выбрали:", u"Изменить задачу"
elif action_index == '3':
    print u"Вы выбрали:", u"Удалить задачу"
elif action_index == '4':
    print u"Вы выбрали:", u"Удалить выполненные задачи"
elif action_index == '5':
    print u"Вы выбрали:", u"Список всех задач"
elif action_index == '6':
    print u"Вы выбрали:", u"Список выполненных задач"
elif action_index == '7':
    print u"Вы выбрали:", u"Список будущих задач"
elif action_index == '8':
    print u"Вы выбрали:", u"Список задач на сегодня"
elif action_index == '9':
    print u"Вы выбрали:", u"Список задач на эту неделю"
else:
    print u"Вы не выбрали никакого действия"

Это не совсем хороший вариант решения, давайте его улучшать.

Для начала попробуйте сами

Этап 2. Улучшение 1

Исходники

# coding: utf-8

"""
Задачник
"""

# создадим кортеж возможных действий пользователя
actions = (
    u'Выход',
    u'Добавить задачу',
    u'Изменить задачу',
    u'Удалить задачу',
    u'Удалить выполненные задачи',
    u'Список всех задач',
    u'Список выполненных задач',
    u'Список будущих задач',
    u'Список задач на сегодня',
    u'Список задач на эту неделю',
)

# создадим строку, которая будет выводится при опросе пользователя
actions_help_text = u'Выберите действие:'
for index, action in enumerate(actions):
    # собираем строку
    # порядковый номер действия, действие
        actions_help_text += u'\n{0}. {1}'.format(index, action)
actions_help_text += u"\n=>"

# вызовем функцию, передав ему нашу строку, опросник
# в коде, строка представлена в юникоде, 
# но в консоль необходимо вывести байты, поэтому мы декодируем строку в кодировку консоли
action_index = raw_input(actions_help_text.encode('utf-8'))

# action_index хранит строку, то что ввел пользователь

if action_index.isdigit():
    # если пользователь ввел число
    action_index_int = int(action_index)

    # пользователь выбирает прядковый номер действия
    # по пордяковому номеру найдем и название действия
    try:
        # в данном блоке может возникнуть ошибка
        # пользователь может ввести число, которого нету в выборе
        action_name = actions[action_index_int]
    except IndexError:        
        # а тут мы перехватим ошибку, и наша программа продолжит работу
        message = u"Вы не выбрали никакого действия"
    else:
        # данный блок выполняется если ошибок не произошло
        message = u"Вы выбрали: {0}".format(action_name)

else:
    # пользователь не ввел число
    message = u"Вы не выбрали никакого действия"

print message

Это улучшение нам дало динамику.

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

Мы избавились от большого цикла if-elif-else

Далее

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