#无尽模式训练你,检验所掌握的面向对象的单词和短语。
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. [C#] 取得每月第一天和最後一天、某月总天数

    思路: 1. DateTime dt= DateTime.Now;  //获取当前时间 eg:2013-09-08 09:25:0 0 2. DateTime dt1 = new DateTime(d ...

  2. Scrum立会报告+燃尽图(Final阶段第四次)

    此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2481 项目地址:https://coding.net/u/wuyy694 ...

  3. t团队项目计划

    团队的backlog: .用户登录网站后,可以选择是买或者卖, (1)买 点击链接,可以分类浏览商品信息,也可以按价钱筛选 (2)卖 点击链接,选择要挂出的商品种类,填写信息(名称.价格.数量等)接着 ...

  4. iOS开发学习-资源打包

    图片是被放到Images.xcassets中 1.部署版本在>=iOS8的时候,打包的资源包中的图片会被放到Assets.car 图片被压缩: 2.部署版本在<iOS8的时候,打包的资源包 ...

  5. 进阶系列(11)—— C#多线程

    一.多线程的相关概念 1.进程:是操作系统结构的基础:是一个正在执行的程序:计算机中正在运行的程序实例:可以分配给处理器并由处理器执行的一个实体:由单一顺序的执行显示,一个当前状态和一组相关的系统资源 ...

  6. 【贪心算法】POJ-1328 区间问题

    一.题目 Description Assume the coasting is an infinite straight line. Land is in one side of coasting, ...

  7. windows和RedHat双系统安装说明

    该博客记录了安装windows和RedHat双系统的方法.这里的windows系统是win8.1,RedHat是RHEL-server-7.0-x86_64-LinuxProbe.Com.iso,该i ...

  8. opencv的安装和卸载

    安装 测试环境为centos 安装依赖 yum install cmake gcc gcc-c++ gtk2-devel gimp-develgimp-devel-tools gimp-help-br ...

  9. Python开发【第五篇】迭代器、生成器、递归函数、二分法

    阅读目录 一.迭代器 1. 迭代的概念 #迭代器即迭代的工具(自定义的函数),那什么是迭代呢? #迭代:指一个重复的过程,每次重复都可以称之为一次迭代,并且每一次重复的结果是下一个迭代的初始值(例如: ...

  10. js 代码几种方式

    var nameSpace={ //public } (function(){ //private })(); var module=(function(){ //private return { / ...