.。。。。。。。
分类: Python/Ruby
2018-11-16 23:11:08
可迭代对象
容器:container
可迭代对象:iterable
迭代器:iterator
生成器:generator
字符串,列表,元组,集合,字典
容器
容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个的迭代获取
特点:可以通过 in /not in 成员关系操作符 检测元素是否在容器之内
常见的容器类型:
list,str,tuple,set,dict,frozenset
成员关系(in/not in) 并不是容器本身的性质---迭代对象
>>> d={'one':1,'two':2}
>>> type(d)
>>> 'one' in d
True
>>> 1 in d
False
>>> 1 in d.values()
True
可迭代对象
很多容器都是可迭代对象
拥有迭代器的对象则为可迭代对象
>>> l=[1,2,3]
>>> iter(l) #获取迭代器
>>> a=iter(l)
>>> a
>>> for i in a:
print(i)
1
2
3
迭代器
例子引入迭代器:
>>> l=[1,2,3]
>>> a=iter(l)
>>> next(a)
1
>>> next(a)
2
>>> next(a)
3
>>> next(a)
StopIteration
>>> next(l)
TypeError: 'list' object is not an iterator
iterator
是一个带状对象,它能在调用next()的时候返回容器的下一个值
任何实现了__iter__() 和__next__() 的对象都是迭代器
iter()--- __iter__()
next()--- __next__()
>>> l=[1,2,3]
>>> a=l.__iter__()
>>> a.__next__()
1
>>> a.__next__()
2
>>> a.__next__()
3
>>> a.__next__()
StopIteration
python中for循环可以捕获异常:
>>> for i in l:
print(i)
1
2
3
生成器
generator
是一种特殊的迭代器(生成器一定是迭代器)
不需要实现__iter__()和 __next__()
可以使用next()函数进行调用
创建:
1. yield
def fib():
a,b=0,1
while True:
yield b # 有yiled的函数是生成器
a,b=b,a+b
a=fib()
print(next(a))
print(next(a))
print(next(a))
print(next(a))
print(next(a))
2. 生成器表达式(生成式)
l=(i for i in range(10)) #生成器
小结:
1. 容器:是一系列元素的集合体:str、list、set、dict、tuple… 可以使用in/not in 查看是否存在
2. 可迭代对象:拥有迭代器的对象则为可迭代对象:调用__iter__() 可以返回一个迭代器---不一定可以使用next()
3. 迭代器:实现了__iter__()和__next__() 方法的对象则为迭代器
4. 生成器:特殊的迭代器--1.yield关键字 2. 生成器表达式