切片
1 | In [3]: l = list(range(100)) |
list切片
1 | In [1]: l = ['apple', 'google', 'facebook', 'microsoft', 'linkin'] |
tuple切片
1 | In [13]: (0, 1, 2, 3, 4, 5)[:3] |
str切片
1 | In [14]: 'apple'[:3] |
迭代
在Python中迭代是通过for ... in ...
来实现的
1 | In [15]: d = {'apple':'pages', 'google':'docs', 'microsoft':'word'} |
列表、元组、字典和字符串都是可迭代对象
判断一个对象是否是可迭代对象,通过collections模块的Iterable来判断
1 | In [22]: from collections import Iterable |
enumerate
Python内置的enumerate函数可以把一个list变成索引-元素对,这样就可以在for循环中同时迭代索引和元素本身
1 | In [27]: for i, value in enumerate(['A', 'B', 'C']): |
列表生成式
列表生成式有自己的特殊语法
把要生成的元素放到最前面
,后跟for
循环,就可以创建一个list
1 | n [29]: [i * i for i in range(1,10)] |
生成器(yield)
生成器返回一个可迭代的对象
生成器的关键字yield
,与return
的区别是
return 立即返回结果并结束函数
yield 返回结果并暂停函数,等待
next()
的下一次调用
1 | In [1]: def my_fun(): |
上面介绍的列表生成式
也可以变成生成器生成式
只需把中括号
换成小括号
就变成了一个生成器
1 | In [11]: L = [x * x for x in range(10)] |
生成器保存的是算法,在使用时计算结果,节省内存空间
迭代器
可以直接作用于for
循环的数据类型有以下几种:
集合数据类型。如
list
tuple
dict
set
str
等generator,包括生成器和带yield的generator function
这些可以直接作用于for
循环的对象统称为可迭代对象Iterable
可以使用isinstance()
判断一个对象是否是Iterable
可迭代对象
1 | In [20]: from collections import Iterable |
生成器不但可以作用于for
循环,还可以被next()
函数不断调用并返回下一个值,最后抛出StopIteration
异常,表示已经结束,无法返回下一个值
可以被next()
函数调用并不断返回下一个值的对象称为迭代器:Iterator
可以使用isinstance()
判断一个对象是否是Iterator
对象
1 | In [24]: from collections import Iterator |
Iterator 和 Iterable的区别
生成器都是Iterator对象,但
list
dict
等是Iterable,但不是IteratorIterator是迭代器,需要同时具备
__iter__
和next
两个方法,它们表示一个惰性计算的序列Iterable是可迭代对象,列表元组等数据结构同样是可迭代对象,具备
__iter__
方法,但不具备next
方法
使用for循环遍历可迭代对象时,for循环自动调用next()函数,并在接收到结束异常时退出循环