辨析可迭代对象,迭代器,容器,生成器,序列
一 容器
container
特点:
1. 可以存放多个数据
2. 可以存放多种数据
3. 支持in/not in操作
list,tuple,dict,set,str,frozenset q
ueue(队列) pipe(管道)
defaultdict,ordereddict,namedtuple
容器是不存在的
二 可迭代对象
iterable
1. 可迭代对象是不存在的
2. 拥有迭代器的对象就是可迭代对象
三 迭代器
iterator
1. 本身就是一个可迭代对象
2. iter():
从可迭代对象中获取它的迭代器
3. next():
从迭代器中获取下一个元素
原理:游标最开始在迭代器第一个元素的前面,每次调用next() 游标向后挪动一个单位,并且将游标划过 的元素返回
如果游标已经在迭代器的最后一个元素之后,再调用next,抛出异常:StopIteration
4. 任何实现了__next__() 方法和__iter__() 的对象都是迭代器
next()函数的底层调用迭代器的__next__()方法
iter()函数的底层调用迭代器的__iter__()方法
# next() # 从迭代器中获取下一个元素
# iter() # 从可迭代对象中获取它的迭代器
l=[1,2,3,4]
# a=iter(l) # a是列表的迭代器
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# a=l.__iter__()
# print(a.__next__())
# print(a.__next__())
# print(a.__next__())
# print(a.__next__())
a=iter(l)
# a2=iter(a)
# print(a)
# print(a2)
for i in a:
print(i)
四 生成器
generator
创建形式:
1. 生成式:
生成器推导式
(i for i in range(10))
2. 利用关键字:yield(生产)
函数中如果有yield关键字,该函数的调用就不再是函数的返回值,而返回的是一个生成器对象
函数本身不变
3. 生成器是一个特殊的迭代器
支持next函数
4. 生成器是一个可迭代对象
支持遍历
# a=(i for i in range(10))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# print(next(a))
# for i in a:
# print(i)
def fun():
a=0
while 1:
yield a
a+=1
if a==10:
raise StopIteration()
print(fun)
a=fun()
# print(next(a))
for i in a:
print(i)
五 序列
sequence
是不存在的
1. 支持下标操作
2. 支持切片操作