我一定忽略了显而易见的事情,但我终其一生都无法弄清楚为什么这个 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/