[关闭]
@yanglt7 2018-11-14T03:25:39.000000Z 字数 2647 阅读 627

Python09_切片和迭代

Python


切片

取一个list或tuple的部分元素,取前N个元素,也就是索引为0-(N-1)的元素,有三种方法。

最笨的:

  1. >>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
  2. >>> [L[0], L[1], L[2]]
  3. ['Michael', 'Sarah', 'Tracy']

可以用循环:

  1. >>> r = []
  2. >>> n = 3
  3. >>> for i in range(n):
  4. ... r.append(L[i])
  5. ...
  6. >>> r
  7. ['Michael', 'Sarah', 'Tracy']

切片:

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

L[0:3]表示,从索引0开始取,直到索引3为止,但不包括索引3。

如果第一个索引是0,还可以省略:

  1. >>> L[:3]
  2. ['Michael', 'Sarah', 'Tracy']

支持倒数切片:倒数第一个元素的索引是-1。

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

创建0-99数列:

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

只写[:]就可以原样复制一个list:

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

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

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

所有数,每5个取一个:

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

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

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

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

  1. >>> 'ABCDEFG'[:3]
  2. 'ABC'
  3. >>> 'ABCDEFG'[::2]
  4. 'ACEG'

迭代

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

在Python中,迭代是通过for ... in来完成的,Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上。只要是可迭代对象,无论有无下标,都可以迭代,比如dict就可以迭代:

  1. >>> d = {'a': 1, 'b': 2, 'c': 3}
  2. >>> for key in d:
  3. ... print(key)
  4. ...
  5. a
  6. c
  7. b

因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。

默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。

  1. >>> d = {'a': 1, 'b': 2, 'c': 3}
  2. >>> for value in d.values():
  3. ... print(value)
  4. ...
  5. a
  6. c
  7. b
  8. >>> d = {'a': 1, 'b': 2, 'c': 3}
  9. >>> for kv in d.items():
  10. ... print(k,v)
  11. ...
  12. a
  13. c
  14. b

由于字符串也是可迭代对象,因此,也可以作用于for循环:

  1. >>> for ch in 'ABC':
  2. ... print(ch)
  3. ...
  4. A
  5. B
  6. C

判断一个对象是可迭代对象,方法是通过collections模块的Iterable类型判断:

  1. >>> from collections import Iterable
  2. >>> isinstance('abc', Iterable) # str是否可迭代
  3. True
  4. >>> isinstance([1,2,3], Iterable) # list是否可迭代
  5. True
  6. >>> isinstance(123, Iterable) # 整数是否可迭代
  7. False

Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身:

  1. >>> for i, value in enumerate(['A', 'B', 'C']):
  2. ... print(i, value)
  3. ...
  4. 0 A
  5. 1 B
  6. 2 C

上面的for循环里,同时引用了两个变量,在Python里是很常见的,比如下面的代码:

  1. >>> for x, y in [(1, 1), (2, 4), (3, 9)]:
  2. ... print(x, y)
  3. ...
  4. 1 1
  5. 2 4
  6. 3 9

迭代器

可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如list、tuple、dict、set、str等;

一类是generator,包括生成器和带yield的generator function。

这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。

可以使用isinstance()判断一个对象是否是Iterable对象:

  1. >>> from collections import Iterable
  2. >>> isinstance([], Iterable)
  3. True
  4. >>> isinstance({}, Iterable)
  5. True
  6. >>> isinstance('abc', Iterable)
  7. True
  8. >>> isinstance((x for x in range(10)), Iterable)
  9. True
  10. >>> isinstance(100, Iterable)
  11. False

可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。

可以使用isinstance()判断一个对象是否是Iterator对象:

  1. >>> from collections import Iterator
  2. >>> isinstance((x for x in range(10)), Iterator)
  3. True
  4. >>> isinstance([], Iterator)
  5. False
  6. >>> isinstance({}, Iterator)
  7. False
  8. >>> isinstance('abc', Iterator)
  9. False

生成器都是Iterator对象,但list、dict、str虽然是Iterable,却不是Iterator。

把list、dict、str等Iterable变成Iterator可以使用iter()函数:

  1. >>> isinstance(iter([]), Iterator)
  2. True
  3. >>> isinstance(iter('abc'), Iterator)
  4. True
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注