ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

十一、迭代器和生成器 1.迭代器

2021-12-14 02:00:27  阅读:160  来源: 互联网

标签:__ 十一 iterator 迭代 对象 生成器 next print


迭代器

可迭代对象
    可迭代的:适合作为函数或结构体的参数,这些函数和结构体期望在迭代结束之前可以从中获取连续的元素
    可迭代对象通过__iter__()方法向我们提供一个迭代器
    迭代一个可迭代对象时,实际就是先获取该对象提供的迭代器,然后通过这个迭代器来依次获取对象中的数据
    可迭代对象的本质:对象所属的类中包含__iter__()方法

迭代器
    迭代器是一种访问集合元素的方式
    迭代器可以记录访问的位置
    迭代器访问可迭代对象时,从第一个元素开始逐一访问,直至所有元素都被访问完毕,不能倒退
    迭代器一定是可迭代对象,可迭代对象不一定是迭代器
    能用next()调用的可迭代对象(Iterable)被称为迭代器对象(Iterator)

for循环的本质:
    1.通过 iter(iterable) 获取要遍历对象的迭代器
    2.通过 next(iterator) 获取下一个元素
    3.取值完毕后捕获异常

自定义迭代器类
    必须有以下两个方法
        1. __iter__(),迭代器方法,通常返回自己,迭代器本身也是一个迭代器
        2. __next__(),取值方法,供迭代器对象调用

iter(),
        功能:把一个可迭代对象转为迭代器对象
        参数:可迭代对象(str,list,tuple,dict,set,range)
        返回值:迭代器

next(iterator),
        功能:调用iterator,并逐一返回iterator中的数据;只有iterator能被next()调用
        参数:iterator
        返回值:iterator中的元素

isinstance(),
        功能:判断参数是否是指定的类型

# 可迭代对象
varlist = [10,11,'M','R']
print(varlist)

for p in varlist :
    print(p)

for n in range(1) :    # range() 返回一个可迭代对象
    print(n)
	

[10, 11, 'M', 'R']
10
11
M
R
0

# 迭代器对象
vardict = {'N':'11','S':'9','M':'10','I':'8','X':'6'}
A = iter(vardict)
print(A,type(A))

'''
迭代器的取值方式
    1.next()    使用next()调用迭代器,从第一个数据开始逐一取出
    2.list()    使用list()把迭代器转为list,一次性取出所有数据
    3.for       使用for循环遍历迭代器
    
无论使用何种方式取值,迭代器中的数据都是取一次少一个,直至数据被取完
'''
# next()取值
print(next(A))
print(next(A))
print(next(A))

# for取值
for p in A :
    print(p)

# list()取值
l = list(A)
print(l)

# 迭代器和可迭代对象的检测方法
from collections.abc import Iterator,Iterable
vartuple = ('M',10)
t = iter(vartuple)

i1 = isinstance(vartuple,Iterable)
i2 = isinstance(vartuple,Iterator)
print(i1,i2)

i3 = isinstance(t,Iterable)
i4 = isinstance(t,Iterator)
print(i3,i4)

# 只有迭代器可以被next()调用,所以可以使用next()来检测迭代器
# next(vartuple)    'tuple' object is not an iterator


# 自定义迭代器类
class MyIterator(object):
    # 返回自己
    def __iter__(self):
        return self

    # 执行 next(iterator) 时自动调用此方法
    def __next__(self):
        pass
		
		
<dict_keyiterator object at 0x00000006E01744A8> <class 'dict_keyiterator'>
N
S
M
I
X
[]
True False
True True

标签:__,十一,iterator,迭代,对象,生成器,next,print
来源: https://www.cnblogs.com/HyeJeong/p/15686076.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有