Python学习(五)高级特性(切片、迭代、列表生成式、生成器、迭代器)、模块介绍

一、高级特性

掌握了 Python 的数据类型、语句和函数,基本上就可以编写出很多有用的程序了。

比如构造一个 1, 3, 5, 7, ..., 99 的列表,可以通过循环实现:

L = []
n = 1
while n <= 99:
    L.append(n)
    n = n + 2

取 list 的前一半元素,也可以通过循环实现。但是在 Python 中,代码不是越多越好,而是越少越好。代码不是越复杂越好,而是越简单越好

基于这一思想,我们来介绍 Python 中非常有用的高级特性,1行代码能实现的功能,绝不写 5 行代码。请始终牢记,代码越少,开发效率越高。

1.1 切片

取一个 list 或 tuple 的部分元素是非常常见的操作。比如,一个 list 如下:

>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']

取前 3 个元素,应该怎么做?按照我们已经掌握的做法可以这样实现:

>>> [L[0], L[1], L[2]]
['Michael', 'Sarah', 'Tracy']

如果要取前 N 个元素,我们可以用循环,也就是索引为 0~(N-1) 的元素:

>>> r = []
>>> n = 3
>>> for i in range(n):
...  r.append(L[i])
...
>>> r
['Michael', 'Sarah', 'Tracy']

对这种经常取指定索引范围的操作,用循环十分繁琐。前面我们在 “字符串” 的数据类型中讲过一种 切片(Slice) 操作,它不仅可以用于字符串,也可以用于 list 类型,能大大简化操作步骤。我们来回顾一下:

  • 切片(slice):语法为 [ 起始 : 结束 : 步长],选取的区间为 “左闭右开”。“起始” 为空,则默认从头开始;“结束” 为空,则默认一直到结尾;步长为空,则默认为1。

对应上面的问题,取前 3 个元素,用一行代码就可以完成切片:

>>> L[0:3] # 这里省略了步长,默认为1
['Michael', 'Sarah', 'Tracy']
  • L[0:3] 表示,从索引 0 开始取,知道索引 3 为止,但不包括索引 3。即索引 0、1、2,刚好前 3 个元素。

如果切片的起始索引是 0,还可以省略:

>>> L[:3] # 起始索引默认为0
['Michael', 'Sarah', 'Tracy']

也可以从索引 1 开始,取出 2 个元素出来:

>>> L[1:3]
['Sarah', 'Tracy']

类似的,既然 Python 支持 L[-1] 取倒数第一个元素,那么它同样支持倒数切片,如下所示:

>>> L[-2:]
['Bob', 'Jack']
>>> L[-2:-1]
['Bob']

记住:倒数第一个元素的索引是 -1

切片操作十分有用。我们先创建一个 0~99 的数组:

>>> L = list(range(100))
>>> L
[0, 1, 2, 3, ..., 99]

可以通过切片轻松取出某一段数列,比如前 10 个数:

>>> L[:10]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

后 10 个数:

>>> L[-10:]
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]

取前 11~20 个数:

>>> L[10:20]
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

前10个数,每两个取一个:

>>> L[:10:2]
[0, 2, 4, 6, 8]

所有数,每5个取一个:

>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]

甚至什么都不写,只写 [:] 就可以原样复制一个 list:

>>> L[:]
[0, 1, 2, 3, ..., 99]

由于 tuple 也是一种 list,唯一区别是 tuple 不可变。因此,tuple 也可以用取片操作,只是操作的结果仍是 tuple:

>>> (0, 1, 2, 3, 4, 5)[:3]
(0, 1, 2)

其实字符串也可以看成是一种 list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串:

>>> 'ABCDEFG'[:3]
'ABC'
>>> 'ABCDEFG'[::2]
'ACEG'

在很多编程语言中,针对字符串提供了很多各种截取函数(例如,substring),其实目的就是对字符串切片。Python没有针对字符串的截取函数,只需要切片一个操作就可以完成,非常简单。

1.2 迭代

如果给定一个 list 或 tuple,我们可以通过 for 循环来便利这个 list 或 tuple,这种遍历我们称为 迭代(Iteration)

在 Python 中,迭代是通过 for ... in 来完成的,而很多语言比如 C语言,迭代 list 是通过下标完成的,如下所示:

for (i = 0; i < length; i++) {
   
    n = list[i];
}

可以看出,Python 的 for 循环抽象程度要高于 C语言。因为 Python 的 for 循环不仅可以用在 list 或 tuple 上,还可以作用在其他可迭代对象上。

list 这种数据类型虽然有下标,但是很多其他数据类型是没有下标的。但是只要是可迭代对象,无论有无下标,都可以迭代,比如 dict 就可以迭代,如下所示:

>>> d = {
   'a': 1, 'b': 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不愿放下技术的小赵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值