笨办法学Python(三十九),,习题 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 错误信息的时候,上面的细节就对你有用了:

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

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

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

技术分享
 1 ten_things = "Apples Oranges Crows Telephone Light Sugar" 2  3 print "Wait there‘s not 10 things in that list, let‘s fix that." 4  5 stuff = ten_things.split(‘ ‘) 6 more_stuff = ["Day", "Night", "Song", "Frisbee", "Corn", "Banana", "Girl", "Boy"] 7  8 while len(stuff) != 10: 9     next_one = more_stuff.pop()10     print "Adding: ", next_one11     stuff.append(next_one)12     print "There‘s %d items now." % len(stuff)13 14 print "There we go: ", stuff15 16 print "Let‘s do some things with stuff."17 18 print stuff[1]19 print stuff[-1] # whoa! fancy20 print stuff.pop()21 print ‘ ‘.join(stuff) # what? cool!22 print ‘#‘.join(stuff[3:5]) # super stellar!
View Code

你应该看到的结果

技术分享

加分习题

将每一个被调用的函数以上述的方式翻译成 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)”。

习题练习

1.

Python中的join()函数的用法

笨办法学Python(三十九)

评论关闭