有沒有什麼辦法可以創建一個函數(我正在考慮的是我所生成的簡單類型的函數,它們可以從0到一個點生成斐波那契數列,兩點之間的所有素數)無限期地運行。例如。直到我按下某個鍵或直到時間過去,而不是直到某個數字達到某個點爲止?使程序無限期運行在python中
另外,如果它是基於時間的話,那麼有沒有什麼辦法可以延長時間,並從這一點再次開始,而不必從0開始重新開始?我知道有一個時間模塊,我只是不太瞭解它。
有沒有什麼辦法可以創建一個函數(我正在考慮的是我所生成的簡單類型的函數,它們可以從0到一個點生成斐波那契數列,兩點之間的所有素數)無限期地運行。例如。直到我按下某個鍵或直到時間過去,而不是直到某個數字達到某個點爲止?使程序無限期運行在python中
另外,如果它是基於時間的話,那麼有沒有什麼辦法可以延長時間,並從這一點再次開始,而不必從0開始重新開始?我知道有一個時間模塊,我只是不太瞭解它。
最簡單的方法就是寫一個帶有無限循環的程序,然後點擊control-C來停止它。沒有更多的描述,很難知道這是否適合你。
如果你這樣做的時間,你不需要一個發電機。你可以暫停用戶輸入,像「Continue?[y/n]」,從標準輸入讀取,並取決於你得到的是退出循環還是不循環。
由於幾乎所有的語言:
while True:
# check what you want and eventually break
print nextValue()
你問題的第二部分是更有趣:
而且,如果它是基於時間,然後有反正我可以延長時間,並從這一點開始,而不是從0開始重新起動0
您可以使用yield
而不是return
在函數中nextValue()
如果在主線程等待字符輸入時使用子線程運行該函數,它應該可以工作。只記得有一些停止子線程(在本例中,全球runthread下文)
例如:
import threading, time
runthread = 1
def myfun():
while runthread:
print "A"
time.sleep(.1)
t = threading.Thread(target=myfun)
t.start()
raw_input("")
runthread = 0
t.join()
做到了這一點
如果你真的想你的函數運行,仍希望用戶(或系統)輸入,有兩種解決方法:
這取決於交互作用有多好。如果你只是想打斷這個功能而不關心退出,那麼多進程就沒有問題。
在這兩種情況下,您都可以依賴一些共享資源(文件或共享內存用於多線程,變量和多線程關聯的互斥體),並在您的函數中定期檢查該資源的狀態。如果它的設立是爲了讓你戒菸,那就去做吧。
例如在多線程:
from threading import Thread, Lock
from time import sleep
class MyFct(Thread):
def __init__(self):
Thread.__init__(self)
self.mutex = Lock()
self._quit = False
def stopped(self):
self.mutex.acquire()
val = self._quit
self.mutex.release()
return val
def stop(self):
self.mutex.acquire()
self._quit = True
self.mutex.release()
def run(self):
i = 1
j = 1
print i
print j
while True:
if self.stopped():
return
i,j = j,i+j
print j
def main_fct():
t = MyFct()
t.start()
sleep(1)
t.stop()
t.join()
print "Exited"
if __name__ == "__main__":
main_fct()
如果您要根據時間退出,你可以使用信號模塊的報警器(時間)功能,以及漁獲SIGALRM - 這裏是一個例子http://docs.python.org/library/signal.html#example
您可以讓用戶通過捕捉KeyboardInterrupt以一種健全的方式中斷程序。只需從主循環外部捕獲KeyboardInterrupt異常,並執行所需的清理即可。
如果您想在稍後停止的地方繼續,您將不得不添加一些排序持久性。我會將一個數據結構pickle寫入磁盤,以便您可以重新讀入以繼續操作。
我還沒有嘗試過這樣的事情,但你可以看看使用類似memoizing的東西,並緩存到磁盤。
是......我要回答這個問題,但它不是Python ...它是UNIX! – PierreBdR 2008-11-04 18:33:27
你可以做這樣的事情來生成斐波納契數字1秒然後停止。
fibonnacci = [1,1]
stoptime = time.time() + 1 # set stop time to 1 second in the future
while time.time() < stoptime:
fibonnacci.append(fibonnacci[-1]+fibonnacci[-2])
print "Generated %s numbers, the last one was %s." % (len(fibonnacci),fibonnacci[-1])
我不知道它是如何有效地調用了time.time()在每一個循環 - 這取決於你在循環裏面做什麼,它可能最終會走很多的表現了。
你可以使用一個發電機這樣的:
def finished():
"Define your exit condition here"
return ...
def count(i=0):
while not finished():
yield i
i += 1
for i in count():
print i
如果你想改變的退出條件,你可以傳遞值回發生器功能,並使用該值來確定何時退出。
除了通過「再次從這個點開始」可以被解釋爲「在稍後的日期從上一次計算的輸出恢復執行該程序」...... – 2008-11-04 17:19:44