2015-12-22 72 views
1

我試圖在運行時影響生成器。該代碼使用全局,我要求更pythonic方式達到相同的結果。如何在不使用全局變量的情況下使用python生成器:時間示例

本示例打印出時間範圍內的小時和分鐘。從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) 
+2

文檔的這一部分可能會幫助您:值傳遞到發電機(https://docs.python.org/2/howto/functional。 html#把值傳遞給生成器) –

+0

@VincentSavard - '.send()'方法似乎可以完成我所要求的功能。 – 576i

回答

1

繼@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 
1

只是傳遞的狀態變量,其不是原始類型:

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 
+0

謝謝,這是更好的然後使用全球(並會做我想要達到的目標)。對我來說,它仍然感覺有點不好意思,所以在標記這個問題解決之前,我會等待是否有其他一些想法。 – 576i

+0

我想你可以把它封裝在一個類中(使發生器成爲一個方法而不是一個自由函數)。 –

相關問題