如何在不使用全局变量的情况下影响 python 生成器:时间示例
How to influnce a python generator while using it without using globals: time example
我试图在运行时影响生成器。该代码使用全局工作,我要求 更多 pythonic 方式 来实现相同的结果。
此示例打印出时间范围内的小时和分钟。从 13:15 到 15:45 的范围应该被跳过(这是一个例子,在现实世界中跳过某些值的决定是不固定的)
我可以通过更好的方式将 globalskiptime 传递给生成器吗?
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)
只需传递一个不是原始类型的状态变量:
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 循环无论如何都是 hacky。
这就是我的解决方案:
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
我试图在运行时影响生成器。该代码使用全局工作,我要求 更多 pythonic 方式 来实现相同的结果。
此示例打印出时间范围内的小时和分钟。从 13:15 到 15:45 的范围应该被跳过(这是一个例子,在现实世界中跳过某些值的决定是不固定的)
我可以通过更好的方式将 globalskiptime 传递给生成器吗?
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)
只需传递一个不是原始类型的状态变量:
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 循环无论如何都是 hacky。
这就是我的解决方案:
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