笨方法学python3 习题41

笨方法学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一样嵌套。

重在于思路!!喜欢的可以自己修改录入更多的知识点,无聊的时候可以自己练习一下。

猜你喜欢

转载自blog.csdn.net/qq_43082279/article/details/109148224