2

私は初心者で、Python 2.7 を使用しています。一時停止と文字列出力をオンザフライで制御できるように、定義パラメーターを変更可能にしたいと考えています。これは可能ですか?私はいくつかのスレッドのものを読みましたが、同時に2つのタスクを実行することについてのようです. 実行時に 2 つのタスク間の通信が必要です。

    def writeAndPause(stringToWrite,pauseSeconds)
        while True:
            print stringToWrite
            sleep(pauseSeconds)

解決策やドキュメントへのリンクは大歓迎です。御時間ありがとうございます!/カール

4

3 に答える 3

3

スレッドは同時作業用です。コードを再設計するだけで、必要な効果が得られると思います。while関数から句を削除して、外側に置くことを検討してください。

def writeAndPause(stringToWrite,pauseSeconds)
    print stringToWrite
    sleep(pauseSeconds)

そして、どこかでこの関数を呼び出します:

while True:
    stringToWrite, pauseSeconds = gatherSomeInformation()
    writeAndPause(stringToWrite, pauseSeconds)
于 2011-07-26T13:11:27.007 に答える
0

これは役に立ちますか?

デフォルトの引数定義の特性と、リストは変数ではなく参照のコレクションであるという事実を利用しています。私のコードでは 1 つだけです (簡単に説明します)。

from time import sleep,time

stringToWrite = [None]
pauseSeconds = [0]

def writeAndPause(stw = stringToWrite, pz = pauseSeconds, keep = [time()]):
        if stw[0]:
            print stw[0]
        else:
            print 'START'
        print '  having waited ',time()-keep[0],'seconds,    must wait',pz[0],'seconds'
        keep[0] = time()
        sleep(pz[0])


writeAndPause()


for a,b in (('first',1),('second',2.05),('third',3.4),('fourth',0.88),
            ('BANANA',0.2),('APPLE',1.5),
            ('PEAR',0.77),('CHERRY',4),
            ('ORANGE',0.1),('NUT',6),
            ('APRICOT',0.56),('PLUM',2.5)):

    stringToWrite[0] = a
    pauseSeconds[0] = b
    writeAndPause()

結果

START
  having waited  0.0310001373291 seconds,    must wait 0 seconds
first
  having waited  0.0320000648499 seconds,    must wait 1 seconds
second
  having waited  1.01600003242 seconds,    must wait 2.05 seconds
third
  having waited  2.15600013733 seconds,    must wait 3.4 seconds
fourth
  having waited  3.42100000381 seconds,    must wait 0.88 seconds
BANANA
  having waited  0.905999898911 seconds,    must wait 0.2 seconds
APPLE
  having waited  0.266000032425 seconds,    must wait 1.5 seconds
PEAR
  having waited  1.51499986649 seconds,    must wait 0.77 seconds
CHERRY
  having waited  0.796999931335 seconds,    must wait 4 seconds
ORANGE
  having waited  4.03200006485 seconds,    must wait 0.1 seconds
NUT
  having waited  0.140000104904 seconds,    must wait 6 seconds
APRICOT
  having waited  6.03099989891 seconds,    must wait 0.56 seconds
PLUM
  having waited  0.765000104904 seconds,    must wait 2.5 seconds
于 2011-07-26T14:00:56.313 に答える
0

@Constantiniusは正しいです。答えは、難解なことをする必要がないようにコードを再設計することです。

純粋に楽しむための別の方法について説明します。その while ループを関数内に保持したい場合は、Yield Expressionを使用して実行できます。

例えば:

def writeAndPause():
    while True:
        stringToWrite, pauseSeconds = yield
        print stringToWrite
        sleep(pauseSeconds)

これは次のように使用できます。

# create the generator
writer = writeAndPause()
# start the generator
writer.next()
# resume execution and send new values into generator
writer.send(('start string', 10))
'start string'
# resume execution and send another set of new values into generator
writer.send(('new string', 20))
'new string'

見たので、忘れて@Constantiniusが言ったことを実行してください。

于 2011-07-26T13:48:32.220 に答える