如何在不使用globals的情况下影响python生成器:timeexamp

2024-09-30 12:26:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图在运行时影响生成器。这段代码使用一个全局函数,我要求用一种更具pythonic风格的方法来获得相同的结果。你知道吗

本例打印出时间范围内的小时和分钟。应该跳过13:15到15:45的范围(这是一个示例,在现实世界中,跳过某些值的决定不是固定的)

我可以用更好的方法将全局skiptime传递给生成器吗?你知道吗

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)

Tags: innonefordatetimeiftimeis全局
2条回答

只需传递一个非基元类型的状态变量:

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

相关问题 更多 >

    热门问题