关于 Python迭代器和生成器

Python迭代器和生成器都是访问集合元素的一种方式。

一、迭代器

迭代器是一个可以记住遍历的位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
字符串,列表或元组对象都可用于创建迭代器。

1、迭代器有两个基本的方法:
iter() 创建迭代器对象
next() 输出迭代器的下一个元素

from collections.abc import Iterator

s = '123'
it1 = iter(s)
print(isinstance(it1, Iterator)) #判断一个对象是否迭代器对象,输出:True
print(next(it1)) #输出:1
print(next(it1)) #输出:2
print(next(it1)) #输出:3
#print(next(it1)) #超出范围会运行报错StopIteration

li = [1,2,3]
it2 = iter(li)
print(next(it2)) #输出:1
print(next(it2)) #输出:2
print(next(it2)) #输出:3

it3 = iter(li)
#用list可将迭代器转换为列表
print(list(it3))

关于 Python迭代器和生成器

2、迭代器遍历的两种方式:for、while

import sys

s = '123'
it1 = iter(s)
for i in it1:
    print(i)


li = [1,2,3]
it2 = iter(li)
while True:
    try:
        print(next(it2))
    except StopIteration:
        sys.exit()

关于 Python迭代器和生成器

3、把一个类作为迭代器使用:在类中实现__iter__()与 __next__() 方法

# 斐波那契数列
class Fibs:
    def __init__(self):
        self.a = 0
        self.b = 1
    def __next__(self):
        self.a,self.b = self.b, self.a+self.b
        return self.a
    def __iter__(self):
        return self

fibs = Fibs()
for f in fibs:
    if f > 1000:
        print(f)
        break

关于 Python迭代器和生成器

二、生成器

生成器是一种特殊的迭代器,使用了 yield 的函数被称为生成器,即生成器是一个返回迭代器的函数,只能用于迭代操作。

1、创建生成器

# 生成器函数
def Fibs(n):
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n):
            return
        yield a
        a, b = b, a + b
        counter += 1


f = Fibs(6) # f是一个迭代器
print(next(f))
print(next(f))
print(next(f))    #可以用next
print(f.__next__()) #也可以用__next__
print(f.__next__())
print(f.__next__())
print(f.__next__())

'''输出:
0
1
1
2
3
5
8
'''
for f in Fibs(6):
    print(f)
'''输出:
0
1
1
2
3
5
8
'''

关于 Python迭代器和生成器

2、生成器表达式

生成器表达式与列表推导式类似,不同之处是最外层的[]换成(),不立即执行循环,而是返回一个生成器。

r = (i*2 for i in range(5))
print(next(r))
print(next(r))
print(next(r))
print(next(r))
print(next(r))

'''输出:
0
2
4
6
8
'''

''' 也可以遍历
for i in r:
    print(i)
'''


r2 = sum(i*2 for i in range(5))
print(r2)

'''输出:
20
'''

关于 Python迭代器和生成器

Linux公社的RSS地址https://www.linuxidc.com/rssFeed.aspx

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/0287c53b05450277964cc63b6cf860a7.html