文档章节

笨方法学Python, Lesson 40 - 44

好好先生_1028
 好好先生_1028
发布于 2015/11/06 17:53
字数 1507
阅读 875
收藏 6

Exercise 40

代码

class Song(object):
    
    def __init__(self, lyrics):
        self.lyrics = lyrics
        
    def sing_me_a_song(self):
        for line in self.lyrics:
            print line 
            
happy_bday = Song(["Happy birthday to you",
                  "I don't want to get sued",
                  "So I'll stop reght there"])
                  
bulls_on_parade = Song(["They really around the family",
                        "With pockets full of shells"])
                        
happy_bday.sing_me_a_song()

bulls_on_parade.sing_me_a_song()

输出

Notes

①class定义类,__init__()初始化类

②定义类、实例化类、调用相关函数与变量的方法

Exercise 41 

代码

import random 
from urllib import urlopen
import sys 

WORD_URL = "http://learncodethehardway.org/words.txt"
WORDS = []

PHRASES = {
    "class %%%(%%%):":
    "Make a class named %%% that is-a %%%.",
    "class %%%(object):\n\tdef __init__(self, ***)":
    "class %%% has-a __init__ that takes self and *** parameters.",
    "class %%%(object):\n\tdef ***(self, @@@)":
    "class %%% has-a function named *** that takes self and @@@ parameters.",
    "*** = %%%()":
    "Set *** to an instance of class %%%.",
    "***.***(@@@)":
    "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
if len(sys.argv) == 2 and sys.argv[1] == 'english':
    PHRASES_FIRST = True 
else:  
    PHRASES_FIRST = False 
    
# load up the words from the website 
for word in urlopen(WORD_URL).readlines():
    WORDS.append(word.strip())
    
    
def convert(snippet, phrases):
    class_names = [w.capitalize() for w in 
                   random.sample(WORDS, snippet.count("%%%"))]
    other_names = random.sample(WORDS, snippet.count("***"))
    results = []
    param_names = []
    
    for i in range(0, snippet.count("@@@")):
        param_count = random.randint(1,3)
        param_names.append(', '.join(random.sample(WORDS, param_count)))
        
    for sentence in snippet, phrases:
        result = sentence[:]
        
        # 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 parameters lists 
        for word in param_names:
            result = result.replace("@@@", word, 1)
            
        results.append(result)
        
    return results 
    
    
# keep going until then hit CTRL^D 
try:
    while True:
        snippets = PHRASES.keys()
        random.shuffle(snippets)
        
        for snippet in snippets:
            phrase = PHRASES[snippet]
            question, answer = convert(snippet, phrase)
            if PHRASES_FIRST:
                question, answer = answer, question 
                
            print question 
            
            user_answer = raw_input("> ")
            print "ANSWER: %s" % answer 
            if user_answer == answer:
                print "Congraduatons! Your answer is very right!\n\n"
            else:
                print "Sorry, Your answer is a little deferent frome the right answer.\n\n"
except EOFError:
    print "\nBye"

输出

Notes:

①本节练习的目的是提供练习面向对象编程的概念的方法,代码中用到了循环与条件判断、字典迭代以及一些新函数

②urlopen().readlines()类似文件的readlines()方法,打开网页并读取网页内容所有行,并返回内容组成的列表

③字符串的strip()方法,用于去除字符串中的字符。需要注意,传入的参数是字符串时,会去除首尾所有在字符串内的字符。

参数为空时,删除空白符,包括" ","\n","\t","\r"

s1 = "aaabc cPython is the best bbbcaabc"
print s1.strip("abc")
print s1.strip("abc ")      # abc后面有一个空格
s2 = "\n\n\tPython is the best\t\n"
print s2
print s2.strip()

该例的输出

④Python大小写转换函数:capitalize()转换首字母大写其他字母小写;upper()全部转换为大写;lower()全部转换为小写;title()全部单词首字母大写,其他字母小写

s = "python is the best!"
print s.capitalize()
print s.upper()
s = "Python is the best!"
print s.lower()
print s.title()

输出

⑤python random模块

random.sample(sequence, i)  从指定序列中随机截取指定长度的片段

random.randint(a, b) 返回一个随机数,介于a和b之间,可以取到边界值

random.shuffle(sequence) 将一个列表中的元素打乱

import random
list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]   
sample_ = random.sample(list, 5)
print sample_

