2016-12-05 7 views
0

関数を一度呼び出すことができ、別の時間に複数回データを返す方法はありますか?例えばPython:関数呼び出し中に一度データを返す方法

、私は次のコードを持っていたとします

def do_something(): 
    for i in range(1, 10): 
     return 1 

は、しかし、私は1つの関数呼び出しからのデータの複数部分を返すことができるようにしたいが、非同期の回で、これが可能であるが?コンテキストの場合


、私はワード文書を生成するプログラムを持って、PDFファイルに変換し、その後、単一のPDFドキュメントにそれらを兼ね備えています。 GUIから外部関数を呼び出してドキュメントを作成し、その関数を使って現在の進行状況を表示するプログレスバーを表示したいと考えています。


編集:

私はすでにyield機能を認識しています。質問の一番下にある私の具体的な問題が助けになると思った。私が探しているのは、関数から複数の値を返し、返される値ごとに異なるイベントを発生させる方法です。それが悪い例かもしれないが、私がしたいことはやることができるようにすることですあなたが発電をしたい

+1

はい、何かがまさにそのためにありません: 'yield' http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do – Iluvatar

+0

んが' yield'あなたが呼び出す必要があります何回も何回も。彼はそれをシングルタイムと呼んでほしい。 – harshil9968

+1

@ harshil9968ジェネレータは一度呼び出す必要があります。イテレータを格納してから、**イテレータ**を何度も呼び出す必要があります。これは、forループの意味がするものです。関数を繰り返し呼び出すと、イテレータは状態を失い、最初から開始します。 – bashrc

答えて

0

値を返されたJavaScriptで.then(){}に似たものであるが、複数を使用して.then(){}を実行することができる:

def do_something(): 
    for i in range(1,10): 
     yield i 

nums = do_something() 

numsnextを呼び出すたびに、do_somethingの本文は次のyieldステートメントまで実行を継続します。このステートメントはその時点でその値を返します。

>>> print next(nums) # Outputs 1 
>>> print next(nums) # Outputs 2 
>>> ... 
+0

彼の問題の声明を読んだことがありますか?私は彼の問題を解決するとは思わない。 – harshil9968

+0

途中です。彼はジェネレータが必要ですが、不特定の消費者に値を提供するために、それを魔法のようにランダムな間隔で呼び出すつもりはありません。 – chepner

+0

あなたの答えをありがとうが、私はすでに 'yield'関数を知っていました。私は質問の下部に私の特定の問題が助けになると思った、私が探している方法は、関数から複数の値を返すと返される各値の異なるイベントを引き起こす方法です – Ronikos

0

あなたはgeneratorsを探しています。

代わりにyieldWhat does the "yield" keyword do in Python?を読む)を返す代わりに、

def do_something(): 
    for i in range(1, 10): 
     yield i 

あなたは、この関数を繰り返し呼び出すことがしたい場合は、この関数を繰り返し呼び出すラッパーを持っている必要があります。少し似て:

def worker(): 
    for i in do_something(): 
     UpdateProgress(i) 
     sleep(prgressInterval) 

    thread = Thread(target=worker) 
    thread.start() 
+0

あなたの答えをありがとうが、私はすでに 'yield'関数を知っていました。私は質問の一番下にある私の特定の問題が助けになると思った、私が探しているのは、関数から複数の値を返し、返された値ごとに異なるイベントを引き起こす方法です。 – Ronikos

+0

@Ronikosは答えを更新しました。 – bashrc

1

yield関数から複数の値を返すか、取得のためにほとんどの人が言及したようなものです。

問題文をお読みになりました。ここに私があなたのために考案した解決策があります。

ステータスバーを更新する関数を作成すると、ステータスバーの値がグローバル変数から取得されます。開始時にはglobal x=0なので、更新機能では最初にx = x+1を更新し、その後ステータスバーをインクリメントします。

def do_something(): 
    for i in range(1, 10): 
     # fetch and perform operation on that Doc for PDF 
     update_status_bar() 
関連する問題