首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

一串鱼蛋——列表

到目前为止,我们已经学了三四种数据类型:整数、浮点数、布尔、None。可是单独使用它们,其实并没有什么意义。怎么才能把它们有效地组织起来呢?Python 给我们提供了几种组织数据的方法。上一次的分享列举了列表、元组、字典等等。这一次分享我们来介绍一下列表。

为了让列表能装下更多东西,我们先再介绍一种数据类型。(小叮当你耍我呢!)

初识字符串

对,这种数据类型就是字符串(string)。字符串这个数据类型是一个很大的坑,在 Python 2.x 和 3.x 的实现完全不同。不过,我们先把这种区别留到以后讨论。在本次分享中提到的字符串都以 Python 3.x 为基础。

字符串的构成是怎样的呢?简单说来,就是引号包裹内容。可是引号也有很多种啊,有单引号、双引号还有全角引号,在 Python 中还有三个引号的。为了讨论方便,我们先把这些区别放在一边。只需要记住,在一个字符串中,只使用半角单引号或只使用半角双引号都可以。

可以看到,只使用半角单引号、只使用半角双引号来表示字符串是可以的,但是一旦出现了全角引号,或者将单双引号混用,就无法正确表示字符串啦!字符串这个词的字面意思,就是把“字符”串起来。咦,莫名触动了小叮当饥饿的神经:

是的,你可以将“字符串”理解成一串鱼蛋,每一颗鱼蛋,就是一个字符(character)。关于这个数据类型,我们以后还会深入讨论的。说到这里就够啦。

现在可以让我们今天的主角——列表(list)出场啦。

列表

初识列表

看完上次的分享,大家应该对列表的结构有一些印象,简单说来,就是用半角中括号 框起,半角逗号 分隔。其实在代码里面,一切标点符号都是半角的,原因很简单,因为计算机是外国人发明的,外国人不使用全角符号……所以,如果你的代码出现了 错误,有可能就是粗心把符号打成了全角的哦。下面展示几个列表的例子。

还记得工厂函数这个概念吗?第一个箭嘴行中的 原来是一个元组,硬是通过工厂函数 转化成了一个列表,而空列表的表示方式,可以是 也可以是 。基于底层代码实现的原因,使用 比 快。

细心的同学应该能发现,列表几乎什么都能装。第二个箭嘴行都装整数,第三个箭嘴行都装浮点数。所以,理论上一个列表能装不同类型的数据。这不,第个箭嘴行不是装了布尔型和整数吗?那,第三个箭嘴行呢?列表竟然装了两个自己!这种 666 的操作,叫做二维列表 (2D list)。二维列表有啥用?稍微格式化一下,就能看出来。

有一场吃鱼蛋比赛,三局两胜制,第一位选手在三场比赛中分别吃了 90、80、和 89 颗,第二位分别吃了 25、 188、260 颗。那么我们就可以用这样的二维列表把这几个数据储存起来啦。是不是顿时觉得可以抛弃 Excel 了?说句题外话,微软最近在考虑把 Python 嵌入 Excel 中作为一种官方语言哦,Python 是不是一座很大的碉堡呢!

以此类推,还有三维列表、四维列表……不过这些结构比较少用,知道一下就好啦。

第四个箭嘴行呢?看出这是两种不同的类型了吗? 是字符串, 是整数, 是字符串(虽然只有一颗鱼蛋,但习惯上还是称“串”)。理论上,列表是可以存放不同类型的数据的!但是鉴于列表是可以被修改的,修改前和修改后会发生变化,假如获得数据的方式不变的话,就会乱套了哦!所以一般不这么做。

如上例,假设小叮当用一个列表表示一串鱼蛋的信息,它的名字叫 ,有 颗,味道是 。用 这个下标可以获得数量这个信息。忽然之间,很想把鱼蛋和咖喱一起吃最好吃的这个事实放进列表里,于是在第 个(注意用的是 “” 而不是“一”)元素之前增加了 这个字符串,可是再去访问 的时候,却发现得出的是 是鱼蛋的最佳搭配,而不是数量。如果代码这么写,就会出问题啦。

列表的长度 len()、索引 [N] 与切片 [a:b:c]

列表是有长度的,用内置函数 可求出。列表的元素是有顺序的,用中括号 可以获得某个序号下的元素。

高级的程序员/媛有时会被称为“怪客”(geek),“怪”得连数数的方式都不一样。人们一般从 1 开始数,但是大部分程序员/媛是从 0 开始数的。

看上面的例子,有个列表叫 , 能获取到第一个元素 ,这个 我们叫“索引”(index)

从 0 开始数这个习惯是从古老的 C 语言流传下来的,其原因说起来很简单,因为计算机的内存可以理解为一段多个二进制盒子组成的、连续的容器,假如让这段容器装 1、0 这两个二进制数,且容器的开始地址是 a,那么 a + 0 这个地址装的就是第一个元素 1 , a + 1 这个地址装的就是第二个元素 0 。所谓的地址开头,其实就是第一个元素所在的位置,a + 0 可以看作从 a 开始,偏移 0 个格子得到的数据。a + 1 可以看作从 a 开始,偏移 1 个格子得到的数据。这个格子的大小视乎数据的二进制大小而定。为了把寻址和索引联系起来,干脆就用 来代表第一个元素啦。以后如果要寻找列表 的第 个元素,记得用 来表示哦。

