関数を作成する方法はありますか (私が考えているのは、0 から 1 点までのフィボナッチ数列と 2 点間のすべての素数を生成する、私が作成した単純なもののスタイルです) 無限に実行します。たとえば、数値が特定のポイントに達するまでではなく、特定のキーを押すまで、または時間が経過するまでですか?
また、時間に基づいている場合、0からやり直すのではなく、時間を延長してその時点からやり直す方法はありますか? time モジュールがあることは知っていますが、それについてはあまり知りません。
関数を作成する方法はありますか (私が考えているのは、0 から 1 点までのフィボナッチ数列と 2 点間のすべての素数を生成する、私が作成した単純なもののスタイルです) 無限に実行します。たとえば、数値が特定のポイントに達するまでではなく、特定のキーを押すまで、または時間が経過するまでですか?
また、時間に基づいている場合、0からやり直すのではなく、時間を延長してその時点からやり直す方法はありますか? 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
終了条件を変更する場合は、値をジェネレーター関数に戻し、その値を使用していつ終了するかを決定できます。
最も簡単な方法は、無限ループを含むプログラムを作成し、Ctrl-C を押して停止することです。これ以上の説明がないと、これがうまくいくかどうかを知るのは難しい.
時間ベースで行う場合、ジェネレーターは必要ありません。「Continue? [y/n]」のようなユーザー入力のために一時停止し、標準入力から読み取り、取得した内容に応じてループを終了するかどうかを決定できます。
関数を実行したいが、それでもユーザー (またはシステム) の入力が必要な場合は、次の 2 つの解決策があります。
それは、相互作用がどれほど細かいかによって異なります。関数を中断したいだけで終了を気にしない場合は、マルチプロセスで問題ありません。
どちらの場合も、いくつかの共有リソース (マルチスレッドの場合はファイルまたは共有メモリ、マルチスレッドの場合はミューテックスが関連付けられた変数) に依存し、関数でそのリソースの状態を定期的に確認できます。やめるように設定されている場合は、そのまま実行してください。
マルチスレッドの例:
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()
ほとんどすべての言語と同様に:
while True:
# check what you want and eventually break
print nextValue()
あなたの質問の2番目の部分はもっと興味深いです:
また、時間に基づいている場合は、時間を延長して、0からやり直すのではなく、その時点からやり直すことができます。
関数のyield
代わりにa を使用できますreturn
nextValue()
メインスレッドが文字入力を待っている間に子スレッドを使用して関数を実行すると、機能するはずです。子スレッドを停止するものがあることを忘れないでください (以下の例では、グローバル実行スレッド)。
例えば:
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()
それだけです
時間に基づいて終了する場合は、シグナル モジュールの alarm(time) 関数を使用し、SIGALRM をキャッチします。例を次に示します http://docs.python.org/library/signal.html#example
KeyboardInterrupt をキャッチすることで、ユーザーが正常な方法でプログラムを中断できるようにすることができます。メインループの外側から KeyboardInterrupt 例外をキャッチし、必要なクリーンアップを実行するだけです。
中断したところから後で続行する場合は、ある種の持続性を追加する必要があります。データ構造をディスクにピクルして、操作を続行するために読み戻すことができます。
このようなことは試していませんが、memoizingやディスクへのキャッシュなどの使用を検討できます。
フィボナッチ数を 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() を呼び出すことがどれほど効率的かはわかりません-ループ内で何をしているかによっては、パフォーマンスが大幅に低下する可能性があります。