切片
详情看list中的切片
迭代
如果给定一个list或tuple,我们可以通过for循环来遍历这个list或tuple,这种遍历我们称为迭代(Iteration)
因为dict的存储不是按照list的方式顺序排列,所以,迭代出的结果顺序很可能不一样。默认情况下,dict迭代的是key。如果要迭代value,可以用for value in d.values(),如果要同时迭代key和value,可以用for k, v in d.items()。由于字符串也是可迭代对象。
列表生成器
生成列表
list(range(1,11))>>> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]# 表达式[x * x for x in range(1, 11)]>>> [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
生成器 (generator)
用处 : 通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个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
使用 生成器完成 斐波那契数列 (注意里面的数值交换)
def fib(max):n, a, b = 0, 0, 1while n < max:yield ba, b = b, a + bn = n + 1return 'done'
在generator 函数中;
- 程序遇到yield 就会停止运行,并把值存贮在内存中;等待下一次调用;如果遇到rentun 则会停止;继续调用会报**
StopIteration**的错误 - 可以只用 for in 循环自动调用next()方法;但不会获取 return的值
- next() 使用next 可以获取下一次的 yield 返回值
- send()可以强行修改上一个yield表达式值。
**
迭代器 (Iterator)
我们已经知道,可以直接作用于for循环的数据类型有以下几种:
- 一类是集合数据类型,如
list、tuple、dict、set、str等; - 一类是
generator,包括生成器和带yield的generator function。
这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。可以使用isinstance()判断一个对象是否是Iterable对象:
而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
小结
- 凡是可作用于
for循环的对象都是Iterable类型; - 凡是可作用于
next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列; - 集合数据类型如
list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。
