From da6e94a5e776b4b9ffb4be439ca642878402b686 Mon Sep 17 00:00:00 2001 From: kjg Date: Wed, 10 Jun 2020 23:35:09 +0900 Subject: [PATCH] [Python #8] create e41.py --- kjg/python-the-hard-way/e41.py | 87 ++++++++++++++++++++++++++++++++++ kjg/python.org | 2 + 2 files changed, 89 insertions(+) create mode 100644 kjg/python-the-hard-way/e41.py diff --git a/kjg/python-the-hard-way/e41.py b/kjg/python-the-hard-way/e41.py new file mode 100644 index 0000000..7c6bc61 --- /dev/null +++ b/kjg/python-the-hard-way/e41.py @@ -0,0 +1,87 @@ +import random +from urllib.request import urlopen +import sys + +WORD_URL = "http://learncodethehardway.org/words.txt" +WORDS = [] + +PHRASES = { + "class %%%(%%%):": + "Make a class named %%% that is-a %%%.", + "class %%%(object):\n\tdef __init__(self, ***)" : + "class %%% has-a __init__ that takes self and *** params.", + "class %%%(object):\n\tdef ***(self, @@@)": + "class %%% has-a function *** that takes self and @@@ params.", + "*** = %%%()": + "Set *** to an instance of class %%%.", + "***.***(@@@)": + "From *** get the *** function, call it with params self, @@@.", + "***.*** = '***'": + "From *** get the *** attribute and set it to '***'." +} + +# do they want to drill phrases first +if len(sys.argv) == 2 and sys.argv[1] == "english": + PHRASE_FIRST = True +else: + PHRASE_FIRST = False + + +# load up the words from the website +for word in urlopen(WORD_URL).readlines(): + WORDS.append(str(word.strip(), encoding="utf-8")) + + +def convert(snippet, phrase): + class_names = [w.capitalize() for w in + random.sample(WORDS, snippet.count("%%%"))] + other_names = random.sample(WORDS, snippet.count("***")) + results = [] + param_names = [] + + for i in range(0, snippet.count("@@@")): + param_count = random.randint(1,3) + param_names.append(', '.join( + random.sample(WORDS, param_count))) + + for sentence in snippet, phrase: + # this is how you duplicate a list or string + result = sentence[:] + + # fake class names + for word in class_names: + result = result.replace("%%%", word, 1) + + # fake other names + for word in other_names: + result = result.replace("***", word, 1) + + # fake parameter lists + for word in param_names: + result = result.replace("@@@", word, 1) + + results.append(result) + return results + + +# keep going until they hit CTRL-D +try: + while True: + snippets = list(PHRASES.keys()) + random.shuffle(snippets) + + for snippet in snippets: + phrase = PHRASES[snippet] + question, answer = convert(snippet, phrase) + if PHRASE_FIRST: + question, answer = answer, question + + print(question) + input("> ") + print(f"ANSWER: {answer}\n\n") + +except EOFError: + print("\nBye") + + + diff --git a/kjg/python.org b/kjg/python.org index e8ae276..82cad8f 100644 --- a/kjg/python.org +++ b/kjg/python.org @@ -145,3 +145,5 @@ How to use dictionary *** Python #8 **** ex40 How to use class +**** ex41 +practice class