Пост создан для рассмотрения небольшого примера возможностей языка python. Мы не станем углубляться в сло жные темы языка, например, такие как объектно-ориентированное программирование и связанные с ним классы. Да, они являются мощным инструментом для создания сложных приложений, но нам этого пока не требуется.
Цель: создать англо-русский, русско-английский словарь с возможностью вносить в него новые, пользовательские значения. Первое, что приходи на ум — словари языка python.
Словарь в питоне — неупорядоченная последовательность пар ключ — значение. Что, собственно, и требовалось, верно?
Пример первый
Итак, первый файл должен содержать сам словарь с некоторыми значениями.
Создадим его. Назовём words.py
# words.py
words={'word': 'мир',\
    'earth':'земля',\
    'you': 'ты',\
    'I':'я',\
    'We':'мы',\
    'probably':'вероятно',\
    'piece':'кусок',\
    'tired':'усталый',\
    'should':'должен',\
    'be able':'быть в состоянии',\
    'not enough':'не хватает',\
    'enough':'достаточно',\
    'should':'должен',\
    'represent':'представлять',\
    'sequence':'последовательность'}И так далее.
Теперь нужно как-то спросить у пользователя, перевод какого именно слова он хотел бы найти и вывести значение на экран. Кроме того, не стоит забывать, что наш словарь работает в двух направлениях: он должен не только переводить с английского на русский, но и наоборот!
Создадим стартовый файл с функциями, запускающими в зависимости от предпочтений пользователя тот или иной вариант перевода.
# mydictionary.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from words import words
def eng():
    eng_words=dict([[v, k] for k,v in words.items()])
    find_word=input('Enter word ' '')
    print(eng_words.get(find_word) or print('No such key'))
def rus():
    key=input('Введите слово ' '')
    print (words.get(key) or 'Искомое слово не найдено')
if __name__ == '__main__':
    x=input('Найти перевод английского слова? ' '')
    if x == 'y':
        rus()
    elif x == 'n':
        eng()
    else:
        print('Увидимся позже')Отлично! Разберём построчно:
from words import words — импортируем из файла words.py сам словарь — words
Пишем две функции: eng и rus без параметров.
eng_words=dict([[v, k] for k,v in words.items()]) — это словарь "наоборот" для перевода русских слов на английские, теперь ключи стали значениями, а значения — ключами!
find_word=input('Enter word ' '') - просим пользователя ввести искомое слово
print(eng_words.get(find_word) or print('No such key')) — выводим на экран ответ с помощью функции print, получаем значение (get). В противном случае, отвечаем, что не смогли отыскать нужное слово.
Функция rus() работает так же, но без инвертирования словаря.
Вы уже догадались: наш словарь "наоборот" нужен для того, чтобы не приходилось писать два словаря — мы просто меняем ключи и значения местами.
Попробуйте запустить mydictionary.py и насладитесь результатом.
Что сейчас делает наша программа?
Спрашивает искомое слово, выводит ответ. Но осталось ощущение, что всё слишком просто и чего-то не хватает. Давайте немного усложним задачу: создадим базу данных для словаря и дадим пользователю возможность добавлять свои значения.
Пример второй
Создание базы данных. Файл words_db.py
# words_db.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db = shelve.open('db_file')
db['earth']='земля'
db['word']='слово'
db['catch']='ловить'
db['find']='искать'
db.close()База данных создаётся при помощи модуля shelve, импортируем его. Далее укажем входной файл: db_file, он открывается, в него записываются данные — теперь именно это наш словарь. Файл words.py, используемый в первом примере, нам больше не нужен.
После записи значений, базу данных нужно закрыть — db.close(). Создайте нашу базу данных — db_file:
$ python words_db.pyВосстановление базы данных из файла db_file
# dump_words_db.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db=shelve.open('db_file')
print('Yes')Мы больше не используем просто словарь, значит и наш главный файл, запускающий функции, должен измениться. Напишем его:
# start_programm.py
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import shelve
db=shelve.open('db_file')
def eng():
    eng_words=dict([[v, k] for k,v in db.items()])
    find_word=input('Enter word ' '')
    print(eng_words.get(find_word) or print('No such key'))
def rus():
    key=input('Введите слово ' '')
    print (db.get(key) or 'Искомое слово не найдено')
def newRecord():
    newkey=input('Ввести новое слово ' '')
    newvalue=input('Ввести перевод ' '')
    db[newkey] = newvalue
    db.update()
    db.close()
if __name__ == '__main__':
    start=input('Найти английский перевод русского слова? введите "y" или "n" ' '')
    if start == 'y':
        eng()
    elif start == 'n':
        rus()
    elif start == 'u':
        newRecord()
    else:
        print('До встречи')Рассмотрим подробнее
import shelve
db=shelve.open('db_file')Мы импортировали модуль shelve и открыли нашу базу данных, содержащую словарь
Далее создали функцию, которая будет искать в файле db_file значение ключа. В случае с функцией eng() — значения в словаре инвертируются.
def eng():
    eng_words=dict([[v, k] for k,v in db.items()])
    find_word=input('Enter word ' '')
    print(eng_words.get(find_word) or print('No such key'))Кроме того, нужно дать пользователю внести свои значения - дополнить словарь, если он не нашёл в нём перевода нужного слова.
За это отвечает функция newRecord(), которая предлагает ввести новые ключ и значение, а затем записывает их в базу данных и обновляет её.
def newRecord():
    newkey=input('Ввести новое слово ' '')
    newvalue=input('Ввести перевод ' '')
    db[newkey] = newvalue
    db.update()
    db.close()Что означает последняя запись? Она работает, когда запускается программа и предлагает различные варианты. Если пользователь ввёл в ответ 'y' — ищет перевод русского слова на английский, если 'n' — ищет перевод английского слова на русский, если 'u' (update) — позволяет внести свои значения.
if __name__ == '__main__':
    start=input('Найти английский перевод русского слова? введите "y" или "n" ' '')
    if start == 'y':
        eng()
    elif start == 'n':
        rus()
    elif start == 'u':
        newRecord()
    else:
        print('До встречи')Наш словарь отрабатывает один раз и программа закрывается. Можно спрашивать о действиях снова и снова, для этого достаточно заключить инструкции в цикл while. Можно добавить графическое представление программы или "веб-морду". Но это уже совсем другая история и для примера простой программы она не подойдёт.