#无尽模式训练你,检验所掌握的面向对象的单词和短语。
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. KMP算法之next数组的求解思路

    2.next数组的求解思路 本部分内容转自:http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algo ...

  2. 深入理解mybatis

    MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个select查询实例, ...

  3. rua出300道四则运算题

  4. iOS- 什么是GitHub?关于它的自我介绍「初识 GitHub」

    1 前言 我一直认为 GitHub 是程序员必备技能,程序员应该没有不知道 GitHub 的才对,我当初接触 GitHub 也大概工作了一年多才开始学习使用,我读者里很多是初学者,而且还有很多是在校大 ...

  5. Redis有序集内部实现原理分析

    Redis技术交流群481804090 Redis:https://github.com/zwjlpeng/Redis_Deep_Read Redis中支持的数据结构比Memcached要多的多啦,如 ...

  6. 10.13课堂Scrum站立会议

    项目名称:C#实现的连连看游戏 小组名称:计信F4 开会时间 :2016年10月11日 20:20~20:40 组长:张政 成员:张金生,武志远,李泉 内容: 昨日已完成: 张政:构建基础逻辑,实现游 ...

  7. selenium 关键字驱动部分设计思路

    1 说明: 1.以下的代码亲测直接可用, 2.设计思路来自博客园的 张飞_ :http://www.cnblogs.com/zhangfei/p/5330994.html   /   http://w ...

  8. Eclipse_生成webservice客户端

    1.工具:eclipse3.3或者是带有webservice插件的eclipse wsdl2java(这个本人没用过,具体长什么样不清楚) 2.步骤: 首先用浏览器访问webservice的站点,点击 ...

  9. ubuntu下安装lamp环境

    使用普通用户来安装lamp环境: 1.安装apache: sudo apt-get install apache2

  10. java异常处理的throw和throws的区别

    1. 区别 throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理.而throw则是指抛出的一个具体的异常类型. 2.分别介绍 ...