笨方法学python3 习题41
前言:下面的代码按照书上修改翻译而来,跟书上的执行结果一样!
# 练习中需要的网站链接:https://learncodethehardway.org/words.txt
import random # 导入一个random库,生成随机数
from urllib.request import urlopen # 导入urllib库中的模块request中的urlopen网页链接访问函数
import sys #导入一个sys库
WORD_URL="http://learncodethehardway.org/words.txt" # 将链接赋给变量WORD_URL
WORDS=[] # 创建一个空列表 名字叫WORDS
# 创建一个字典名字叫PHRASES
PHRASES={
#创建一个key)——这个键就是一个类:class%%%(%%%)——创建一个%%%类,继承%%%
"class %%%(%%%):":
"创建一个名叫:”%%%“的子类,继承父类:“%%%”。", # 给class%%%(%%%)创建一个value: 把这个类的名字跟继承的对象名字打印出来
#创建一个%%%类;类里面创建一个__init__构造函数,形参为***()
"class %%% (object):\n\tdef __init__(self,***)":
"创建一个名叫:“%%%”的类,类的括号中的对象为object,初始化方法__init__的形参为:“***”", # 打印出类名%%%,打印出参数***
#创建一个%%%类,类里面有一个***的方法,形参为@@@
"class %%% (object):\n\tdef ***(self,%%%)":
"创建一个类名叫: “%%%”,方法叫: “***” 形参为:”%%%“ 的类。", # 打印出类名,方法名,参数名
"*** = %%%()":
"调用对象:“***”中的方法:“%%%”。",
#从***(对象)里面调用***(方法)参数为@@@
"***.***(%%%)":
"调用对象:“***”中的方法:“***”,参数(传入的值)为:“%%%”。",
#从***里调用***属性(变量),并将其设置为***
"***.*** = '***'":
"外部初始化对象:“***”的属性:“***”的值为:“***”。"
}
# 使用条件控制语句if else与布尔值or(以真为主)\and(以假为主)\not(非真即假)
if len(sys.argv)==2 and sys.argv[1]=="english": # 如果sys.argv的字符长度等于2 and sys.argv传的第1个参数等于english
PHRASE_FIRST=True # 上面的条件成立则:PHRASE_FIRST =为真
else:
PHRASE_FIRST=False #否则else:PHRAES_FRIST为False
for word in urlopen(WORD_URL).readlines(): # 使用一个request模块里面的函数urlopen打开链接WORD_URL,并使用文件操作函数readlines()读取文件内容,然后分别传给word。
WORDS.append(str(word.strip(),encoding='utf-8')) # 使用strip()以utf-8的编码格式将word切片,并使用str转换成字符串类型,再用append()将切片转换编码类型后的word添加给WORDS
#创建一个convert函数形参为snippet(key),phrase(value)
def convert(snippet, phrase):
# capitalize() 字符串操作函数:将字符串的第一个字母变成大写,其他字母变成小写
class_names=[w.capitalize() for w in
# random.sample,库中的随机数函数;count()字符串函数:用来统计字符串里某个字符出现的次数
random.sample(WORDS, snippet.count("%%%"))]
# 将得出的随机数初始化给变量:other_names
other_names=random.sample(WORDS, snippet.count("***"))
results=[]
# 将上面函数定义的形参snippet,phrase分别传给sentence
for sentence in snippet, phrase: # 将字典的key,value遍历给result
result=sentence[:] # 这里可以直接result=sentence
for word in class_names: # 将class_names的值遍历给word
result=result.replace("%%%", word, 1)
# 使用word的值替换掉列表result中的%%%,替换次数为一次,防止出现一个值替换多个%%%
for word in other_names:
result=result.replace('***', word, 1)
results.append(result) # 将上面的两个for循环的值添加给results
return results #返回results的值,分别给下面的answer, question接收
try:
Numbering=0
while True:
snippets=list(PHRASES.keys()) # 获取字典的key,转为列表
random.shuffle(snippets) # 将获取到的列表的元素(key)打乱顺序
for snippet in snippets: # 将获取到的键遍历给snippet
phrase=PHRASES[snippet]
if snippet in snippets:
Numbering+=1
answer, question = convert(snippet, phrase)
# 接收return返回然后使用question,answer两个变量接收!
if PHRASE_FIRST: # 对应前面的if-esle如果结果是True侧执行下面的代码!否则执行else。
question, answer=answer, question
print("第%s题:请按描述写出相关代码!" %(Numbering))
print(input("按下“Enter”开始,按“Ctrl + D退出”"))
print(question)
input('>')
print(f"ANSWER: {answer}\n\n")
except EOFError:
print("\nBye")
分析总结:
整个代码难点在于四个知识点:1.外部导入的库要理解库中的函数的具体用法;2.编码:这个如果不理解可以去网上查;3.书中前面学过的基础知识;4.Python中的异常处理try——except检测代码是否有异常,结构跟if——else差不多,还可以像if——else一样嵌套。
重在于思路!!喜欢的可以自己修改录入更多的知识点,无聊的时候可以自己练习一下。