#无尽模式训练你,检验所掌握的面向对象的单词和短语。
import random
from urllib.request import urlopen
import sys WORD_URL = "http://learncodethehardway.org/words.txt" #网页中全是单独成行的单词
WORDS = [] PHRASES = {
#创建一个叫%%%的类,并继承%%%。
"class %%%(%%%):":
"Make a class named %%% that is-a %%%.",
#类%%%有一个__init__方法,该方法有self和***两个参数。
"class %%%(object):\n\tdef __init__(self, ***)":
"class %%% has-a __init__ that takes self and *** parameters.",
#类%%%有一个叫***的函数,该函数有self和@@@两个参数。
"class %%%(object):\n\tdef ***(self, @@@)":
"class %%% has-a function named *** that takes self and @@@ parameters.",
#给***赋值为类%%%的一个实例。
"*** = %%%()":
"Set *** to an instance of class %%%.",
#从***里调用***函数,传递的参数为self和@@@。
"***.***(@@@)":
"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
#由答题者选择是要根据描述编码还是根据代码描述。 #sys.argv为从命令行接收的参数,第一个参数默认为文件名。
if len(sys.argv) == 2 and sys.argv[1] == "english":
PHRASE_FIRST = True #True表示先打印value,按下任意键后再打印key
else:
PHRASE_FIRST = False # load up the words from the website
#将词汇们载入到列表WORDS中
for word in urlopen(WORD_URL).readlines(): #一行一行从网页中读取数据
WORDS.append(word.strip().decode("utf-8")) #删除每一行开始和结尾的空格,只留下单词并加入到words列表中
"""Python strip() 方法用于移除字符串头尾指定的字符(默认为空格)。
str->bytes:encode编码,字符串通过编码成为字节码,
bytes->str:decode解码,字节码通过解码成为字符串。""" #定义(覆盖描述和代码中预留位置的)函数,参数为片段、短语。
#最后返回一个列表results
#先将预留放置词汇的位置分类
#参数为key或value,两个总是相对
def convert(snippet, phrase):
class_names = [w.capitalize() for w in random.sample(WORDS, snippet.count("%%%"))]
other_names = random.sample(WORDS, snippet.count("***"))
"""random.sample(sequence, k) 从指定序列中随机获取指定长度的片断。sample函数不会修改原有序列"""
results = []
param_names = [] for i in range(0, snippet.count("@@@")):
#参数的个数为1-3个随机。
param_count = random.randint(1,3)
#随机到几个参数就从WORDS中获取几个词
param_names.append(', '.join(random.sample(WORDS, param_count))) #准备好要进行替换的PHRASES
for sentence in snippet, phrase:
result = sentence[:]
#result = [snippet, phrase]
#扯句闲话,作者为了片段和代码对应,替换词汇的顺序是固定的。。
#用这种方法替换,描述与代码中词汇的顺序肯定是一样的。
#fake class names 类名
for word in class_names:
result = result.replace("%%%", word, 1) #最后一位参数规定每次替换一个,保证%%%不重复。 #fake other names 对象、方法和其他
for word in other_names:
result = result.replace("***", word, 1) #fake parameter lists 参数名
for word in param_names:
result = result.replace("@@@", word, 1) results.append(result) return results # keep going until they hit CTRL-D
#这里才是重点,是作者的编程逻辑。
try:
while True: #循环抽题
snippets = list(PHRASES.keys()) #字典 keys() 方法:以列表返回一个字典所有的键。
random.shuffle(snippets) #随机打乱顺序 for snippet in snippets: #抽题
phrase = PHRASES[snippet]
question, answer = convert(snippet, phrase)
if PHRASE_FIRST:
question, answer = answer, question print (question) input("> ")
print ("ANSWER: %s\n\n" % answer)
except EOFError:
print ("\nBye")

Python3 笨方法 练习41(面向对象)详解及运行结果的更多相关文章

  1. C#基础-面向对象详解

    面向对象详解 一.什么是面向对象 1>面向对象是一种程序设计思想 2>面向过程和面向对象是什么? 例如要把大象放冰箱怎么做? 面向过程:打开冰箱门->把大象扔进去->关上冰箱门 ...

  2. Java面向对象详解

    Java面向对象详解 前言:接触项目开发也有很长一段时间了,最近开始萌发出想回过头来写写以前学 过的基础知识的想法.一是原来刚开始学习接触编程,一个人跌跌撞撞摸索着往前走,初学的时候很多东西理解的也懵 ...

  3. 【python3+request】python3+requests接口自动化测试框架实例详解教程

    转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...

  4. (转)Python3.5——装饰器及应用详解

    原文:https://blog.csdn.net/loveliuzz/article/details/77853346 Python3.5——装饰器及应用详解(下)----https://blog.c ...

  5. java之面向对象详解

    #############java面向对象详解#############1.面向对象基本概念2.类与对象3.类和对象的定义格式4.对象与内存分析5.封装性6.构造方法7.this关键字8.值传递与引用 ...

  6. php开发面试题---php面向对象详解(对象的主要三个特性)

    php开发面试题---php面向对象详解(对象的主要三个特性) 一.总结 一句话总结: 对象的行为:可以对 对象施加那些操作,开灯,关灯就是行为. 对象的形态:当施加那些方法是对象如何响应,颜色,尺寸 ...

  7. Python3调用C程序(超详解)

    Python3调用C程序(超详解) Python为什么要调用C? 1.要提高代码的运算速度,C比Python快50倍以上 2.对于C语言里很多传统类库,不想用Python重写,想对从内存到文件接口这样 ...

  8. JS 面向对象详解

    面向对象详解1 OO1.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  9. Python3、setuptools、Pip3安装详解

    Python3.setuptools.Pip3安装详解 2017年08月19日 18:58:47 安静的技术控 阅读数:26002    版权声明:本文为博主原创文章,未经博主允许不得转载. http ...

随机推荐

  1. Merge join、Hash join、Nested loop join对比分析

    简介 我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join ...

  2. C# CHM帮助文档

    1.生成chm文件 首先,下载EasyCHM软件,此软件可将HTML文件.TXT文件.图片和文件夹按照文件层次生成.chm文件.EasyCHM打开界面如图所示: 点击“新建”,选择需要生成.chm文件 ...

  3. SQL Server 2008 存储过程示例

    出处:http://www.jb51.net/article/54730.htm --有输入参数的存储过程-- create proc GetComment (@commentid int) as s ...

  4. url 地址含参数较多如何拼接

    url 地址拼接是经常会遇到的问题.所以必须要掌握这个技术 1.合并参数对象,循环出来. var commonParams = { g_tk: 1928093487, inCharset: 'utf- ...

  5. sqlserver trigger(触发器)-更新某几列数据时触发【转】

    CREATE TRIGGER [dbo].[updataAlarmLevel]ON [dbo].[Alarm_Alarm_Info]AFTER INSERT, UPDATE – 在更新和插入之后ASB ...

  6. [转帖]nvidia nvlink互联与nvswitch介绍

    nvidia nvlink互联与nvswitch介绍 https://www.chiphell.com/thread-1851449-1-1.html 差不多在一个月前在年度gtc会议上,老黄公开了d ...

  7. [转帖]Nginx 的配置文件详解.

    nginx配置文件nginx.conf超详细讲解  https://www.cnblogs.com/liang-wei/p/5849771.html   #nginx进程,一般设置为和cpu核数一样w ...

  8. Linux上的free命令详解-收藏

    解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...

  9. Reverse Words in a String II

    Given an input string, reverse the string word by word. A word is defined as a sequence of non-space ...

  10. UVAlive4080_Warfare And Logistics

    给一个无向图,求出两个值,所有点到所有其他点的最短距离和,任意删除一条边后的这个值. 数据规模是100点1000边. 白书例题,不多说了直接对于每个点求出最短路树,对于每条边,如果它不是最短路树上的边 ...