X Tutup
>你们不要论断人,免得你们被论断。因为你们怎样论断人,也必怎样被论断。你们用甚么量器量给人,也必用甚么量器量给你们。(MATTHEW 7:1-2) #列表(1) 已经知道了数字和字符串,用`type()`可以得到具体某个对象的类型。 这是两种很基本的对象,由它们可以组成其它的对象。 >对数据类型的理解。这个世界是由数据组成的,数据可能是数字(注意,别搞混了,数字和数据是有区别的),也可能是文字、或者是声音、视频等。 还学习了变量,如果某个变量指向一个对象,行话是“赋值”。 从现在开始学习一种新的对象——list(列表)。下面的文字,请注意了: **列表在Python中具有非常强大的功能。** ##定义 在Python中,用方括号表示一个列表——[ ]。 在方括号里面,可以是数字(整数、浮点数),也可以是字符串,甚至也能够是True/False这种布尔值。 先定义一个空列表看一看。 >>> a = [] #定义了一个空列表,并把他赋值给变量a。 >>> type(a) #type()查看变量a所指向对象的类型 >>> bool(a) False >>> print a [] `bool()`是一个布尔函数,这个东西后面会详述。它的作用就是来判断一个对象是“真”还是“空”(假)。如果想上面例子那样,列表中什么也没有,就是空的,用`bool()`函数来判断,返回False,从而显示它是空的。 不能总玩空的,来点实的吧。 >>> a = ['2', 3, 'qiwsir.github.io'] >>> a ['2', 3, 'qiwsir.github.io'] >>> type(a) >>> bool(a) True >>> print a ['2', 3, 'qiwsir.github.io'] 用上述方法,定义一个列表类型的对象。 从刚才的例子中,读者是否注意到,列表里面的元素,可以是不同类型的对象,可谓是“有容乃大”,不仅如此,它的元素个数还可以无限大,就是说里面所能容纳的元素数量无限,当然这是在硬件设备理想的情况下。 >如果以后或者已经了解了别的语言,比如比较常见的Java,里面有一个跟Python列表相似的数据类型——数组——但是两者还是有区别的。在Java中,数组中的元素必须是基本数据类型中某一个,也就是要么都是整数类型,要么都是字符类型等,不能一个数组中既有整数类型又有字符类型。这是因为Java中的数组,需要提前声明,声明的时候就确定了里面元素的类型。但是Python中的列表,尽管跟Java中的数组有类似的地方——都是`[]`包裹的——列表中的元素是任意类型的。所以,有一句话说:列表是Python中的苦力,什么都可以干。 ##索引和切片 尚记得在[《字符串(3)》](./108.md)中,曾经有“索引”(index)和“切片”。 >>> url = "qiwsir.github.io" >>> url[2] 'w' >>> url[:4] 'qiws' >>> url[3:9] 'sir.gi' 在list中,也有类似的操作。只不过是以元素为单位,不是以字符为单位进行索引了。看例子就明白了。 >>> a ['2', 3, 'qiwsir.github.io'] >>> a[0] #索引序号也是从0开始 '2' >>> a[1] 3 >>> [2] [2] >>> a[:2] ['2', 3] >>> a[1:] [3, 'qiwsir.github.io'] >>> a[1:2] [3] >>> a[2][7:13] #可以对列表元素做2次切片 'github' 列表和字符串两种类型的对象,都属于序列(都是一些对象按照某个次序排列起来,这就是序列的最大特征),因此,就有很多类似的地方。如刚才演示的索引和切片,是非常一致的。 >>> lang = "python" >>> lang.index("y") 1 >>> lst = ['python','java','c++'] >>> lst.index('java') 1 我们已经知道,在Python中所有的索引都是从左边开始编号,第一个是0,然后依次增加1。此外,还有一种编号方式,就是从右边开始,右边第一个可以编号为`-1`,然后向左依次是:-2,-3,...,依次类推下来。这对字符串、列表等各种序列类型都是用。 >>> lang 'python' >>> lang[-1] 'n' >>> lst ['python', 'java', 'c++'] >>> lst[-1] 'c++' 从右边开始编号,第-1号是右边第一个。但是,如果要切片的话,应该注意了。 >>> lang[-1:-3] '' >>> lang[-3:-1] 'ho' >>> lst[-3:-1] ['python', 'java'] 序列的切片,一定要左边的数字小于右边的数字,`lang[-1:-3]`就没有遵守这个规则,返回的是一个空。 ##反转 这个功能作为一个独立的项目提出来,是因为在编程中常常会用到。 还是通过举例来演示反转的方法: >>> alst = [1, 2, 3, 4, 5, 6] >>> alst[: : -1] #反转 [6, 5, 4, 3, 2, 1] >>> alst [1, 2, 3, 4, 5, 6] 对于字符串也可以: >>> lang 'python' >>> lang[::-1] 'nohtyp' >>> lang 'python' 是否注意到,不管是字符串还是列表,反转之后,都没有影响原来的对象。 这说明,这里的反转,不是在“原地”把原来的值倒过来,而是新生成了一个值,那个值跟原来的值相比,是倒过来了。 这是一种非常简单的方法,虽然我在写程序的时候常常使用,但是,我不是十分推荐,因为有时候让人感觉迷茫。Python还有另外一种方法让列表反转,是比较容易理解和阅读的,特别推荐之: >>> list(reversed(alst)) [6, 5, 4, 3, 2, 1] 比较简单,而且很容易看懂。不是吗? 顺便给出`reversed()`函数的详细说明: >>> help(reversed) Help on class reversed in module __builtin__: class reversed(object) | reversed(sequence) -> reverse iterator over values of the sequence | | Return a reverse iterator 它返回一个可以迭代的对象(关于迭代的问题,后续会详述之),不过是已经将原来的序列对象反转了。比如: >>> list(reversed("abcd")) ['d', 'c', 'b', 'a'] 很好,很强大,特别推荐使用。 ##操作列表 刚刚提到过,列表是序列。所有的序列,都有几种基本操作。列表也当然如此。 ###基本操作 - len() 在交互模式中操作: >>> lst ['python', 'java', 'c++'] >>> len(lst) 3 - +,连接两个序列 交互模式中: >>> lst ['python', 'java', 'c++'] >>> alst [1, 2, 3, 4, 5, 6] >>> lst + alst ['python', 'java', 'c++', 1, 2, 3, 4, 5, 6] - *,重复元素 交互模式中操作 >>> lst ['python', 'java', 'c++'] >>> lst * 3 ['python', 'java', 'c++', 'python', 'java', 'c++', 'python', 'java', 'c++'] - in 还是前面的列表, >>> "python" in lst True >>> "c#" in lst False - max()和min() 按照元素的字典顺序进行比较的。 >>> alst [1, 2, 3, 4, 5, 6] >>> max(alst) 6 >>> min(alst) 1 >>> max(lst) 'python' >>> min(lst) 'c++' - cmp(): 跟字符串中提到的`cmp()`一样,这个函数仅适用于Python 2,在Python 3中已经被抛弃了。 引用[官方文档] (https://docs.python.org/2.7/library/functions.html#cmp)一段话,说明这个函数的意义: >Compare the two objects x and y and return an integer according to the outcome. The return value is negative if x < y, zero if x == y and strictly positive if x > y. 不用翻译你也能看懂,况且还有例子: >>> lsta = [2, 3] >>> lstb = [2, 4] >>> cmp(lsta, lstb) -1 >>> lstc = [2] >>> cmp(lsta, lstc) 1 >>> lstd = ['2', '3'] >>> cmp(lsta, lstd) -1 ###追加元素 >>> a = ["good", "python", "I"] >>> a ['good', 'python', 'I'] >>> a.append("like") #向列表中追加字符串"like" >>> a ['good', 'python', 'I', 'like'] >>> a.append(100) #向列表中追加整数100 >>> a ['good', 'python', 'I', 'like', 100] [官方文档](https://docs.python.org/2/tutorial/datastructures.html)这样描述`list.append()`方法 >list.append(x) > Add an item to the end of the list; equivalent to a[len(a):] = [x]. 所谓追加,即将新的元素加到列表的尾部。 如果您仔细阅读了上面官方文档中的那句话,应该注意到,还有后面半句: equivalent to a[len(a):] = [x],意思是说`list.append(x)`等效于`a[len(a):]=[x]`。这也相当于告诉我们了另外一种追加元素的方法,并且两种方法等效。 >>> a ['good', 'python', 'I', 'like', 100] >>> a[len(a):]=[3] #len(a),即得到列表的长度 >>> a ['good', 'python', 'I', 'like', 100, 3] >>> len(a) 6 >>> a[6:]=['xxoo'] >>> a ['good', 'python', 'I', 'like', 100, 3, 'xxoo'] 到这里,仅仅是列表这座冰山的一角,既然它是“苦力”,可以干的活还很多。 ------ [总目录](./index.md)   |   [上节:字符编码](./110.md)   |   [下节:列表(2)](./112.md) 如果你认为有必要打赏我,请通过支付宝:**qiwsir@126.com**,不胜感激。
X Tutup