1 切片
语法形式:L[start:stop:step]
start 和 stop 是列表下标,包含 start 下标的元素,不包含 stop 下标的元素(左闭右开),step 是步进,即每次取元素的步长,默认值是 1。
e.g.
>>> L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']
>>> L[0:3]
['Michael', 'Sarah', 'Tracy']
>>> L[-2:]
['Bob', 'Jack']
>>> L = range(100)
>>> L
[0, 1, 2, 3, ..., 99]
>>> L[:10:2]
[0, 2, 4, 6, 8]
2 迭代
如果给定一个list或tuple,我们可以通过for
循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)。
- Python的for循环不仅可以用在list或tuple上,还可以作用在其他可迭代对象上,如
dict
。 - 默认情况下,dict迭代的是key。如果要迭代value,可以用
for value in
如果要同时迭代key和value,可以用
d.itervalues(),for k, v in d.iteritems()。
- 任何可迭代对象都可以作用于
for
循环,包括我们自定义的数据类型,只要符合迭代条件,就可以使用for
循环。
3 列表生成式
列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式。
要生成[1x1, 2x2, 3x3, ..., 10x10]
,方法一是循环,另一种更简单的方法便是用用列表生成式生成,如下:
>>> [x * x for x in range(1, 11)] #for循环后面还可以加上if判断条件进行限制
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
还可以使用两层循环生成全排列:
>>> [m + n for m in 'ABC' for n in 'XYZ']
['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
运用列表生成式,可以快速生成list,可以通过一个list推导出另一个list,而代码却十分简洁。
4 生成器
在Python中,为了生成大型列表时节省内存空间,采用一边循环一边计算的机制,称为生成器(Generator)。
产生生成器一般有两种方法:
1.第一种方法很简单,只要把一个列表生成式的[]
改成()
,就创建了一个generator:
>>> L = [x * x for x in range(10)]
>>> L
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> g = (x * x for x in range(10))
>>> g
<generator object <genexpr> at 0x104feab40>
generator保存的是算法,可以使用next()
方法计算得到每一个元素,但更常用的是使用for
循环,因为generator也是可迭代对象:
>>> g = (x * x for x in range(10))
>>> for n in g:
... print n
...
0
1
4
9
16
25
36
49
64
81
2. 定义generator的另一种方法是在定义时用yield
返回结果。
generator和函数的执行流程不一样。函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()
的时候执行,遇到yield
语句返回,再次执行时从上次返回的yield
语句处继续执行(有点像函数中断)。
e.g.
>>> def odd():
... print 'step 1'
... yield 1
... print 'step 2'
... yield 3
... print 'step 3'
... yield 5
...
>>> o = odd()
>>> o.next()
step 1
1
>>> o.next()
step 2
3
>>> o.next()
step 3
5
>>> o.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration #执行3次yield后,已经没有yield可以执行了,所以,第4次调用next()就报错。
要理解generator的工作原理,它是在for
循环的过程中不断计算出下一个元素,并在适当的条件结束for
循环。对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for
循环随之结束。