web-dev-qa-db-ja.com

Python-forループでreturnステートメントを使用するには?

まず第一に悪いタイトルについて謝罪したいのですが、それは私ができる最善のことでした。これを少しでも理解しやすくするために、多くのスクリーンショットを撮ろうとしました。

だから私は不協和音のためのチャットボットに取り組んでおり、今はtodoリストとして機能する機能に取り組んでいます。リストにタスクを追加するコマンドがあり、それらは辞書に保存されています。しかし、私の問題は、より読みやすい形式でリストを返すことです(写真を参照)。

def show_todo():
    for key, value in cal.items():
        print(value[0], key)

タスクはdictというcalに保存されます。しかし、ボットが実際にメッセージを送信するには、returnステートメントを使用する必要があります。そうしないと、実際のチャットではなくコンソールに出力されます(写真を参照)。

def show_todo():
    for key, value in cal.items():
        return(value[0], key)

修正しようとした方法を次に示しますが、returnを使用したため、forループが正しく機能しません。

それで、どうすれば修正できますか?コンソールではなくチャットに出力されるように、returnステートメントを使用するにはどうすればよいですか?

よりよく理解するには pictues をご覧ください

6
Eric.L

ループ内でreturnを使用すると、反復がまだ終了していなくても、ループを中断してメソッド/関数を終了します。

例えば:

def num():
    # Here there will be only one iteration
    # For number == 1 => 1 % 2 = 1
    # So, break the loop and return the number
    for number in range(1, 10):
        if number % 2:
            return number
>>> num()
1

いくつかの場合/アルゴリズムでは、いくつかの条件が満たされた場合、ループを中断する必要があります。ただし、現在のコードでは、ループを終了する前に中断することはエラー/不良設計です。

その代わりに、別のアプローチを使用できます。

データの取得:

def show_todo():
    # Create a generator
    for key, value in cal.items():
        yield value[0], key

次のように呼び出すことができます。

a = list(show_todo()) # or Tuple(show_todo()) and you can iterate through it too.

データを一時リストまたはタプルまたは辞書または文字列に追加するその後、ループの終了後にデータを返します。

def show_todo():
    my_list = []
    for key, value in cal.items():
        my_list.append([value[0], key])
    return my_list
11
Chiheb Nexus

generator 構文を使用します(SO here )に関する優れた説明:

def show_todo():
    for key, value in cal.items():
        yield value[0], key

for value, key in show_todo():
    print(value, key)
4
Uriel