python-切片 迭代 生成器

1 切片操作

>>> L
['aaa', 'bbb', 'ccc', 'ddd']
>>> L[0:3]
['aaa', 'bbb', 'ccc']
>>> L[::5]
[0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95]
0-100的所有数字,每5个取一个
View Code

2 迭代操作 只要有可迭代对象就可以迭代

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

对字典进行迭代 默认迭代键 如果要迭代值,可以选用下面代码

1 >>> d
2 {'a': 1, 'c': 3, 'b': 2}
3 >>> for values in d.itervalues():
4 ...     print values
5 ...
6 1
7 3
8 2
View Code
d.itervalues()返回一个字典值的可迭代对象
同时迭代键和值:
1 >>> for k, v in d.iteritems():
2 ...     print k, v
3 ...
4 a 1
5 c 3
6 b 2
View Code

2.1 判断可迭代对象

1 >>> from collections import Iterable
2 >>> isinstance(d.iteritems(), Iterable)
3 True
View Code
2.3 enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
1 >>> for i, v in enumerate(['a', 'b', 'c']):
2 ...     print i, v
3 ...
4 0 a
5 1 b
6 2 c
View Code

2.4 列表生成式

1 >>> [x*x for x in range(1, 11)]
2 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
3 需要生成的x*x元素放在前面
View Code
3 生成器
生成列表的过程中是根据计算公式,边计算边生成,而不是一次生成
3.1 只要把一个列表生成式的[]改成(),就创建了一个generator
1 >>> L = [x*x for x in range(10)]
2 >>> L
3 [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
4 列表生成式和生成器对比
5 >>> g = (x*x for x in range(10))
6 >>> g
7 <generator object <genexpr> at 0x7f87935774b0>
View Code

通过生成器的next()方法可以很方便的生成后续元素,全部打印需要使用for循环变量

 1 >>> g.next()
 2 0
 3 >>> g.next()
 4 1
 5 >>> g.next()
 6 4
 7 >>> g.next()
 8 9
 9 >>> for n in g:
10 ...     print n
11 ...
12 16
13 25
14 36
15 49
16 64
17 81
View Code
3.2 通过yield也可以使用生成器函数
如下通过yield生成一个生成器函数
1 >>> def fib(max):
2 ...     n, a, b = 0, 0, 1
3 ...     while(n < max):
4 ...             yield b
5 ...             a, b = a, a + b
6 ...             n = n + 1
7 ...
8 >>> fib(6)
9 <generator object fib at 0x7f8793577aa0>
View Code
生成器函数和普通函数执行不同,生成器函数每往生成一次,就会从上一次yield处执行
代码实例如下:
 1 >>> def odd():
 2 ...     print 'step 1'
 3 ...     yield 1
 4 ...     print 'step 2'
 5 ...     yield 2
 6 ...     print 'step 3'
 7 ...     yield 3
 8 ...
 9 >>> o = odd()
10 >>> o.next()
11 step 1
12 1
13 >>> o.next()
14 step 2
15 2
16 >>> o.next()
17 step 3
18 3
View Code
 
原文地址:https://www.cnblogs.com/flex-/p/5549198.html