Python-迭代器

1、什么是迭代器
迭代器指的是迭代取值的工具,迭代是一个重复的过程,每次重复都是基于上一次的结果而继续的,单纯的重复并不是迭代

只是单纯的重复,每一次重复跟上一次是没有关联
while True:
uname=input(“请输入:”)

每一次重复跟上一次有关系
count=0
while count<5:
print(count)
count+=1

2、为何要有迭代器
迭代器是用来迭代取值的工具,而涉及到把多个值循环取出来的类型有:列表、字符串、元祖、字典、集合、打开文件

基于while实现循环取值(基于索引的取值)
l=['l','L','j']
count=0
while count<len(l):
print(l[count])
count+=1

上述迭代取值的方式只适用于有索引的数据类型:列表、字符串、元祖
为了解决基于索引迭代器取值的局限性,python必须提供一种能够不依赖于索引的取值方式,这就是迭代器

可迭代的对象:但凡内置有__iter__()方法的都称之为可迭代的对象
s=''
s.__iter__()
l=[]
l.__iter__()
t=(1,)
t.__iter__()
d={1:'hh'}
d.__iter__()
set1={1,2,3}
set1.__iter__()
with open('dd.txt',mode='tw',encoding='UTF-8') as tw:
tw.__iter__()

调用可迭代对象下的__iter__()方法会将其转换成可迭代器对象
d={1:20,'n':'llj'}
d_iterator=d.__iter__()
print(d_iterator)
#<dict_keyiterator object at 0x0000000001D99C20>


不依赖索引进行取值,每执行一次返回一个值
# print(d_iterator.__next__()) #取到字典的key 1
# print(d_iterator.__next__()) #取到字典的key n
# print(d_iterator.__next__()) #抛出异常 StopIteration,没有值可取

如果有很多,使用while循环进行迭代取值
while True:
#捕获异常
try:
print(d_iterator.__next__())
except StopIteration:
break
print("------->") #在一个迭代器取值取干净的情况下,再对其取值取不到
while True:
#捕获异常
try:
print(d_iterator.__next__())
except StopIteration:
break


针对列表有索引的也可以使用while循环进行迭代取值
l=[1,3,5,7,9,2,4,6]
l_iterator=l.__iter__()
while True:
try:
print(l_iterator.__next__())
except StopIteration:
break

3、可迭代对象与迭代器对象详解
可迭代对象(可以转换成迭代器的对象):内置有__iter__()方法对象
可迭代对象.__iter__():得到迭代器对象

迭代器对象:内置有__next__方法并且内置有__iter__()方法的对象
迭代器对象.__next__():得到迭代器的下一个值
迭代器对象.__iter__():得到迭代器的本身,说白了调了跟没调一个样子


d={1:1,'n':'llj'}
d_iterator=d.__iter__() #d是可迭代对象,通过d.__iter__()转换成迭代器
#可迭代对象只有__iter__方法,没有__next__方法

#迭代器对象有__iter__方法,也有__next__方法
d_iterator.__iter__()
d_iterator.__next__()

'''
is #比较左右两个值身份id是否相等
id:反映的是变量值的内存地址,内存地址不同id则不同
'''
print(id(d_iterator))
print(id(d_iterator.__iter__()))
print(d_iterator.__iter__() is d_iterator)
#True


4、
for循环工作原理:for循环可以称之为叫迭代器循环
#for x in 可迭代对象.__iter__()
l_i=[1,"llj",2,"liang"]
for i in l_i.__iter__():
print(i)

#for x in 迭代器对象.__iter__()
#for循环叫迭代器循环
for k in d:
print(k)

#d是一个可迭代对象,通过d.__iter__()得到一个迭代器对象
for k in d.__iter__():
print(k)


d={1:20,'n':'llj'}
#1. d.__iter__()得到一个迭代器对象
#2. 迭代器对象.__next__()拿到一个返回值,然后将该返回值赋值给k
#3. 循环往复步骤2,直到抛出StopIteration异常for循环会捕捉异常然后结束循环

for k in d:
print(k)
 
可迭代对象:字符串、列表、元祖、字典、集合、文件对象
迭代器对象: 文件对象

list(参数是一个可迭代对象和迭代器对象) #原理同for循环
 
 


 
 
 
 
 
 
 
posted @ 2020-11-16 14:48  梁博客  阅读(89)  评论(0)    收藏  举报