- 迭代器就是用来迭代取值的工具,单纯的重复并不是迭代
while True:
msg = input('>> ').strip()
print(msg)
View Code
-
#!/usr/bin/env python
# author:lijipeng
hobbies = ['sing','on foot','table tennis']
index = 0
while index < len(hobbies):
print(hobbies[index])
index+=1
#①:满足重复
#②:并且以每次重新赋值后的Index值作为下一次循环的索引进行取值,反复迭代
#最终可以取尽列表中所有的值
View Code
- 上述案例用到的是索引取值,那么对于字典、集合等没有索引的类型怎么取值呢,那么就必须要找到一种不依赖索引来进行迭代取值的方式,这就用到了迭代器。
- 可迭代对象:内置有__iter__方法的对象都是可迭代对象,比如字符串,列表、元组、字典、集合、打开的文件
- 迭代器对象:调用obj.iter()方法返回的就是一个迭代器对象。
- 迭代器对象内置有__iter__和__next__方法的对象。
- 执行迭代器对象的.iter()方法得到的仍然是迭代器本身,而执行迭代器.next()方法就会计算出迭代器的下一个值。
- 迭代器是Python提供的一种统一的不依赖于索引的迭代取值方式,只要存在多个值,无论是序列类型还是非序列类型都可以按照迭代器的方法取值。
-
#!/usr/bin/env python
# author:lijipeng
hobbies = ['sing','on foot','table tennis']
i = iter(hobbies) # 每次都需要重新获取一个迭代器对象
while True:
try:
print(next(i))
except StopIteration: # 捕捉异常,然后终止循环
break
for item in hobbies:
print(item)
# for循环的工作原理:
# ①、调用可迭代对象hobbies内置__iter__得到一个迭代器对象
# ②、调用迭代器对象内置的__next__得到一个值
# ③、将得到的值赋给item,执行循环体完成一次循环
# ④、一直到捕捉到StopIteration一场,结束迭代
View Code
- 基于索引的迭代取值,所有的迭代状态都保存到了索引中,基于迭代器的迭代取值,所有的迭代状态都保存在了迭代器中
- 迭代器优点:为序列和非序列的类型提供了一种统一的迭代取值方式;惰性计算:在需要的时候迭代器对象才会调用内置的__next__来计算出一个值,也就是说就迭代器本身来说,同一时刻在内存中只有一个值,因此可以存放无限大的数据流。对于列表、字典、元组等容器类型,需要把所有的元素都存放在内存中,受内存大小限制,可以存放的值是有限的。
- 迭代器的缺点:除非取尽,否则无法获取迭代器的长度;只能取下一个值,迭代器产生后就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次next。
#!/usr/bin/env python
# author:lijipeng
hobbies = ['sing','on foot','table tennis']
i = iter(hobbies)
while True:
try:
print(next(i))
except StopIteration:
break
# i1 = iter(hobbies)
# 两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值
while True:
try:
print(next(i))
except StopIteration:
break
View Code