虽然 Python 中列表的实际实现与 C 有差别,但是原理是相通的。

除了正数索引之外,还可以用负数索引哦。

这个比较好理解:下标 表示倒数第一个元素。有些同学可能会问,为什么不用 啊?因为 -0 == 0 啊!

超出列表数量的索引是啥?

以上两个例子不要看花眼了!第一个中括号是一个只有一个元素的列表,第二个中括号是它的下标!在第一个例子中,由于只有一个元素,最大的正索引值是 ,而 试图获取第三个元素,于是就报错了!第二个例子也是一样,由于列表 只有一个元素,绝对值最小的负索引值只能是, 会报错的!错误是 。

更复杂的来了!真正的 Python 索引,是三个参数,叫做分片(slice)。格式如下。

其英文分别是startstopstep。两个冒号前面的数值是开始,后面是结束,两个冒号之间的数值是步长

假设我们用一个包含字符串的列表,来表示一串 10 颗的鱼蛋。

先看看这串鱼蛋~从 到 ,这串鱼蛋一共有 10 颗。 表示开始是 0,结束是 2,从 一直到 ,不包括 。

同理, 从 () 到 (),不包括 。这种特性有点像数学中的左闭右开区间,[5, 8)。

第三个参数步长是什么意思呢?请看 的输出,首先取值的范围是 到 但是 不存在,所以退到 ,范围是 到 ,然后每次往前进两颗鱼蛋。得出来就是 0、2、4、6、8。要倒着数的时候,就必须以 作为开始,以 作为结束,往后退。

把结束和步长省略了,而结束的默认值是列表的最后一个,步长默认值是 1,所以等于从 开始一直数到列表最后。

把开始和步长省略了,开始的默认值就是列表的开始,所以等于从 一直数到 。

把开始和结束省略了,等于包含整个列表,然后从 开始,一直往前跳三颗鱼蛋。

把开始和结束省略了,等于包含整个列表,然后从 开始,一直往后跳三颗鱼蛋。

也就是说,无论开始和结束是正值还是负值,都可以先转成相对的正值计算,但是步长决定了是正着数还是倒着数。

itemgetter 与 slice

Python 中的 和 分别对应着索引和列表:

假设有一堆像 food 和 name 这样的三元素列表,都想获得它们的第二个参数(),就可以先把 赋值为 ,然后分别把 和 参数传进去,前提是导入了 itemgetter。(听起来比较少用……)

同样, :

这里需要记住一个问题:当 工厂函数只有一个参数时,这个参数是“结束”,如果是两个参数,就是“开始”与“结束”。不过和一样,都属于较少使用的函数……

python [文件] 命令运行代码

在这里再分享一种运行 Python 代码的方式。假设把代码写成文件 test.py ,放在了 D 盘的 PythonWork 目录下。

我们可以打开命令行(Macbook 是终端):

会弹出一个黑框框,它叫命令行。以下是黑框框中的代码

之后的红色代码才是你要输入的内容。每一行写好后敲回车。第一步的 命令是改变当前目录,相当于手动点开了 D 盘的 PythonWork 文件夹;第二步非 Windows 用户不需要做。第三步,就是输入 ,运行这个 py 文件。当然,如果你知道文件的路径,也可以在任何地方使用以下命令运行代码:

in 关键字运算符、 for 循环与 pass

有些时候,我们需要将列表的所有元素都列出来。假如列表的长度是 100,总不能把列表的所有下标都写出来吧……这会让人吐血的。那面对这种重复的工作时,应该怎么办呢?最好的解决方法,就是循环。Python 的循环有两种,一种是 循环,一种是 循环,这次我们先来看看 循环。

因为 循环需要缩进,使用了游标卡尺大法,所以小叮当决定新建一种代码表示方法。 符号之前的是写进文件的代码, 符号之后的是运行之后的结果。如果忘记了怎么保存文件和运行代码的话,可以使用刚刚提到的方法,也可以翻到前面的分享(第1-3期)去看哦,关注公众号并点击往期内容吧。

回到正题,请看以下的 关键字和 循环:

本来, 关键字的作用是判断元素是否在序列(列表是序列的一种)当中。因为字符串 在列表 中,所以返回的是 。如果要看看 是否不在 中,可以用 。

之后的 是一个换行符,其中 是转义字符,把后面的一个字符转变成其他意思,也就是说 必须放在一起理解,表示按下了回车,换了一行。其实在内置实现中,Windows 的换行是 Unix 系统里是,Mac系统里是 ,不过 Python 是跨平台的,会根据平台转换,无须担心,只需要记住 。

使用 关键字之后,相当于把每一个 的东西都拿出来赋值给 ,然后执行缩进之下的代码 , 自动换行。每循环一次,缩进之下的代码就会逐步运行。使用 Pycharm 可以追踪 的变动:

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180322G10LE500?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券