我一定忽略了显而易见的事情,但我终其一生都无法弄清楚为什么这个 yield 语句不会不断给我一个比前一个晚 15 分钟的新日期时间值。 gettime 函数的行为更像是一个“返回”而不是“ yield ”的函数。

import datetime

#function that continually adds 15 minutes to a datetime object
def gettime(caldate):
    while True:
        yield caldate
        caldate += datetime.timedelta(minutes=15)

#initialize a datetime object
nextdate = datetime.datetime(2011, 8, 22, 11,0,0,0)

#call gettime function 25 times.
for i in range(0,25):
    print gettime(nextdate).next()


#output feels like it should be a series of incrementing datetime values 15 minutes apart.
#in actuality, the same result namely:

#2011-08-22 11:00:00

#happens 25 times.

最佳答案

这是因为你每次都在调用生成器,重新启动它。

这是一个固定版本:

dates = gettime(nextdate)
for i in range(0, 25):
    print dates.next()   # note that you're not initializing it each time here
                         # just calling next()

这给了我:
2011-08-22 11:00:00
2011-08-22 11:15:00
2011-08-22 11:30:00
2011-08-22 11:45:00
...etc.

需要记住的重要一点是 yield s 实际上 返回生成器 的函数,正如您在查看我的 dates 对象时所看到的:
>>> dates
<generator object gettime at 0x02A05710>

这是您可以重复调用 next() 以获取下一个值的内容。每次执行循环时,您都在创建一个全新的生成器并从中获取下一个(在本例中为第一个)值。

关于Python Yield 语句似乎没有从停止的地方继续,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6301249/

10-14 10:02