for i in range(0,10):
    print random.randint(1,10),

print 
random.shuffle(list)
print list

该例输出

⑥字符串replace()方法 

>>> s = "P***on is the best!"
>>> print s.replace("***", "yth", 1)    #第一个参数是被替换字串,第二个参数是替换字串,第三个参数是最大替换次数
Python is the best!

Exercise 42 

代码

## Animal is-a object (yes, sort of confusing), look at the extra credit.
class Animal(object):
    pass 

## Dog is-a Animal
class Dog(Animal):
    
    def __init__(self, name):
        ## Dog has-a name 
        self.name = name 
        
##  Cat is-a Animal
class Cat(Animal):
    
    def __init__(self, name):
        ##  Cat has-a name 
        self.name = name 
        
##  Person is-a object
class Person(object):
    
    def __init__(self, name):
        ##  Person has-a name 
        self.name = name 
        
        ## Person has-a pet of some kinde 
        self.pet = None
        
##  Employee is-a Person
class Employee(Person):
    
    def __init__(self, name, salary):
        ##  hnm what is this strange magic?
        super(Employee, self).__init__(name)
        ##  Employee has-a salary
        self.salary = salary
        
##  Fish is-a object 
class Fish(object):
    pass 
    
##  Salmon is-a Fish
class Salmon(Fish):
    pass 
    
##  Halibut is-a Fish 
class Halibut(Fish):
    pass 
    

##  rover is-a Dog
rover = Dog("Rover")

##  satan is-a Cat
satan = Cat("Satan")

##  mary is-a Person
mary = Person("Mary")

## mary has-a pet 
mary.pat = satan

##  frank is-a Employee
frank = Employee("Frank", 120000)

##  frank has-a pet 
frank.pet = rover 

##  flipper is-a Fish 
flipper = Fish()

## crouse is-a Salmon
crouse = Salmon()

##  harry is-a Halibut
harry = Halibut()

本节代码无输出

Notes:

①super()函数在类中是调用父类的函数。Python虽然支持通过直接调用父类名调用父类的方法,但缺点是更改父类名称时要遍历所以用到此父类方法的子类。super()就是为了解决这一问题。详见http://blog.csdn.net/johnsonguo/article/details/585193

②__init__(),类中定义了此方法的话,则在创建类的实例时对实例首先执行此方法,可理解为类的初始化

Exercise 44

代码

A.隐式继承(Implicit Inheritance)

class Parent(object):
    
    def implicit(self):
        print "PARENT implicit()"
        
class Child(Parent):
    pass 
    
dad = Parent()
son = Child()

dad.implicit()
son.implicit()

输出

Notes:

①pass是Python中创建空白代码块的办法,在前面也已经见到过pass的用处

②当在父类中定义了一个函数,在子类中没有定义时,就会发生隐式继承。也就是说,所有的子类(Child这样的类)会自动获得父类所具有的的函数的功能。

B.显式覆些(Override Explicitly)

class Parent(object):
    
    def override(self):
        print "PARENT override()"
     
class Child(Parent):
    
    def override(self):
        print "CHILD override()"
        
dad = Parent()
son = Child()

dad.override()
son.override()

输出

Notes:

①子类中定义与父类中相同名称的函数时,子类的函数会取代父类函数的功能

C. 运行前或运行后覆写

class Parent(object):
    
    def altered(self):
        print "PARENT altered()"
        
class Child(Parent):
    
    def altered(self):
        print "CHILD, BEFORE PARENT altered()"
        super(Child, self).altered()
        print "CHILD, AFTER PARENT altered()"
        
dad = Parent()
son = Child()

dad.altered()
son.altered()

输出

Notes

①super函数的调用

D.混合情况

class Parent(object):
    
    def override(self):
        print "PARENT override()"
        
    def implicit(self):
        print "PARENT implicit()"
        
    def altered(self):
        print "PARENT altered()"
        
class Child(Parent):
    
    #  override 
    def override(self):
        print "CHILD override()"
        
    def altered(self):
        # override
        print "CHILD, BEFORE PARENT altered()"
        # implicit
        super(Child, self).altered()
        print "CHILD, AFTER PARENT altered()"
        
dad = Parent()
son = Child()

