9. 更多类型-数据结构
现在--你已经知道了不少:怎样输入输出,怎样设计复杂的运算法则(程序)来执
行数学运算,但是好戏还在后头呢。
截止目前我们都在程序中使用了哪些成份呢?数字和字符串,对不对?没意思的种
类……现在让我们引入两三个其它的成份来让事情变得更有意思些。
数据结构是种组织数据的成份。(惊奇,吃惊……)单个的数据没有什么真正的数据
结构,是不是?但是假设我们需要很多数放在一起做为一个成份--那就需要某种结构。
例如,我们可能想要一个数据列表。那很容易:
[3, 6, 78, 93]
在循环那段我提到了列表,但没真正描述它。好--这里说的就是你如何创建它。只
需要列出元素,用逗号分开,再加上方括号就行了。
来看一个计算素数(只能被1和它本身整除的数)的例子:- # Calculate all the primes below 1000
- # (Not the best way to do it, but...)
- result = [1]
- candidates = range(3, 1000)
- base = 2
- product = base
- while candidates:
- while product < 1000:
- if product in candidates:
- candidates.remove(product)
- product = product+base
- result.append(base)
- base = candidates[0]
- product = base
- del candidates[0]
- result.append(base)
- print result
复制代码 这个例子中的新东西……
内建函数range事实上返回一个列表,可以象所有其它列表那样使用。(它包括第
一个数,但是不包括最后一个数。)
列表可以当作逻辑变量使用。如果它非空,则为true,否则为false。因此,while
candidates意思是“while名称为candidates的列表非空时”或者简单的说“while存
在candidates时”。
你可以用if someElement in somelist来检查一个元素是否在列表中。
你可以用someList.remove(someElement)来删除someList中的someElement。
你可以用someList.append(something)为一个列表添加元素。事实上,你也可以使
用“+”(象someList = someList+[something])。但是效率不是太高。
你可以通过在列表名之后加上用括号括起来的表示某元素位置的数字(很奇怪,列
表的第1个元素,位置是0)来获得列表的某个元素。因此someList[3]是someList
列表的第四个元素(依次类推)。
你可以使用关键字del删除变量。它也可以用来删除列表中的元素(就象这里)。
因此del someList[0]删除someList 列表中的第一个元素。如果删除前列表是[1, 2,
3],删除后就变成了[2, 3]。
在继续叙述索引列表中的元素之前,我简单解释一下上面的例子。
这是古老算术的一个版本,称为“The Sieve of Erastothenes”(类似这样)。它考量一
系列给定数字(在本例中是一个列表),然后有组织的删除已知不是素数的数字。如何知
道?只要看看它们是不是可以被分解为其它两个数就可以了。
我们从一个包含数字[2...999]的候选列表开始--我们知道1是素数(事实上,它可能
是也可能不是,看你问谁了),我们想得到小于1000的所有素数。(事实上,我们的候
选列表是[3...999],但是2也是候选数字,因为它是我们的第一个base)。我们还有个叫result的列表,它任何时间都包含着最新的结果。最初的时候,它只包含1。我们还有个叫base的变量。每次循环,我们删除是它的倍数的数字(它总是候选列表中最小的数)。每次循环之后,我们知道剩下的最小的数是素数(因为所有可以分解的数我们都删除了)。
因此,我们把它加入result,并把它设为新的base,然后从列表里移除它(这样就不会对
它重复计算了)。当候选列表为空时,result列表将包含所有的素数。精巧吧,哈!
思考一下:第一次循环有什么特别吗?那时base 是2,但它一样经过了筛选。为什
么?为什么这不发生在其它的base值身上?我们打算移除product时能否确定它在候选列
表中呢?为什么?
接下来是什么呢?哦,是的……索引。还有切片。它们是从python列表中获得单个
元素的方法。你已经见到了普通的索引行为。它相当简单。事实上,我已经告诉了你所有
你需要知道的关于它的东西,除了一件事:负数索引从列表的末尾向前计算。所以,
someList[-1]是someList的最后一个元素,someList[-2]是它之前的一个元素,依次类
推。
切片,仍然,对你来说是陌生的。它和索引相似,除了切片可以获得列表中的所有的
元素,而不仅仅是单个的元素。这如何做呢?象这样:- food = [“spam”, “spam”, “eggs”, “sausages”, “spam”]
- print food[2:4]
- # Prints “['eggs', 'sausages']”
复制代码 |