阅读测试代码注解:
import random #导入random库
from urllib import urlopen #从urllib中导入urlopen
import sys #导入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 *** parameters.",
"class %%%(object):\n\tdef ***(self,@@@)":#这里同时用函数名和参数,分别用不同符号代表
"class %%% has-a function named *** that takes self and @@@ parameters.",
"*** = %%%()":
"Set *** to an instance of class %%%.",
"***.***(@@@)":
"From *** get the *** functions,and call it with parameters self,@@@.",
"***.*** = '***'":
"From *** get the *** attribute and set it to '***'."
}
#do they want to drill phrases first
PHRASE_FIRST = False
if len(sys.argv) == 2 and sys.argv[1] == "english": #如果命令参数有两个而且第二个参数变量是“english”
PHRASE_FIRST = True
#load up the words from the website #从网址载入单词
for word in urlopen(WORD_URL).readline(): #遍历txt中的行
WORDS.append(word.strip()) #移除word中特殊字符(未指定),并写入WORDS中
def convert(snippet, phrase): #定义convert函数,包括两个参数
class_names = [w.capitalize() for w in #定义类名称,w变量大写
random.sample(WORDS, snippet.count("%%%"))] #从WORDS中无放回抽取snippet中“%%%”出现的次数
other_names = random.sample(WORDS, snippet.count("***"))#从WORDS中无放回抽取,次数是snippet中“***”出现的次数
results = []
param_names = []
for i in range(0, snippet.count("@@@")):
param_count = random.randint(1, 3) #param_count=1,2,3
param_names.append(', '.join(random.sample(WORDS, param_count)))#参数名称从WORDS中随机抽取,可能有1/2/3个
for sentence in snippet, phrase:
result = sentence[:]
#fake class names
for word in class_names:
result = result.replace("%%%", word, 1) #用word替换%%%,替换1次
#fake other names
for word in other_names:
result = result.replace("***", word, 1)# 用word替换***,替换1次
#fake parameter lists
for word in param_names:
result = result.replace("@@@", word, 1)#用word替换@@@,替换1次
results.append(result) #将result写入results中
return results
# keep going until they hit CTRL-D
try:
while True:
snippets = PHRASES.keys() #snippets等于PHRASES的所有键
random.shuffle(snippets) #将snippets中的元素打乱
for snippet in snippets:
phrase = PHRASES[snippet]
question, answer = convert(snippet, phrase)#调用convert函数,并使用参数snippet,phrase调用它
if PHRASE_FIRST:
question, answer = answer, question #反向练习
print question#打印问题
raw_input("> ")#用户输入
print "ANSWER: %s\n\n" % answer#显示答案
except EOFError:
print "\nBye"
代码中的问题:
1.有为空的现象
2.参数相同