dad.implicit()
son.implicit()

dad.override()
son.override()

dad.altered()
son.altered()

输出

E.合成(composition)

class Other(object):
    
    def override(self):
        print "OTHER override()"
        
    def implicit(self):
        print "OTHER implicit()"
        
    def altered(self):
        print "OTHER altered()"
        
class Child(object):
    
    def __init__(self):
        self.other = Other()
        
    def implicit(self):
        self.other.implicit()
        
    def override(self):
        print "CHILD override()"
        
    def altered(self):
        print "CHILD, BEFORE OTHER altered()"
        self.other.altered()
        print "CHILD, AFTER OTHER altered()"
        
son = Child()

son.implicit()
son.override()
son.altered()

输出

Notes:

①作者的建议:除非必要,尽量避免多重继承这个"恶魔"

②如果有代码需要在不同场合用到,则用合成来把它们做成模块

③阅读Python风格指南

链接:英文  https://www.python.org/dev/peps/pep-0008/#copyright

中文  http://my.oschina.net/u/1433482/blog/464444

© 著作权归作者所有

共有 人打赏支持
好好先生_1028
粉丝 24
博文 79
码字总数 78986
作品 0
温州
私信 提问
笨方法学Python,Lesson 27 - Lesson 31

Exercise 27 本节介绍True 和 False,即布尔值,无代码 ①记忆真值表 Exercise 28 本节主要是掌握布尔代数运算 ①布尔运算,先计算括号,然后是等号、不等号等运算,再计算not,最后计算and...

好好先生_1028
2015/10/27
0
0
笨方法学python,Lesson 37

本节无代码,总结了python的所有关键字,如下 A. Keywords: B.数据类型 C.转义序列 D.格式化字符串 E.操作符

好好先生_1028
2015/10/29
0
0
笨方法学python,Lesson 22, 23

Exercise 22 python关键词及符号等合集 Exercise 23 无

好好先生_1028
2015/10/26
0
0
python-35:urllib 和 urllib2 模块

首先,urllib 和 urllib2 是python 自带的模块,所以我们可以通过官网文档来查看它们的详细信息,这里依然给出网址,感兴趣的同学可以看一下 urllib模块:http://python.usyiyi.cn/python278...

达岭凹老大
2015/12/01
229
0
笨方法学Python,Lesson 26

本节习题是找Bug 修改前代码 def break_words(stuff): """This function will break up words for us.""" words = stuff.split(' ') return words def sort_words(words): """Sorts the word......

好好先生_1028
2015/10/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

babel6升级到7,jest-babel报错:Requires Babel "^7.0.0-0", but was loaded with "6.26.3".

自从将前端环境更新到babel7,jest-babel之前是基于babel6的,执行时候就会报:Requires Babel "^7.0.0-0", but was loaded with "6.26.3". 很烦,因为连续帮好几台电脑修复这个问题,所以记...

曾建凯
14分钟前
0
0
探索802.11ax

802.11ax承诺在真实条件下改善峰值性能和最差情况。 如何改善今天的Wi-Fi? 在决定如何改进当前版本以外的Wi-Fi时,802.11ac,IEEE和Wi-Fi联盟调查了Wi-Fi部署和行为,以确定更广泛使用的障碍...

linuxprobe16
今天
2
0
使用linux将64G的SDCARD格式化为FAT32

一、命令如下: sudo fdisk -lsudo mkfs.vfat /dev/sda -Isudo fdisk /dev/sda Welcome to fdisk (util-linux 2.29.2). Changes will remain in memory only, until you decide to wri......

mbzhong
今天
4
0
深入理解Plasma(四):Plasma Cash

这一系列文章将围绕以太坊的二层扩容框架,介绍其基本运行原理,具体操作细节,安全性讨论以及未来研究方向等。本篇文章主要介绍在 Plasma 框架下的项目 Plasma Cash。 深入理解Plasma(1):...

HiBlock
昨天
1
0
命令参数的三大风格:Posix、BSD、GNU

今天读到命令行中参数的风格有三大类,即Unix/Posix、BSD、GNU。分别有以下特征: Unix/Posix风格,即命令后的参数,可以分组,便必须以连字符开头,如ps -aux。 BSD风格,即命令后的参数,可...

大别阿郎
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部