023、迭代器与生成器
本文最后更新于 258 天前,其中的信息可能已经过时,如有错误请发送邮件到wuxianglongblog@163.com

迭代器与生成器

迭代器

可迭代对象可以在 for 循环中使用:

x = [2, 4, 6]

for n in x:
    print(n)
2
4
6

之所以可以被for循环迭代,是因为这些对象拥有一个迭代器,可以用.__iter__()方法获得:

x.__iter__()

一个迭代器需要满足两个条件:

  • .__iter__()方法返回自身
  • .__next__()方法返回下一个迭代值,当迭代完成后,抛出一个StopIteration异常
i = x.__iter__()
i.__iter__() is i
True
i.__next__()
2
i.__next__()
4

也可以调用next()函数迭代:

next(i)
6

没有元素时抛出异常:

i.__next__()
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

Input In [8], in ()
----> 1 i.__next__()

StopIteration: 

自定义迭代器

自定义一个 list 的反序迭代器:

class ReverseListIterator(object):

    def __init__(self, list):
        self.list = list
        self.index = len(list)

    def __iter__(self):
        return self

    def __next__(self):
        self.index -= 1
        if self.index >= 0:
            return self.list[self.index]
        else:
            raise StopIteration
x = range(10)
for i in ReverseListIterator(x):
    print(i)
9
8
7
6
5
4
3
2
1
0

生成器

直接实现自定义类型迭代器比较麻烦,一个更简单的方法是使用生成器。例如:

def test_generator():
    yield 1
    yield 5
    yield 3
g = test_generator()

生成器也是满足迭代器定义的:

g.__iter__() is g
True

生成器会按照定义时,yield产出的值进行迭代:

next(g)
1
next(g)
5
next(g)
3

迭代结束后,抛出异常。

next(g)
---------------------------------------------------------------------------

StopIteration                             Traceback (most recent call last)

Input In [17], in ()
----> 1 next(g)

StopIteration: 

逆序函数也可以用生成器实现:

def my_reverse(data):
    for i in data[::-1]:
        yield i
for i in my_reverse('abcde'):
    print(i)
e
d
c
b
a
谨此笔记,记录过往。凭君阅览,如能收益,莫大奢望。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