Python Yield语句似乎没有从其中断处继续。

| 我必须忽略明显的东西,但是我无法终生弄清楚为什么这个yield语句不能连续给我一个比上一个晚15分钟的新datetime值。 gettime函数的行为更像是“返回”而不是“ yields”的函数。
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.
要记住的重要一点是,当我们看待我的
dates
对象时,
yield
s的函数实际上会返回一个生成器:
>>> dates
<generator object gettime at 0x02A05710>
您可以反复调用
next()
获得下一个值。每次执行循环时,您都在创建一个全新的生成器,并从中获取下一个(在本例中为第一个)值。     
        Daniel已经指出,您每次通过循环都将创建一个新的生成器。遍历一个生成器,或让另一个生成器使用它,比每次显式调用ѭ6更常见。 这是您如何循环生成器的islice()的方法。
from itertools import islice
import datetime

#generator 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 the_date in islice(gettime(nextdate),0,25):
    print the_date
如果愿意,还可以将其简化为生成器表达式
from itertools import islice, count
import datetime

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

#generator expression that continually adds 15 minutes to a datetime object
gettime = (nextdate+datetime.timedelta(minutes=15*i) for i in count())

#call gettime function 25 times.
for the_date in islice(gettime,0,25):
    print the_date
    
        使用print_function:
print(*[i[0] for i in zip(gettime(nextdate), range(25))], sep=\'\\n\')
但是您可能只想列出。     

要回复问题请先登录注册