#!/user/bin/env python #-*-coding:utf-8 -*- #Author: qinjiaxi import random from urllib import urlopen import sys WORD_URL = "http://learncodethehardway.org/words.txt" WORDS =[] PHRASES = { "class ###(###):": "Make a class named ### that is-a ###.", "class ###(object): def __init__(self, ***)": "class has-a __init__that takes self and *** parameters.", "class ###(object): def ***(self, @@@)": "class ### has-a function named *** that takes self and @@@ parameters.", "*** = ###()": "Set *** to an instance of class ###", "***.***(@@@)": "From *** get the *** function, and call it with parameters self, @@@.", "***.*** = '***'": "From *** get the *** attribute and set it to '***'" } #do they want to drill phrases first PHRASES_FIRST = False if len(sys.argv) == 2 and sys.argv[1] == 'english': PHRASES_FIRST = True #load up the words from the website for word in urlopen(WORD_URL).readlines(): WORDS.append(word.strip()) def convert(snippet, phrase): class_names = [w.capitalize() for w in random.sample(WORDS, snippet.count('###'))]#从words序列中抽取带'###'的字符串,数量是片段里面含有'###'的数量并把第一个字母变大写,后面变小些(也就是随机抽取类) other_names = random.sample(WORDS, snippet.count("***"))#从words序列中抽取带'***'的字符串,数量是片段里面含有'***'的数量 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)))#从words列表中随机抽取1-3个参数,加入到参数名列表中并用逗号隔开 for sentence in snippet, phrase: result = sentence[:] #fake class_names for word in class_names: result = result.replace("###", word, 1)#把第一个'###'替换成word #fake other_names for word in sentence: result = result.replace("***", word, 1)#把第一个'***'替换成word #fake parameter lists for word in param_names: result = result.replace('@@@', word, 1)#把第一个'@@@'替换成word results.append(result) return results try: while True: snippets = PHRASES.keys()#获取字典中的key并以列表方式返回 random.shuffle(snippets)#将列表中的元素随机打乱 for snippet in snippets: phrase = PHRASES[snippet]#获取字典中的值 question, answer = convert(snippet, phrase)#调用convert函数 if PHRASES_FIRST: question, answer = answer, question print(question) raw_input('>') print("ANSWER: %s " % answer) except EOFError: print(' bye')