笨办法学Python 习题 38: 列表的操作
你已经学过了列表。在你学习“while循环”的时候,你对列表进行过“追加(append)”操作,而且将列表的内容打印了出来。另外你应该还在附加题里研究过 Python 文档,看了列表支持的其他操作。这已经是一段时间以前了,所以如果你不记得了的话,就回到本书的前面再复习一遍把。 找到了吗?还记得吗?很好。那时候你对一个列表执行了append函数。不过,你也许还没有真正明白发生的事情,所以我们再来看看我们可以对列表进行什么样的操作。 当你看到像 mystuff.append('hello') 这样的代码时,你事实上已经在 Python 内部激发了一个连锁反应。以下是它的工作原理:
大部分时候你不需要知道这些细节,不过如果你看到一个像这样的 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这个参数。 一下子要消化这么多可能有点难度,我们将做几个练习,让你头脑中有一个深刻的印象。下面的练习将字符串和列表混在一起,看看你能不能在里边找出点乐子来: #?-*-?coding:utf-8?-*- ten_things?=?"Apples?Oranges?Crows?Telephone?Light?Sugar" print?"Wait?there?are?not?10?things?in?that?list.?Let's?fix?that." #.split()?切片 stuff?=?ten_things.split('?') more_stuff?=?["Day",?"Night",?"Song",?"Frisbee",?"Corn",?"Banana",?"Girl",?"Boy"] #stuff列个数不等于10 while?len(stuff)?!=?10: ????#more_stuff.pop()?移除more_stuff列表最后一个元素,并返回该元素赋值给next_one ????next_one?=?more_stuff.pop() ????print?"Adding:?",?next_one ????#next_one值增加到stuff列表中 ????stuff.append(next_one) ????print?"There?are?%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 #移除stuff列表中最后一个字符,并返回该值 print?stuff.pop() #join()将stuff列表中的元素连接起来 print?'?'.join(stuff)?#?what??cool! #join()将stuff列表的第四个元素和第五个元素以‘#’连接 print?'#'.join(stuff[3:5])?#?super?stellar! 结果 Wait?there?are?not?10?things?in?that?list.?Let's?fix?that. Adding:??Boy There?are?7?items?now. Adding:??Girl There?are?8?items?now. Adding:??Banana There?are?9?items?now. Adding:??Corn There?are?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程序。你必须用python写出知道如何玩一副虚拟扑克牌的代码,这样人们就能把你的游戏当成真实的游戏来玩,即使它不是真的。你需要的是一副“扑克牌”结构,而程序员就称之为“数据结构”。 什么是数据结构呢?如果你仔细想想,数据结构其实就是一种正式的构造(组织)一些数据(事实)的方法。真的就是这么简单,尽管一些数据结构十分错综复杂,它们也仅仅是在程序中存储数据的方式而已,这样你就能用不同的方式访问它们。 我将在下一节练习中更深入的讲解这些,但是列表是程序员常用的数据结构之一。它们只是数据的有序列表,你可以通过线性索引来存储或访问它们。什么?记住我说过的话,只是因为一个程序员说过“列表是一个列表”并不意味着它比真实世界中的列表复杂多少。 让我们以扑克牌为例:
让我们看看我说过什么: “一个有序的列表”是的,扑克牌有第一张和最后一张"有一些你要存储的事物"是的,卡片就是我要存储的东西"可以随机访问"是的,在这副牌中我可以任意取出一张."是线性的"是的,如果我想找到特定的一张牌,我必须从头开始按顺序查找。"有索引的"差不多,如果我让你找到一副扑克牌的第19张,你就必须按照顺序去数,直到你找到这一张。在python的列表中,计算机可以直接跳到你给出的索引处。这就是一个列表做的所有的事情,这么解释应该给了你一个在编程中找到列表概念的方法吧。编程中的每一个概念通常都有与真实世界相关联,至少在真实世界是有用的。如果你能找出虚拟的概念在真实世界中对应的概念,那你也可以通过这些找到数据结构到底是做什么的。 什么情况可以使用列表 当你有一些有东西能匹配列表数据结构的有用特性时,使用列表:
加分习题
常见问题回答 你没有说说不要用while循环? 是的。你要记住,有时候如果你有很好的理由,那么规则也是可以打破的。死守着规则不放的人是白痴。 join(' ',stuff)为什么没有生效? 文档中关于join的内容,写的没有意义,join是使用一个字符串将列表内容链接起来的一个方法,你可以试试这么写' '.join(stuff).. 为什么你用了一个while循环? 试着用for循环改写一下,看看哪个更简单 stuff[3:5]实现了什么功能? 这句代码从stuff中获取了一个子集,包含stuff的第3和第4个元素,没有包含第5个元素。它和range(3,5)的工作原理相近。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |