#无尽模式训练你,检验所掌握的面向对象的单词和短语。
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. hihocoder #1388 : Periodic Signal fft

    题目链接: https://hihocoder.com/problemset/problem/1388 Periodic Signal 时间限制:5000ms内存限制:256MB 问题描述 Profe ...

  2. IT行业的个人见解

    IT这个行业是近代历史上的新新行业,它的就业前景是非常的好的,就业率高,但是这个行业的需求人才精英不是那些半桶水的所谓IT男.我现在学习的是计算机专业中的软件工程目标是成为一名合格的软件工程师,软件工 ...

  3. 开放地址法散列表ADT

    数据结构定义如下: typedef unsigned int Index; typedef Index Position; struct HashTbl; typedef struct HashTbl ...

  4. [转帖]常见USB种类

    随着 USB Type-C 接口被苹果推上热门话题,那么对于我们普通的消费者来说,各种 USB 接口类型我们知道多少?买一个设备回来我们是否会遇到各种接口各种线用不了的情况呢? 那么我们泪雪网新开的一 ...

  5. Java并发编程之线程创建和启动(Thread、Runnable、Callable和Future)

    这一系列的文章暂不涉及Java多线程开发中的底层原理以及JMM.JVM部分的解析(将另文总结),主要关注实际编码中Java并发编程的核心知识点和应知应会部分. 说在前面,Java并发编程的实质,是线程 ...

  6. 刷新dbgrid 而不失去当前行位置

    我们有一个Delphi的数据库应用程序,上面有个DBGrid和一个数据集: DBGrid是用来显示来自数据集(查询或表)的数据,根据设计,当您调用已经打开的数据集的Refresh方 法(例如使用DBN ...

  7. ACdream1093

    给你三种正多面体,正四面体,正六面体,正八面体.求从某一种正多面体中的某一点走到另一个点,且步数不超过k(1018)的方案数. 首先说明一下我交题的时候遇到的问题,起点和终点为同一点的时候,算不算走了 ...

  8. struts下载文件

  9. tensorflow环境下安装scikit-learn

    1. scikit-learn所依赖的环境: python(>=2.6 or >=3.3) numpy(>=1.6.1) scipy(>=0.9) 可用conda list 查 ...

  10. js模块化的总结

    从前端打包的历史谈起 在很长的一段前端历史里,是不存在打包这个说法的.那个时候页面基本是纯静态的或者服务端输出的, 没有 AJAX,也没有 jQuery.Google 推出 Gmail 的时候(200 ...