笨办法学Python(三十九)

习题 39: 列表的操作

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

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

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

  1. Python 看到你用到了 mystuff ,于是就去找到这个变量。也许它需要倒着检查看你有没有在哪里用 = 创建过这个变量,或者检查它是不是一个函数参数,或者看它是不是一个全局变量。不管哪种方式,它得先找到 mystuff 这个变量才行。
  2. 一旦它找到了 mystuff ,就轮到处理句点 . (period) 这个操作符,而且开始查看 mystuff 内部的一些变量了。由于 mystuff 是一个列表,Python 知道mystuff 支持一些函数。
  3. 接下来轮到了处理 append 。Python 会将 “append” 和 mystuff 支持的所有函数的名称一一对比,如果确实其中有一个叫 append 的函数,那么 Python 就会去使用这个函数。
  4. 接下来 Python 看到了括号 ( (parenthesis) 并且意识到, “噢,原来这应该是一个函数”,到了这里,它就正常会调用这个函数了,不过这里的函数还要多一个参数才行。
  5. 这个额外的参数其实是…… 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() takes exactly 1 argument (2 given) (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_one
11     stuff.append(next_one)
12     print "There‘s %d items now." % len(stuff)
13
14 print "There we go: ", stuff
15
16 print "Let‘s do some things with stuff."
17
18 print stuff[1]
19 print stuff[-1] # whoa! fancy
20 print stuff.pop()
21 print ‘ ‘.join(stuff) # what? cool!
22 print ‘#‘.join(stuff[3:5]) # super stellar!

你应该看到的结果

加分习题

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

习题练习

1.

Python中的join()函数的用法

时间: 2024-10-07 16:09:53

笨办法学Python(三十九)的相关文章

笨办法学Python(十)

习题 10: 那是什么? 在习题 9 中我你接触了一些新东西.我让你看到两种让字符串扩展到多行的方法.第一种方法是在月份之间用 \n (back-slash n )隔开.这两个字符的作用是在该位置上放入一个"新行(new line)"字符. 使用反斜杠 \ (back-slash) 可以将难打印出来的字符放到字符串.针对不同的符号有很多这样的所谓"转义序列(escape sequences)",但有一个特殊的转义序列,就是 双反斜杠(double back-slas

笨办法学Python(十四)

习题 14:提示和传递 让我们使用 argv 和 raw_input 一起来向用户提一些特别的问题.下一节习题你会学习如何读写文件,这节练习是下节的基础.在这道习题里我们将用略微不同的方法使用 raw_input,让它打出一个简单的 > 作为提示符.这和一些游戏中的方式类似,例如 Zork 或者 Adventure 这两款游戏. 1 from sys import argv 2 3 script, user_name = argv 4 prompt = '> ' 5 6 print "

笨办法学Python(十五)

习题 15: 读取文件 你已经学过了 raw_input 和 argv,这些是你开始学习读取文件的必备基础.你可能需要多多实验才能明白它的工作原理,所以你要细心做练习,并且仔细检查结果.处理文件需要非常仔细,如果不仔细的话,你可能会吧有用的文件弄坏或者清空.导致前功尽弃. 这节练习涉及到写两个文件.一个正常的 ex15.py 文件,另外一个是 ex15_sample.txt,第二个文件并不是脚本,而是供你的脚本读取的文本文件.以下是后者的内容: 1 This is stuff I typed i

笨办法学Python(十六)

习题 16: 读写文件 如果你做了上一个练习的加分习题,你应该已经了解了各种文件相关的命令(方法/函数).你应该记住的命令如下: close – 关闭文件.跟你编辑器的 文件->保存.. 一个意思. read – 读取文件内容.你可以把结果赋给一个变量. readline – 读取文本文件中的一行. truncate – 清空文件,请小心使用该命令. write(stuff) – 将stuff写入文件. 这是你现在该知道的重要命令.有些命令需要接受参数,这对我们并不重要.你只要记住 write 

笨办法学Python 练习13和14

原题: 1 from sys import argv 2 3 script, first, second, third = argv 4 5 print "The script is called:", script 6 print "Your first variable is:", first 7 print "Your second variable is:", second 8 print "Your third variabl

笨办法学 Python (Learn Python The Hard Way)

最近在看:笨办法学 Python (Learn Python The Hard Way) Contents: 译者前言 前言:笨办法更简单 习题 0: 准备工作 习题 1: 第一个程序 习题 2: 注释和井号 习题 3: 数字和数学计算 习题 4: 变量(variable)和命名 习题 5: 更多的变量和打印 习题 6: 字符串(string)和文本 习题 7: 更多打印 习题 8: 打印,打印 习题 9: 打印,打印,打印 习题 10: 那是什么? 习题 11: 提问 习题 12: 提示别人

笨办法学Python(三十)

习题 30: Else 和 If 前一习题中你写了一些 "if 语句(if-statements)",并且试图猜出它们是什么,以及实现的是什么功能.在你继续学习之前,我给你解释一下上一节的加分习题的答案.上一节的加分习题你做过了吧,有没有? 你认为 if 对于它下一行的代码做了什么? If 语句为代码创建了一个所谓的"分支",就跟 RPG 游戏中的情节分支一样.if 语句告诉你的脚本:"如果这个布尔表达式为真,就运行接下来的代码,否则就跳过这一段.&quo

笨办法学Python(三十四)

习题 34: 访问列表的元素 列表的用处很大,但只有你能访问里边的内容时它才能发挥出作用来.你已经学会了按顺序读出列表的内容,但如果你要得到第 5 个元素该怎么办呢?你需要知道如何访问列表中的元素.访问第一个元素的方法是这样的: animals = ['bear', 'tiger', 'penguin', 'zebra'] bear = animals[0] 你定义一个 animals 的列表,然后你用 0 来获取第一个元素?! 这是怎么回事啊?因为数学里边就是这样,所以 Python 的列表也

笨办法学Python(二十九)

习题 29: 如果(if) 下面是你要写的作业,这段向你介绍了"if语句".把这段输入进去,让它能正确执行.然后我们看看你是否有所收获. 1 people = 20 2 cats = 30 3 dogs = 15 4 5 6 if people < cats: 7 print "Too many cats! The world is doomed!" 8 9 if people > cats: 10 print "Not many cats!