Простой скрипт на Python для заучивания английских слов или почему я не использую карточки

от автора

На хабре уже не раз поднималась тема изучения английского языка (пруф). Она рассматривалась с разных ракурсов. Кто-то писал, что не зачем учить слова, при изучении иностранного. Кто-то делился способами, коих великое множество, от простых карточек, до целой тетради, исписанной по самое не хочу. В конце концов есть LinguaLeo, так же замечательный сервис, на котором без дополнительной платы можно учить по 10 слов в день. Хотя иногда платить не хочется, а 10 слов кажутся весьма небольшим количество для молодого организма, который познает таинства и прелести иностранной мовы. Тогда возможно этот скрипт вам будет полезен.

К чертям GUI!

Нет. Не вообще к чертям, а в данной задаче. Все что нам требуется это прочитать слово, написать его перевод и нажать клавишу Enter. Довольно простой механизм работы. Так зачем же напрягаться и насиловать ради этого tkinter?

JSON спешит нам на помощь

Тут конечно на любителя. Я использовал JSON. Кому-то по нраву XML. Структура данных будет довольно простая.

{ "catch, caught, caught":"ловить, хватать, успеть", "fly, flew, flown":"летать, пролетать" } 

Сохраняем подобный «словарь» из двух слов в файл, который мы назовем для примера english.json, а что бы лишний раз не настраивать локаль сохраняем его в кодировке Windows 866 (уверен, что для Linux подойдет UTF-8).

Его сиятельство код

Перво-наперво импортируем модуль sys, и модуль random.

import sys import random 

Далее мы неожиданно для себя определяем классическую функцию main. По замыслу, она сразу же потребует словарь, который будет необходимо указать в параметрах при запуске скрипта.

def main(): 	try: 		wordict = eval(open(sys.argv[1]).read()) # открываем словарь 	except: 		print "You have to enter all parameters.\nExample: python wordrepeater.py yourdictionary.json" #вроде бы достаточно информативно? 		raw_input("") 

Теперь у нас есть словарь wordict. Дальше нужно сделать два режима прохода по словарю. Первый — скрипт выдает нам английское слово, а мы в ответ один из его переводов. Второй проход прямо противоположный — скрипт нам русское слово, а мы ему английское. Сдесь на помощь приходит конструктор словарей.

	mode = raw_input("Choose mode:\n\t1:Word To Translation;\n\t2:Translation To Word.\n>> "); 	if mode == "2": wordict = {wordict[k]:k for k in wordict.keys()} #здесь не хитрым образом ключи словаря меняются местами с их значениями. 

После проделанных манипуляций остается несколько строчек, которые и будут осуществлять прогон по всему словарю. Можно их описать внутри функции main, хотя я предпочел описать еще одну функцию.

def keysToValues(dic): # функции потребуется словарь для работы 	wrong = 0 # фиксируем количество ошибок 	keys = dic.keys() # извлекаем список со всеми ключами нашего словаря. 	while True: 		tmpkey = random.choice(keys)  # извлекаем случайное слово из словаря 		print "{0}: {1}".format(len(keys), tmpkey)  # выводим слово на экран. Вместе с ним выводится счетчик оставшихся слов 		value = dic[tmpkey] # запоминаем все значения этого слова  		if raw_input("Translation: ") in value.split(", "): # пишем наш "правильный" ответ, который сразу же сравнивается с любым из значений 			print "True. {0}\n".format(value) 			keys.remove(tmpkey) # ура! правильно! слово удаляется из списка. 		else: 			wrong += 1 			print "Wrong! {0}\n".format(value) # упс... на одну ошибку больше. 		if len(keys) < 1: # все слова угаданы. В нашем спуске нет ни одного слова. 			raw_input("\n\nNothing\nWrong - {0}".format(wrong))  # здесь будет написано количество ошибок 			sys_exit() # после нажатия Enter, все закончится 

Все что осталось сделать — это запустить эту функцию в main, а после запустить main.

	keysToValues(wordict)  if __name__ == "__main__": 	main() 

При наличии свободного времени и этого скрипта, получается выучить до 50 (больше я не пробовал) английских слов за вечер. Самое утомительное это заполнять словарь. Но я уверен, что это не утомительней составления карточек.

Итоговый результат.

Для большего удобства весь код в одном месте.

import sys import random  def keysToValues(dic): 	wrong = 0 	right = 0 	keys = dic.keys() 	while True: 		tmpkey = random.choice(keys) 		print "{0}: {1}".format(len(keys), tmpkey) 		#print str(len(keys))+":", tmpkey 		value = dic[tmpkey] 		#answ = raw_input("Translation: ") 		if raw_input("Translation: ") in value.split(", "): 			print "True. {0}\n".format(value) #fjf 			right += 1 			keys.remove(tmpkey) 		else: 			wrong += 1 			print "Wrong! {0}\n".format(value) 		if len(keys) < 1: 			raw_input("\n\nNothing\nRight - {0}. Wrong - {1}".format(right, wrong)) 			sys_exit()  def main(): 	try: 		wordict = eval(open(sys.argv[1]).read()) 	except: 		print "You have to enter all parameters.\nExample: python wordrepeater.py yourdictionary.json" 		raw_input("") 	mode = raw_input("Choose mode:\n\t1:Word To Translation;\n\t2:Translation To Word.\n>> "); 	if mode == "2": wordict = {wordict[k]:k for k in wordict.keys()} 	elif mode == "": 		print "Exit" 		sys.exit()  	keysToValues(wordict)  if __name__ == "__main__": 	main() 

ссылка на оригинал статьи http://habrahabr.ru/post/211466/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *