企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
前面的学习中,我们已经知道了两种python的数据类型:int和str。再强调一下对数据类型的理解,这个世界是由数据组成的,数据可能是数字(注意,别搞混了,数字和数据是有区别的),也可能是文字、或者是声音、视频等。在python中(其它高级语言也类似)把状如2,3这样的数字划分为一个类型,把状如“你好”这样的文字划分一个类型,前者是int类型,后者是str类型(这里就不说翻译的名字了,请看官熟悉用英文的名称,对日后编程大有好处,什么好处呢?谁用谁知道!)。 前面还学习了变量,如果某个变量指向一个对象(某种类型的数据)行话是:赋值),通常这个变量我们就把它叫做int类型的变量(注意,这种说法是不严格的,或者是受到别的语言影响的,在python中,特别要注意:**变量没有类型,对象有类型**。在python里,变量不用提前声明(在某些语言,如JAVA中需要声明变量之后才能使用。这个如果看官没有了解,不用担心,因为我们是学习python,以后学习的语言多了,自然就能体会到这点区别了),随用随命名。 这一讲中的list类型,也是python的一种数据类型。翻译为:列表。下面的黑字,请看官注意了: **LIST在python中具有非常强大的功能。** ## [](https://github.com/qiwsir/StarterLearningPython/blob/master/111.md#定义)定义 在python中,用方括号表示一个list,[ ] 在方括号里面,可以是int,也可以是str类型的数据,甚至也能够是True/False这种布尔值。看下面的例子,特别注意阅读注释。 ~~~ >>> a=[] #定义了一个变量a,它是list类型,并且是空的。 >>> type(a) <type 'list'> #用内置函数type()查看变量a的类型,为list >>> bool(a) #用内置函数bool()看看list类型的变量a的布尔值,因为是空的,所以为False False >>> print a #打印list类型的变量a [] ~~~ `bool()`是一个布尔函数,这个东西后面会详述。它的作用就是来判断一个对象是“真”还是“空”(假)。如果想上面例子那样,list中什么也没有,就是空的,用bool()函数来判断,得到False,从而显示它是空的。 不能总玩空的,来点实的吧。 ~~~ >>> a=['2',3,'qiwsir.github.io'] >>> a ['2', 3, 'qiwsir.github.io'] >>> type(a) <type 'list'> >>> bool(a) True >>> print a ['2', 3, 'qiwsir.github.io'] ~~~ 用上述方法,定义一个list类型的变量和数据。 本讲的标题是“有容乃大的list”,就指明了list的一大特点:可以无限大,就是说list里面所能容纳的元素数量无限,当然这是在硬件设备理想的情况下。 > 如果看官以后或者已经了解了别的语言,比如比较常见的Java,里面有一个跟list相似的数据类型——数组——但是两者还是有区别的。在Java中,数组中的元素必须是基本数据类型中某一个,也就是要么都是int类型,要么都是char类型等,不能一个数组中既有int类型又有char类型。这是因为java中的数组,需要提前声明,声明的时候就确定了里面元素的类型。但是python中的list,尽管跟java中的数组有类似的地方——都是`[]`包裹的——list中的元素是任意类型的,可以是int,str,甚至还可以是list,乃至于是以后要学的dict等。所以,有一句话说:List是python中的苦力,什么都可以干。 ## [](https://github.com/qiwsir/StarterLearningPython/blob/master/111.md#索引和切片)索引和切片 尚记得在[《字符串(3)》](https://github.com/qiwsir/StarterLearningPython/blob/master/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] #跟str中的类似,切片的范围是:包含开始位置,到结束位置之前 ['2', 3] #不包含结束位置 >>> a[1:] [3, 'qiwsir.github.io'] ~~~ list和str两种类型的数据,有共同的地方,它们都属于序列(都是一些对象按照某个次序排列起来,这就是序列的最大特征),因此,就有很多类似的地方。如刚才演示的索引和切片,是非常一致的。 ~~~ >>> lang = "python" >>> lang.index("y") 1 >>> lst = ['python','java','c++'] >>> lst.index('java') 1 ~~~ 在前面讲述字符串索引和切片的时候,以及前面的演示,所有的索引都是从左边开始编号,第一个是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]`就没有遵守这个规则,返回的是一个空。 ## [](https://github.com/qiwsir/StarterLearningPython/blob/master/111.md#反转)反转 这个功能作为一个独立的项目提出来,是因为在编程中常常会用到。通过举例来说明反转的方法: ~~~ >>> 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' ~~~ 看官是否注意到,上述不管是str还是lst反转之后,再看原来的值,没有改变。这就说明,这里的反转,不是在“原地”把原来的值倒过来,而是新生成了一个值,那个值跟原来的值相比,是倒过来了。 这是一种非常简单的方法,虽然我在写程序的时候常常使用,但是,我不是十分推荐,因为有时候让人感觉迷茫。python还有另外一种方法让list反转,是比较容易理解和阅读的,特别推荐之: ~~~ >>> 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'] ~~~ 很好,很强大,特别推荐使用。 ## [](https://github.com/qiwsir/StarterLearningPython/blob/master/111.md#对list的操作)对list的操作 任何一个行业都有自己的行话,如同古代的强盗,把撤退称之为“扯乎”一样,纵然是一个含义,但是强盗们愿意用他们自己的行业用语,俗称“黑话”。各行各业都如此。这样做的目的我理解有两个,一个是某种保密;另外一个是行外人士显示本行业的门槛,让别人感觉这个行业很高深,从业者有一定水平。 不管怎么,在python和很多高级语言中,都给本来数学角度就是函数的东西,又在不同情况下有不同的称呼,如方法、类等。当然,这种称呼,其实也是为了区分函数的不同功能。 前面在对str进行操作的时候,有一些内置函数,比如s.strip(),这是去掉左右空格的内置函数,也是str的方法。按照一贯制的对称法则,对list也会有一些操作方法。 在讲述字符串的时候,提到过,所有的序列,都有几种基本操作。list当然如此。 ### [](https://github.com/qiwsir/StarterLearningPython/blob/master/111.md#基本操作)基本操作 * 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 列表lst还是前面的值 ~~~ >>> "python" in lst True >>> "c#" in lst False ~~~ * max()和min() 以int类型元素为例。如果不是,都是按照字符在ascii编码中所对应的数字进行比较的。 ~~~ >>> alst [1, 2, 3, 4, 5, 6] >>> max(alst) 6 >>> min(alst) 1 >>> max(lst) 'python' >>> min(lst) 'c++' ~~~ * cmp() 采用上面的方法,进行比较 ~~~ >>> lsta = [2,3] >>> lstb = [2,4] >>> cmp(lsta,lstb) -1 >>> lstc = [2] >>> cmp(lsta,lstc) 1 >>> lstd = ['2','3'] >>> cmp(lsta,lstd) -1 ~~~ ### [](https://github.com/qiwsir/StarterLearningPython/blob/master/111.md#追加元素)追加元素 ~~~ >>> a = ["good","python","I"] >>> a ['good', 'python', 'I'] >>> a.append("like") #向list中添加str类型"like" >>> a ['good', 'python', 'I', 'like'] >>> a.append(100) #向list中添加int类型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]. 从以上描述中,以及本部分的标题“追加元素”,是不是能够理解list.append(x)的含义呢?即将新的元素x追加到list的尾部。 列位看官,如果您注意看上面官方文档中的那句话,应该注意到,还有后面半句: 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),即得到list的长度,这个长度是指list中的元素个数。 >>> a ['good', 'python', 'I', 'like', 100, 3] >>> len(a) 6 >>> a[6:]=['xxoo'] >>> a ['good', 'python', 'I', 'like', 100, 3, 'xxoo'] ~~~