迭代器与生成器

1.什么是迭代器

迭代器是一个迭代值的工具,迭代意味着一个重复的过程,每次迭代都是在之前的结果基础上继续进行的,简单的重复不是迭代。

[En]

An iterator is a tool for iterating values, and iteration means a repetitive process, and each iteration continues based on the previous result, and simple repetition is not an iteration.

2.为何要有迭代器

python中涉及到需要把多个值循环取出来的类型有:字符串、列表、元组、字典、集合、打开文件等,我们可以考虑使用while循环的方式来循环取出多个值,例如:

list=['egon','lin',11]
i=0
while i<len(list): print(l[i]) i+="1" < code></len(list):>

但是使用while方式迭代取值的方式只适合于有索引的数据类型,比如字符串、元组、列表。

因此python必须提供一种不依赖索引的取值方式!这就是迭代器!

可迭代对象:但凡内置有__iter__方法的都称之为可迭代对象,字符串、字典、列表、元组、集合、文件都是可迭代对象,内部都封装了__iner__方法!

迭代器对象:内置有__next__()和__iter__()方法的对象

可迭代对象调用__iter__方法返回的是一个迭代器对象,迭代器对象下有一个__next__()方法就可以取到可迭代对象的值,没有值可取就会报stopiteration错。

d={'a':1,'b':2,'c':3}
d_iterator=d.__iter__()  #&#x8C03;&#x7528;__iter__()&#x628A;&#x5B57;&#x5178;&#x8F6C;&#x6362;&#x4E3A;&#x8FED;&#x4EE3;&#x5668;&#x5BF9;&#x8C61;
d_iterator.__next__()   #&#x4F9D;&#x6B21;&#x53D6;&#x51FA;&#x5B57;&#x5178;d&#x4E2D;&#x7684;key&#xFF0C;&#x6BCF;&#x6B21;&#x53D6;&#x4E00;&#x4E2A;&#xFF0C;&#x53D6;&#x5B8C;&#x7EE7;&#x7EED;&#x53D6;&#x5219;&#x62A5;&#x9519;

3.如何用迭代器

for循环的工作原理:

for k in d&#xFF1A;
    print&#xFF08;k&#xFF09;

1.调用对象的__iter__()方法得到一个迭代器对象
2.调用迭代器对象的__next__()方法拿到一个返回值,然后将返回值赋值给k
3.循环第二步,直到抛出stopiteration异常,for循环补捉到异常break结束循环

4.迭代器的优缺点

优点:

1)可以迭代没有索引的可迭代对象
2)迭代的时候是每迭代一次,读取一次,不会把内容全部一次读取出来,这样会损耗内存

缺点:

1)不可以像索引那样针对性的取值,总是一次性的迭代完!

5,自定义迭代器(生成器)

在函数体内存在yield,在调用函数时并不会执行函数体代码,而是会返回一个生成器,即自定义的迭代器!

def func():
    print('&#x7B2C;&#x4E00;&#x6B21;')
    yield 1
    print('&#x7B2C;&#x4E8C;&#x6B21;')
    yield 2
    print('&#x7B2C;&#x4E09;&#x6B21;')

d = func()
res1=next(d)
print(res1)
res2=d.__next__()
print(res2)
__next__()&#x5C31;&#x7B49;&#x4E8E;next&#xFF08;&#xFF09;&#xFF0C;&#x8C03;&#x7528;&#x4E86;next&#x65B9;&#x6CD5;&#x4F1A;&#x89E6;&#x53D1;&#x51FD;&#x6570;&#x4F53;&#x4EE3;&#x7801;&#x8FD0;&#x884C;&#xFF0C;&#x7136;&#x540E;&#x9047;&#x89C1;yield&#x505C;&#x4E0B;&#x6765;&#xFF0C;&#x5C06;yield&#x540E;&#x9762;&#x7684;&#x503C;&#x8FD4;&#x56DE;&#xFF0C;&#x5982;&#x679C;&#x5728;&#x8C03;&#x7528;&#x4E86;next&#x65B9;&#x6CD5;&#x4E4B;&#x540E;&#x6CA1;&#x6709;&#x8FD4;&#x56DE;&#x503C;&#x4E86;&#x5C31;&#x4F1A;&#x62A5;&#x9519;&#xFF01;
def dog(name):
    print('%s&#x6B63;&#x5728;&#x5403;&#x4E1C;&#x897F;'%name)
    while True:
        x = yield 1111
        print('%s&#x6B63;&#x5728;&#x5403;%s'%(name,x))

g=dog() # &#x51FD;&#x6570;&#x91CC;&#x9047;&#x89C1;yield&#x8BF4;&#x660E;&#x4E0D;&#x5728;&#x662F;&#x4E00;&#x4E2A;&#x51FD;&#x6570;&#xFF0C;&#x800C;&#x662F;&#x8FD4;&#x56DE;&#x4E86;&#x4E00;&#x4E2A;&#x751F;&#x6210;&#x5668;
&#x9700;&#x8981;&#x7528;send&#x65B9;&#x6CD5;&#x9700;&#x8981;&#x5148;&#x521D;&#x59CB;&#x5316;&#x4E00;&#x4E0B;&#xFF0C;&#x5373;&#xFF1A;seng&#x91CC;&#x9762;&#x4F20;&#x4E00;&#x4E2A;none&#x7B49;&#x540C;&#x4E8E;&#x8C03;&#x7528;&#x4E86;next(g)&#x65B9;&#x6CD5;
g.send(None) # &#x6B64;&#x65F6;&#x51FD;&#x6570;&#x505C;&#x5728;&#x4E86;yield&#x7684;&#x5730;&#x65B9;
res=g.send('&#x4E00;&#x6839;&#x9AA8;&#x5934;')  # &#x628A;send&#x91CC;&#x9762;&#x7684;&#x503C;&#x4F20;&#x7ED9;yield(&#x53EA;&#x80FD;&#x4F20;&#x4E00;&#x4E2A;&#x503C;&#xFF0C;&#x53EF;&#x4EE5;&#x662F;&#x5217;&#x8868;&#x7B49;&#xFF09;&#xFF0C;yield&#x5728;&#x4F20;&#x7ED9;x
&#x5982;&#x679C;yield&#x540E;&#x9762;&#x6709;&#x503C;&#xFF0C;&#x5219;g.send()&#x6709;&#x8FD4;&#x56DE;&#x503C;&#xFF0C;&#x6CA1;&#x6709;&#x5219;&#x8FD4;&#x56DE;none
print(res)

## &#x6269;&#x5C55;&#xFF1A;&#x5176;&#x5B9E;&#x8FD4;&#x56DE;&#x503C;&#x53EF;&#x4EE5;&#x540E;&#x9762;&#x653E;&#x4E2A;&#x5217;&#x8868;&#xFF0C;&#x5B57;&#x5178;&#x7B49;&#xFF0C;&#x6BCF;&#x6B21;&#x64CD;&#x4F5C;&#x5C31;&#x5F80;&#x5217;&#x8868;&#x91CC;&#x52A0;&#x4E00;&#x4E2A;&#x503C;

Original: https://www.cnblogs.com/suncolor/p/16583374.html
Author: 等日落
Title: 迭代器与生成器

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/498787/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球