目录
1. 切片
取指定索引范围内的元素,使用切片能大大简化操作。
>>> L=['Tom','Jack','Bob']
>>> L[0:2] # 取前两个元素,即从索引0开始,直到索引2为止,但不包括索引2
['Tom', 'Jack']
# 也可省略0,如:
>>> L[:2]
['Tom', 'Jack']
# 从索引1开始,索引2为止
>>> L[1:2]
['Jack']
# 索引支持从倒数开始
>>> L[-2:]
['Jack', 'Bob']
>>> L[-2:-1]
['Jack']
# 前10个数每两个取1个
>>> L=list(range(100))
>>> L[:10:2]
[0, 2, 4, 6, 8]
# tuple也可用切片操作,只是操作的结果仍是tuple
>>> (0,1,2,3,4,5)[:3]
(0, 1, 2)
# 字符串也可用切片操作,只是操作的结果仍是字符串
>>> 'ABCDEFG'[::2]
'ACEG'
2. 迭代
2.1 迭代的定义
给定一个 list 或 tuple ,通过 for 循环来遍历这个 list 或 tuple ,这种遍历称为迭代,例如:
>>> d={'a':1,'b':2,'c':3}
>>> for key in d:
... print(key)
...
a
b
c
dict 的存储并不是按照 list 的方式顺序排列,所以迭代出的结果顺序有时会不一样。
默认情况下, dict 迭代的是 key 。如果要迭代 value ,可以用 for value in d.values() 。如果要同时迭代 key 和 value ,可以用 for k,v in d.items() 。
如果要对 list 实现类似 Java 那样的下标循环,可用 enumerate 函数:
>>> for i,value in enumerate(['A','B','C']):
... print(i,value)
...
0 A
1 B
2 C
2.2 如何判断一个对象是可迭代对象
可直接作用于 for 循环的对象统称为可迭代对象: Iterable 。
可通过 collections.abc 模块的 Iterable 类型判断一个对象是否为可迭代对象:
>>> from collections.abc import Iterable
>>> isinstance('abc',Iterable) # 判断str是否可迭代
3. 列表生成式
# 计算1~10以内的数字平方和
>>> [x*x for x in range(1,11)]
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
写列表生成式时,要把生成的元素放到前面,后面跟 for 循环,就可以把 list 创建出来。
# 可加if判断
>>> [x*x for x in range(1,11) if x%2==0]
[4, 16, 36, 64, 100]
# 可使用两层循环生成全排列
>>> [m+n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
# 可使用两个变量来生成list
>>> d={'x':'A','y':'B','z':'C'}
>>> [k+'='+v for k,v in d.items()]
['x=A', 'y=B', 'z=C']
# 可把一个list中所有的字符串变成小写
>>> L=['Hello','WORLD']
>>> [s.lower() for s in L]
['hello', 'world']
!在一个列表生成式中, for 前面的 if ... else 是表达式,而 for 后面的 if 是过滤条件,不能带 else 。
4. 生成器
在循环过程中不断推算出后续的元素。这种一边循环一边计算的机制,称为生成器: generator 。
要创建一个 generator 有很多方法,其中最简单的一种是把一个列表生成式的 [ ] 改成 () ,就创建了一个 generator ,generator 函数的调用实际返回一个 generator 对象:
>>> g=(x*x for x in range(10))
>>> g
<generator object <genexpr> at 0x000001969E88A7A0>
# 如果要一个个打印出来,可用循环迭代出来
>>> for n in g:
... print(n)
...
0
1
4
9
16
25
36
49
64
81
如果推算的算法比较复杂,用循环无法实现时,可用函数来实现。如斐波拉契数列,除第一个和第二个数外,任意一个数都可由前2个数相加得到:
>>> def fib(max):
... n,a,b=0,0,1
... while n<max:
... print(b)
... a,b=b,a+b
... n=n+1
... return 'done'
...
>>> fib(6)
1
1
2
3
5
8
'done'
要把 fib 函数变成 generator 函数,只需把 print(b) 改为 yield b 就可以了。然后用循环依次迭代出数列。
>>> def fib(max):
... n,a,b=0,0,1
... while n<max:
... yield b
... a,b=b,a+b
... n=n+1
... return 'done'
...
>>> for n in fib(6):
... print(n)
...
1
1
2
3
5
8
然而用 for 循环发现拿不到 generator 的返回值,这就需要捕获错误,至于如何捕获错误,我会在后续的章节里提到!
5. 迭代器
可以被 next() 函数调用并不断返回下一个值的对象称为迭代器: Iterator ,可表示为一个无限大的数据流。
可用 isinstance() 判断一个对象是否是 Iterator 对象:
>>> from collections.abc import Iterator
>>> isinstance([],Iterator)
False
* 生成器都是 Iterator 对象,list 、dict 、str 虽然是 Iterable ,却不是 Iterator 。
把 list 、dict 、str 等 Iterable 变成 Iterator 可使用 iter() 函数:
>>> isinstance(iter([]),Iterator)
True
Python高级特性的学习就先到这里了,我们下期见!