Python学习笔记(四)

python 的一些高级特性

切片

取一个 list 或 tuple 的部分元素是非常常见的操作。比如,我们要取出一个 list 的前 3 个元素

1
2
>>>L = ['Michael', 'Sarah', 'Bob', 'Jack']
>>>L1 = [L[0], L[1], L[2]]

但是我们要取前 N 个元素,怎么办,可以用循环,但我们有更好的办法。Python 提供了切片(Slice)操作符,L[0:3]表示,从索引 0 开始取,直到索引 3 为止,但不包括索引 3。即索引 0,1,2,正好是 3 个元素。
如果第一个索引是 0,还可以省略。而且也支持负数,记住倒数第一个元素的索引是-1。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
>>> 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]
# 前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
字符串’xxx’也可以看成是一种 list,每个元素就是一个字符。因此,字符串也可以用切片操作,只是操作结果仍是字符串

迭代

如果给定一个 list 或 tuple,我们可以通过 for 循环来遍历这个 list 或 tuple,这种遍历我们称为迭代(Iteration)
Python 的 for 循环不仅可以用在 list 或 tuple 上,还可以作用在其他可迭代对象上,只要是可迭代对象,无论有无下标,都可以迭代,比如 dict 就可以迭代。默认情况下,dict 迭代的是 key。如果要迭代 value,可以用 for value in d.values(),如果要同时迭代 key 和 value,可以用 for k, v in d.items()。由于字符串也是可迭代对象,因此,也可以作用于 for 循环。如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 迭代dict
>>>d = {'a': 1, 'b': 2, 'c': 3}
>>>for key in d:
... print(key)
...
b
c
a
# 迭代dict的value
>>>for value in d.values():
... print(value)
...
2
3
1
# 迭代key和value
>>>for key, value in d.items:
... print(key, value)
...
b 2
c 3
a 1
# 迭代字符串
>>>s = 'string'
>>>for w in s:
... print w
...
s
t
r
i
n
g

那么,如何判断一个对象是可迭代对象呢?方法是通过 collections 模块的 Iterable 类型判断。如:

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

还有一个问题,如果需要在循环中使用索引怎么办?Python 内置的 enumerate 函数可以把一个 list 变成索引-元素对,这样就可以在 for 循环中同时迭代索引和元素本身,如:

1
2
3
4
5
6
7
8
9
10
11
12
13
>>> for i, value in enumerate(['A', 'B', 'C']):
... print(i, value)
...
0 A
1 B
2 C
# 同时引用了两个变量
>>> for x, y in [(1, 1), (2, 4), (3, 9)]:
... print(x, y)
...
1 1
2 4
3 9

[越努力,越幸运!]