如何在不使用全局变量的情况下使用python生成器:时间示例
我试图在运行时影响生成器。这段代码使用一个全局函数来工作,我要求用一种更具python风格的方法来获得相同的结果 本例打印出时间范围内的小时和分钟。应跳过13:15到15:45的范围(这是一个示例,在现实世界中,跳过某些值的决定不是固定的) 我能用更好的方法把环球飞行时间传给发电机吗如何在不使用全局变量的情况下使用python生成器:时间示例,python,python-2.7,generator,Python,Python 2.7,Generator,我试图在运行时影响生成器。这段代码使用一个全局函数来工作,我要求用一种更具python风格的方法来获得相同的结果 本例打印出时间范围内的小时和分钟。应跳过13:15到15:45的范围(这是一个示例,在现实世界中,跳过某些值的决定不是固定的) 我能用更好的方法把环球飞行时间传给发电机吗 import datetime globalskiptime = None def mynexttime(mystart=None): # returns 15 30 45 59 minute for
import datetime
globalskiptime = None
def mynexttime(mystart=None):
# returns 15 30 45 59 minute for each hour
for myhour in range(0, 24):
for myminute in range(15, 61, 15):
if mystart is not None:
if datetime.time(myhour, myminute
if myminute < 60 else 59) < mystart:
continue
if globalskiptime is not None:
if datetime.time(myhour, myminute
if myminute < 60 else 59) < globalskiptime:
continue
yield myhour, myminute if myminute < 60 else 59
mystarttime = datetime.time(10, 45)
print type(mystarttime) is datetime.time
for h, m in mynexttime(mystarttime):
print(str(h) + " " + str(m))
if h == 13:
print('skip until 15:45')
globalskiptime = datetime.time(15, 45)
导入日期时间
globalskiptime=无
def mynexttime(mystart=None):
#每小时返回15 30 45 59分钟
对于范围(0,24)内的myhour:
对于范围(15、61、15)内的myminute:
如果mystart不是None:
如果是datetime.time(我的小时,我的分钟
如果myminute<60或59)
只需传递一个非基元类型的状态变量:
def gen(cur):
for ii in range(0, 10):
yield ii + cur[0]
state = [100]
for num in gen(state):
print num
state[0] += 100
它输出:
100
201
302
403
504
605
706
807
908
1009
在@VincentSavard提示之后,我重写了代码,使用
send()
将数据发送到生成器中。我不得不在最后放弃for循环,但在运行时更改for循环无论如何都很麻烦
这就是我安顿下来的原因:
import datetime
def mynexttime(mystart=None):
# returns 15 30 45 59 minute for each hour
for myhour in range(0, 24):
for myminute in range(15, 61, 15):
if mystart is not None:
if datetime.time(myhour, myminute
if myminute < 60 else 59) < mystart:
continue
mystart = (yield myhour, myminute if myminute < 60 else 59)
# start at 12:45
mytest = mynexttime(datetime.time(12, 45))
breaktime = None
while True:
try:
h, m = mytest.send(breaktime)
print(str(h) + ":" + str(m))
if h == 13:
breaktime = datetime.time(15, 44)
print('skip until 15:45')
except StopIteration:
break
导入日期时间
def mynexttime(mystart=None):
#每小时返回15 30 45 59分钟
对于范围(0,24)内的myhour:
对于范围(15、61、15)内的myminute:
如果mystart不是None:
如果是datetime.time(我的小时,我的分钟
如果myminute<60或59)
文档的这一部分可能会对您有所帮助:@VincentSavard-the.send()
方法似乎满足了我的要求。谢谢,这比使用全局方法更好(并且可以实现我的目标)。我还是觉得有点不对劲,所以在标记这个问题解决之前,我会等待是否有其他想法。我想你可以将它封装在一个类中(使生成器成为一个方法,而不是一个自由函数)。