迭代器内的变量是怎么保存的?

2018-02-17 00:55:48 +08:00
 flowarmor

有下面一段代码,分别打印 1 1 2 3 5 和 0 0 0 0 0,请问后面一个迭代器为什么不会打印 0 1 2 3 4 ?

class Fib(object):
    def __init__(self):
        self.prev = 0
        self.curr = 1
    def next(self):
        value = self.curr
        self.curr += self.prev
        self.prev = value
        return value
    def __iter__(self):
        return self

class T(object):
    def __iter__(self):
        return self
    def next(self):
        for i in range(5):
            return i

f = Fib()
t = T()

print next(f)
print next(f)
print next(f)
print next(f)
print next(f)

print next(t)
print next(t)
print next(t)
print next(t)
print next(t)
3726 次点击
所在节点    Python
12 条回复
quinoa42
2018-02-17 01:23:35 +08:00
因为已经 return 了,后面 i=1,2,3,4 根本不会运行
wwqgtxx
2018-02-17 01:25:45 +08:00
yield 才是给迭代器用的
KKKKKK
2018-02-17 01:50:51 +08:00
查一查 magic method

Next 调用的是 __next__ 这个方法
lrxiao
2018-02-17 03:09:59 +08:00
generator_instance.gi_frame.f_locals
flowarmor
2018-02-17 12:53:55 +08:00
@quinoa42 但是第一个 Fib 的实例就运行了。
flowarmor
2018-02-17 12:54:38 +08:00
@wwqgtxx 迭代器只要求有 next 和__iter__,yield 是给生成器函数用的。
flowarmor
2018-02-17 12:54:56 +08:00
@KKKKKK __next__是 Python 3 的方法,Python 2 的叫 next。
ch3nOr
2018-02-17 13:23:57 +08:00
#1 说的对,每次你用 next(t) 的時候,就調用一次 t.next()。你可以在[這裏]( http://pythontutor.com/visualize.html) 寫下你的代碼,可視化你的執行步驟。
wallriding
2018-02-17 13:24:50 +08:00
for i in range(5):
return i

楼主你再看看?
ch3nOr
2018-02-17 13:25:19 +08:00
Fib 的話,記錄了當前迭代的狀態,所以完全沒問題
flowarmor
2018-02-17 13:39:24 +08:00
@wallriding 嗯哼,昨夜太困大脑短路了。
frostming
2018-02-23 17:07:02 +08:00
@flowarmor
迭代器只要求有 next 和__iter__,yield 是给生成器函数用的。

一般也是用 yield 实现 next,用 return 不是不行,多麻烦啊

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/430989

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX