Пост создан для рассмотрения небольшого примера возможностей языка 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
. Можно добавить графическое представление программы или "веб-морду". Но это уже совсем другая история и для примера простой программы она не подойдёт.