您正在查看: Python 分类下的文章

习题 42: 物以类聚

习题 42: 物以类聚

虽说将函数放到字典里是很有趣的一件事情,你应该也会想到“如果 python 能自动为你做这件事情该多好”。事实上也的确有,那就是 class 这个关键字。你可以使用 class 创建更棒的“函数字典”,比你在上节练习中做的强大多了。Class(类)有着各种各样强大的功能和用法,但本书不会深入讲这些内容,在这里,你只要你学会把它们当作高级的“函数字典”使用就可以了。

用到“class”的编程语言被称作“Object Oriented Programming(面向对象编程)”语言。这是一种传统的编程方式,你需要做出“东西”来,然后你“告诉”这些东西去完成它们的工作。类似的事情你其实已经做过不少了,只不过还没有意识到而已。记得你做过的这个吧:

stuff = ['Test', 'This', 'Out']
print ' '.join(stuff)

其实你这里已经使用了 class。``stuff`` 这个变量其实是一个 list class (列表类)。而 ' '.join(stuff) 里调用函数 join 的字符串 ' ' (就是一个空格)也是一个 class —— 它是一个 string class (字符串类)。到处都是 class!

还有一个概念是 object(物件),不过我们暂且不提。当你创建过几个 class 后就会学到了。你怎样创建 class 呢?和你创建 ROOMS 的方法差不多,但其实更简单:

class TheThing(object):

def init(self):
self.number = 0

def some_function(self):
print "I got called."

def add_me_up(self, more):
self.number += more
return self.number

two different things

a = TheThing()
b = TheThing()

a.some_function()
b.some_function()

print a.add_me_up(20)
print a.add_me_up(20)
print b.add_me_up(30)
print b.add_me_up(30)

print a.number
print b.number

Warning

嗯,你开始看到 python 的“疣子”了。Python 是一门比较旧的语言,其中包含很多丑陋的设计决定。为了将这些丑陋设计掩盖过去,他们就做了一些新的丑陋设计,然后告诉人们让他们习惯这些新的坏设计。``class TheThing(object)`` 就是其中一个例子。这里我就不展开讲了,不过你也不必操心为什么你的 class 要在后面添一个(object) ,只要跟着这样做就可以了,否则将来总有一天别的 Python 程序员会吼你让你这样做。后面我们再讲为什么。

