习题41 学习面向对象术语

阅读测试代码注解:

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.参数相同

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值