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

в 20:10, , рубрики: 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:nt1:Word To Translation;nt2: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("nnNothingnWrong - {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("nnNothingnRight - {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:nt1:Word To Translation;nt2: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()

Автор: Koshelenok

Источник

Поделиться

* - обязательные к заполнению поля