你看到参数里的 self 了吧?你知道它是什么东西吗?对了,它就是 Python 创建的额外的一个参数,有了它你才能实现 a.some_function()` 这种用法,这时它就会把\ 前者翻译成 ``some_function(a) 执行下去。为什么用 self 呢?因为你的函数并不知道你的这个“实例”是来自叫 TheThing 或者别的名字的 class。所以你只要使用一个通用的名字 self 。这样你写出来的函数就会在任何情况下都能正常工作。

其实你可以使用 self 以外的别的字眼,不过如果你这样做的话,你就会成为所有Python 程序员的众之矢的,所以还是随大流的好。只有变态才会在这里乱改,我教你的没错。对以后会读到你的代码的人好点儿,因为你现在的代码10年以后所有的代码都会是一团糟。

接下来,看到 __init__ 函数了吗?这就是你为 Python class 设置内部变量的方式。你可以使用 . 将它们设置到 self 上面。另外看到我们使用了 add_me_up() 为你创建的 self.number 加值。后面你可以看到我们怎样可以使用这种方法为数字加值,然后打印出来。

Class 是很强大的东西,你应该好好读读相关的东西。尽可能多找些东西读并且多多实验。你其实知道它们该怎么用,只要试试就知道了。其实我马上就要去练吉他了,所以我不会让你写练习了。你将使用 class 写一个练习。

接下来我们将把习题41的内容重写,不过这回我们将使用 class:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
from sys import exit
from random import randint

class Game(object):

def init(self, start):
self.quips = [
"You died. You kinda suck at this.",
"Your mom would be proud. If she were smarter.",
"Such a luser.",
"I have a small puppy that's better at this."
]
self.start = start

def play(self):
next = self.start

while True:
print "\n--------"
room = getattr(self, next)
next = room()

def death(self):
print self.quips[randint(0, len(self.quips)-1)]
exit(1)

def princess_lives_here(self):
print "You see a beautiful Princess with a shiny crown."
print "She offers you some cake."

eat_it = raw_input("> ")

if eat_it == "eat it":
print "You explode like a pinata full of frogs."
print "The Princess cackles and eats the frogs. Yum!"
return 'death'

elif eat_it == "do not eat it":
print "She throws the cake at you and it cuts off your head."
print "The last thing you see is her munching on your torso. Yum!"
return 'death'

elif eat_it == "make her eat it":
print "The Princess screams as you cram the cake in her mouth."
print "Then she smiles and cries and thanks you for saving her."
print "She points to a tiny door and says, 'The Koi needs cake too.'"
print "She gives you the very last bit of cake and shoves you in."
return 'gold_koi_pond'

else:
print "The princess looks at you confused and just points at the cake."
return 'princess_lives_here'

def gold_koi_pond(self):
print "There is a garden with a koi pond in the center."
print "You walk close and see a massive fin poke out."
print "You peek in and a creepy looking huge Koi stares at you."
print "It opens its mouth waiting for food."

feed_it = raw_input("> ")

if feed_it == "feed it":
print "The Koi jumps up, and rather than eating the cake, eats your arm."
print "You fall in and the Koi shrugs than eats you."
print "You are then pooped out sometime later."
return 'death'

elif feed_it == "do not feed it":
print "The Koi grimaces, then thrashes around for a second."
print "It rushes to the other end of the pond, braces against the wall..."
print "then it lunges out of the water, up in the air and over your"
print "entire body, cake and all."
print "You are then pooped out a week later."
return 'death'

elif feed_it == "throw it in":
print "The Koi wiggles, then leaps into the air to eat the cake."
print "You can see it's happy, it then grunts, thrashes..."
print "and finally rolls over and poops a magic diamond into the air"
print "at your feet."

return 'bear_with_sword'

else:
print "The Koi gets annoyed and wiggles a bit."
return 'gold_koi_pond'

def bear_with_sword(self):
print "Puzzled, you are about to pick up the fish poop diamond when"
print "a bear bearing a load bearing sword walks in."
print '"Hey! That' my diamond! Where'd you get that!?"'
print "It holds its paw out and looks at you."

give_it = raw_input("> ")

if give_it == "give it":
print "The bear swipes at your hand to grab the diamond and"
print "rips your hand off in the process. It then looks at"
print 'your bloody stump and says, "Oh crap, sorry about that."'
print "It tries to put your hand back on, but you collapse."
print "The last thing you see is the bear shrug and eat you."
return 'death'

elif give_it == "say no":
print "The bear looks shocked. Nobody ever told a bear"
print "with a broadsword 'no'. It asks, "
print '"Is it because it's not a katana? I could go get one!"'
print "It then runs off and now you notice a big iron gate."
print '"Where the hell did that come from?" You say.'

return 'big_iron_gate'

def big_iron_gate(self):
print "You walk up to the big iron gate and see there's a handle."

open_it = raw_input("> ")

if open_it == 'open it':
print "You open it and you are free!"
print "There are mountains. And berries! And..."
print "Oh, but then the bear comes with his katana and stabs you."
print '"Who's laughing now!? Love this katana."'

return 'death'

else:
print "That doesn't seem sensible. I mean, the door's right there."
return 'big_iron_gate'

a_game = Game("princess_lives_here")
a_game.play()

你应该看到的结果

这个版本的游戏和你的上一版效果应该是一样的,其实有些代码都几乎一样。比较一下两版代码,弄懂其中不同的地方,重点需要理解这些东西:

  • 怎样创建一个 class Game(object) 并且放函数到里边去。
  • __init__ 是一个特殊的初始方法,可以预设重要的变量在里边。
  • 为 class 添加函数的方法是将函数在 class 下再缩进一阶,class 的架构就是通过缩进实现的,这点很重要。
  • 你在函数里的内容又缩进了一阶。
  • 注意冒号的用法。
  • 理解 self 的概念,以及它在 __init__ 、 play 、 death 里是怎样使用的。
  • 研究 play 里的 getattr 的功能,这样你就能明白 play 所做的事情。其实你可以手动在 Python 命令行实验一下,从而弄懂它。
  • 最后我们怎样创建了一个 Game ,然后通过 play() 让所有的东西运行起来。
  • 加分习题

  • 研究一下 __dict__ 是什么东西,应该怎样使用。
  • 再为游戏添加一些房间,确认自己已经学会使用 class 。
  • 创建一个新版本,里边使用两个 class,其中一个是 Map ,另一个是 Engine 。提示: 把 play 放到 Engine 里面。
  • Project Versions

    Table Of Contents

    • 习题 42: 物以类聚
      • 你应该看到的结果
      • 加分习题

    Previous topic

    习题 41: 持剑的熊,密室

    Next topic

    习题 43: 你来制作一个游戏

    This Page

    • Show Source

    Quick search

    Enter search terms or a module, class or function name.

    习题 43: 你来制作一个游戏

    习题 43: 你来制作一个游戏

    你要开始学会自食其力了。通过阅读这本书你应该已经学到了一点,那就是你需要的所有的信息网上都有,你只要去搜索就能找到。唯一困扰你的就是如何使用正确的词汇进行搜索。学到现在,你在挑选搜索关键字方面应该已经有些感觉了。现在已经是时候了,你需要尝试写一个大的项目,并让它运行起来。

    以下是你的需求:

  • 制作一个截然不同的游戏。
  • 使用多个文件,并使用 import 调用这些文件。确认自己知道 import 的用法。
  • 对于每个房间使用一个 class,class 的命名要能体现出它的用处。例如 GoldRoom、KoiPondRoom。
  • 你的执行器代码应该了解这些房间,所以创建一个 class 来调用并且记录这些房间。有很多种方法可以达到这个目的,不过你可以考虑让每个房间返回下一个房间,或者设置一个变量,让它指定下一个房间是什么。
  • 其他的事情就全靠你了。花一个星期完成这件任务,做一个你能做出来的最好的游戏。使用你学过的任何东西(类,函数,字典,列表……)来改进你的程序。这节课的目的是教你如何构建 class 出来,而这些 class 又能调用到其它 python 文件中的 class。

    我不会详细地告诉你告诉你怎样做,你需要自己完成。试着下手吧,编程就是解决问题的过程,这就意味着你要尝试各种可能性,进行实验,经历失败,然后丢掉你做出来的东西重头开始。当你被某个问题卡住的时候,你可以向别人寻求帮助,并把你的代码贴出来给他们看。如果有人刻薄你,别理他们,你只要集中精力在帮你的人身上就可以了。持续修改和清理你的代码,直到它完整可执行为止,然后再研究一下看它还能不能被改进。

    祝你好运,下个星期你做出游戏后我们再见。

    Project Versions

    Previous topic

    习题 42: 物以类聚

    Next topic

    习题 44: 给你的游戏打分

    This Page

    • Show Source

    Quick search

    Enter search terms or a module, class or function name.

    习题 44: 给你的游戏打分

    习题 44: 给你的游戏打分

    这节练习的目的是检查评估你的游戏。也许你只完成了一半,卡在那里没有进行下去,也许你勉强做出来了。不管怎样,我们将串一下你应该弄懂的一些东西,并确认你的游戏里有使用到它们。我们将学习如何用正确的格式构建 class,使用 class 的一些通用习惯,另外还有很多的“书本知识”让你学习。

    为什么我会让你先行尝试,然后才告诉你正确的做法呢?因为从现在开始你要学会“自给自足”,以前是我牵着你前行,以后就得靠你自己了。后面的习题我只会告诉你你的任务,你需要自己去完成,在你完成后我再告诉你如何可以改进你的作业。

    一开始你会觉得很困难并且很不习惯,但只要坚持下去,你就会培养出自己解决问题的能力。你还会找出创新的方法解决问题,这比从课本中拷贝解决方案强多了。

    函数的风格

    以前我教过的怎样写好函数的方法一样是适用的,不过这里要添加几条:

    • 由于各种各样的原因,程序员将 class (类)里边的函数称作 method (方法)。很大程度上这只是个市场策略(用来推销 OOP),不过如果你把它们称作“函数”的话,是会有啰嗦的人跳出来纠正你的。如果你觉得他们太烦了,你可以告诉他们从数学方面演示一下“函数”和“方法”究竟有什么不同,这样他们会很快闭嘴的。
    • 在你使用 class 的过程中,很大一部分时间是告诉你的 class 如何“做事情”。给这些函数命名的时候,与其命名成一个名词,不如命名为一个动词,作为给 class 的一个命令。就和 list 的 pop (抛出)函数一样,它相当于说:“嘿,列表,把这东西给我 pop 出去。”它的名字不是 remove_from_end_of_list ,因为即使它的功能的确是这样,这一串字符也不是一个命令。
    • 让你的函数保持简单小巧。由于某些原因,有些人开始学习 class 后就会忘了这一条。

    类的风格

    • 你的 class 应该使用 “camel case(驼峰式大小写)”,例如你应该使用 SuperGoldFactory 而不是 super_gold_factory。

    • 你的 __init__ 不应该做太多的事情,这会让 class 变得难以使用。

    • 你的其它函数应该使用 “underscore format(下划线隔词)”,所以你可以写 my_awesome_hair,

      而不是 myawesomehair 或者 MyAwesomeHair 。

    • 用一致的方式组织函数的参数。如果你的 class 需要处理 users、dogs、和 cats,就保持这个次序(特别情况除外)。如果一个函数的参数是 (dog, cat, user) ,另一个的是 (user, cat, dog) ,这会让函数使用起来很困难。

    • 不要对全局变量或者来自模组的变量进行重定义或者赋值,让这些东西自顾自就行了。

    • 不要一根筋式地维持风格一致性,这是思维力底下的妖怪喽啰做的事情。一致性是好事情,不过愚蠢地跟着别人遵从一些白痴口号是错误的行为——这本身就是一种坏的风格。好好为自己照想把。

    • 永远永远都使用 class Name(object) 的方式定义 class,否则你会碰到大麻烦。

    代码风格

    • 为了以方便他人阅读,为自己的代码字符之间留下一些空白。你将会看到一些很差的程序员,他们写的代码还算通顺,但字符之间没有任何空间。这种风格在任何编程语言中都是坏习惯,人的眼睛和大脑会通过空白和垂直对齐的位置来扫描和区隔视觉元素,如果你的代码里没有任何空白,这相当于为你的代码上了迷彩装。如果一段代码你无法朗读出来,那么这段代码的可读性可能就有问题。如你找不到让某个东西易用的方法,试着也朗读出来。这样不仅会逼迫你慢速而且真正仔细阅读过去,还会帮你找到难读的段落,从而知道那些代码的易读性需要作出改进。
    • 学着模仿别人的风格写 python 程序,直到哪天你找到你自己的风格为止。
    • 一旦你有了自己的风格,也别把它太当回事。程序员工作的一部分就是和别人的代码打交道,有的人审美就是很差。相信我,你的审美某一方面一定也很差,只是你从未意识到而已。
    • 如果你发现有人写的代码风格你很喜欢,那就模仿他们的风格。

    好的注释

    • 有程序员会告诉你,说你的代码需要有足够的可读性,这样你就无需写注释了。他们会以自己接近官腔的声音说“所以你永远都不应该写代码注释。”这些人要么是一些顾问型的人物,如果别人无法使用他们的代码,就会付更多钱给他们让他们解决问题。要么他们能力不足,从来没有跟别人合作过。别理会这些人,好好写你的注解。
    • 写注解的时候,描述清楚为什么你要这样做。代码只会告诉你“这样实现”,而不会告诉你“为什么要这样实现”,而后者比前者更重要。
    • 当你为函数写文档注解的时候,记得为别的代码使用者也写些东西。你不需要狂写一大堆,但一两句话谢谢这个函数的用法还是很有用的。
    • 最后要说的是,虽然注解是好东西,太多的注解就不见得是了。而且注解也是需要维护的,你要尽量让注解短小精悍一语中的,如果你对代码做了更改,记得检查并更新相关的注解,确认它们还是正确的。

    为你的游戏评分

    现在我要求你假装成是我,板起脸来,把你的代码打印出来,然后拿一支红笔,把代码中所有的错误都标出来。你要充分利用你在本章以及前面学到的知识。等你批改完了,我要求你把所有的错误改对。这个过程我需要你多重复几次,争取找到更多的可以改进的地方。使用我前面教过的方法,把代码分解成最细小的单元一一进行分析。

    这节练习的目的是训练你对于细节的关注程度。等你检查完自己的代码,再找一段别人的代码用这种方法检查一遍。把代码打印出来,检查出所有代码和风格方面的错误,然后试着在不改坏别人代码的前提下把它们修改正确、

    这周我要求你的事情就是批改和纠错,包含你自己的代码和别人的代码,再没有别的了。这节习题难度还是挺大,不过一旦你完成了任务,你学过的东西就会牢牢记在脑中。

    Project Versions

    Table Of Contents

    • 习题 44: 给你的游戏打分
      • 函数的风格
      • 类的风格
      • 代码风格
      • 好的注释
      • 为你的游戏评分

    Previous topic

    习题 43: 你来制作一个游戏

    Next topic

    习题 45: 对象、类、以及从属关系

    This Page

    • Show Source

    Quick search

    Enter search terms or a module, class or function name.

    习题 38: 阅读代码

    习题 38: 阅读代码

    现在去找一些 python 代码阅读一下。你需要自己找代码,然后从中学习一些东西。你学到的东西已经足够让你看懂一些代码了,但你可能还无法理解这些代码的功能。这节课我要教给你的是:如何运用你学到的东西理解别人的代码。

    首先把你想要理解的代码打印到纸上。没错,你需要打印出来,因为和屏幕输出相比,你的眼睛和大脑更习惯于接受纸质打印的内容。一次最多打印几页就可以了。

    然后通读你打印出来的代码并做好标记,标记的内容包括以下几个方面:

  • 函数以及函数的功能。
  • 每个变量的初始赋值。
  • 每个在程序的各个部分中多次出现的变量。它们以后可能会给你带来麻烦。
  • 任何不包含 else 的 if 语句。它们是正确的吗?
  • 任何可能没有结束点的 while 循环。
  • 最后一条,代码中任何你看不懂的部分都记下来。
  • 接下来你需要通过注解的方式向自己解释代码的含义。解释各个函数的使用方法,各个变量的用途,以及任何其它方面的内容,只要能帮助你理解代码即可。

    最后,在代码中比较难的各个部分,逐行或者逐个函数跟踪变量值。你可以再打印一份出来,在空白处写出你要“追踪”的每个变量的值。

    一旦你基本理解了代码的功能,回到电脑面前,在屏幕上重读一次,看看能不能找到新的问题点。然后继续找新的代码,用上述的方法去阅读理解,直到你不再需要纸质打印为止。

    加分习题

  • 研究一下什么是“流程图(flow chart)”,并学着画一下。
  • 如果你在读代码的时候找出了错误,试着把它们改对,并把修改内容发给作者。
  • 不使用纸质打印时,你可以使用注解符号 # 在程序中加入笔记。有时这些笔记会对后来的读代码的人有很大的帮助。
  • Project Versions

    Table Of Contents

    • 习题 38: 阅读代码
      • 加分习题

    Previous topic

    习题 37: 复习各种符号

    Next topic

    习题 39: 列表的操作

    This Page

    • Show Source

    Quick search

    Enter search terms or a module, class or function name.

    习题 39: 列表的操作

    习题 39: 列表的操作

    你已经学过了列表。在你学习“while 循环”的时候,你对列表进行过“追加(append)”操作,而且将列表的内容打印了出来。另外你应该还在加分习题里研究过 python 文档,看了列表支持的其他操作。这已经是一段时间以前了,所以如果你不记得了的话,就回到本书的前面再复习一遍把。

    找到了吗?还记得吗?很好。那时候你对一个列表执行了 append 函数。不过,你也许还没有真正明白发生的事情,所以我们再来看看我们可以对列表进行什么样的操作。

    当你看到像 mystuff.append('hello') 这样的代码时,你事实上已经在 python 内部激发了一个连锁反应。以下是它的工作原理:

  • Python 看到你用到了 mystuff ,于是就去找到这个变量。也许它需要倒着检查看你有没有在哪里用 = 创建过这个变量,或者检查它是不是一个函数参数,或者看它是不是一个全局变量。不管哪种方式,它得先找到 mystuff 这个变量才行。
  • 一旦它找到了 mystuff ,就轮到处理句点 . (period) 这个操作符,而且开始查看 mystuff 内部的一些变量了。由于 mystuff 是一个列表,Python 知道mystuff 支持一些函数。
  • 接下来轮到了处理 append 。Python 会将 “append” 和 mystuff 支持的所有函数的名称一一对比,如果确实其中有一个叫 append 的函数,那么 Python 就会去使用这个函数。
  • 接下来 Python 看到了括号 ( (parenthesis) 并且意识到, “噢,原来这应该是一个函数”,到了这里,它就正常会调用这个函数了,不过这里的函数还要多一个参数才行。
  • 这个额外的参数其实是…… mystuff! 我知道,很奇怪是不是?不过这就是 Python 的工作原理,所以还是记住这一点,就当它是正常的好了。真正发生的事情其实是 append(mystuff, 'hello') ,不过你看到的只是 mystuff.append('hello') 。
  • 大部分时候你不需要知道这些细节,不过如果你看到一个像这样的 Python 错误信息的时候,上面的细节就对你有用了:

    $ python
    Python 2.6.5 (r265:79063, Apr 16 2010, 13:57:41)
    [GCC 4.4.3] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> class Thing(object):
    ...  def test(hi):
    ... print "hi"
    ...
    >>> a = Thing()
    >>> a.test("hello")
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: test() takes exactly 1 argument (2 given)
    >>>
    

    就是这个吗?嗯,这个是我在 Python 命令行下展示给你的一点魔法。你还没有见过class 不过后面很快就要碰到了。现在你看到 Python 说 test() takes exactly 1 argument (2 given) (test() 只可以接受1个参数,实际上给了两个)。它意味着 python 把 a.test("hello") 改成了 test(a, "hello") ,而有人弄错了,没有为它添加 a 这个参数。

    一下子要消化这么多可能有点难度,不过我们将做几个练习,让你头脑中有一个深刻的印象。下面的练习将字符串和列表混在一起,看看你能不能在里边找出点乐子来:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    ten_things = "Apples Oranges Crows Telephone Light Sugar"
    

    print "Wait there's not 10 things in that list, let's fix that."

    stuff = ten_things.split(' ')
    more_stuff = ["Day", "Night", "Song", "Frisbee", "Corn", "Banana", "Girl", "Boy"]

    while len(stuff) != 10:
    next_one = more_stuff.pop()
    print "Adding: ", next_one
    stuff.append(next_one)
    print "There's %d items now." % len(stuff)

    print "There we go: ", stuff

    print "Let's do some things with stuff."

    print stuff[1]
    print stuff[-1] # whoa! fancy
    print stuff.pop()
    print ' '.join(stuff) # what? cool!
    print '#'.join(stuff[3:5]) # super stellar!

    你应该看到的结果

    $ python ex39.py
    

    Wait there's not 10 things in that list, let's fix that.
    Adding: Boy
    There's 7 items now.
    Adding: Girl
    There's 8 items now.
    Adding: Banana
    There's 9 items now.
    Adding: Corn
    There's 10 items now.
    There we go: ['Apples', 'Oranges', 'Crows', 'Telephone', 'Light', 'Sugar',
    'Boy', 'Girl', 'Banana', 'Corn']
    Let's do some things with stuff.
    Oranges
    Corn
    Corn
    Apples Oranges Crows Telephone Light Sugar Boy Girl Banana
    Telephone#Light

    加分习题

  • 将每一个被调用的函数以上述的方式翻译成 Python 实际执行的动作。例如: ' '.join(things) 其实是 join(' ', things) 。
  • 将这两种方式翻译为自然语言。例如, ' '.join(things) 可以翻译成“用 ‘ ‘ 连接(join) things”,而 join(' ', things) 的意思是“为 ‘ ‘ 和 things 调用 join 函数”。这其实是同一件事情。
  • 上网阅读一些关于“面向对象编程(Object Oriented Programming)”的资料。晕了吧?嗯,我以前也是。别担心。你将从这本书学到足够用的关于面向对象编程的基础知识,而以后你还可以慢慢学到更多。
  • 查一下 Python中的 “class” 是什么东西。不要阅读关于其他语言的 “class” 的用法,这会让你更糊涂。
  • dir(something) 和 something 的 class 有什么关系?
  • 如果你不知道我讲的是些什么东西,别担心。程序员为了显得自己聪明,于是就发明了 Opject Oriented Programming,简称为 OOP,然后他们就开始滥用这个东西了。如果你觉得这东西太难,你可以开始学一下 “函数编程(functional programming)”。
  • Project Versions

    Table Of Contents

    • 习题 39: 列表的操作
      • 你应该看到的结果
      • 加分习题

    Previous topic

    习题 38: 阅读代码

    Next topic

    习题 40: 字典, 可爱的字典

    This Page

    • Show Source

    Quick search

    Enter search terms or a module, class or function name.