2017-12-24 19 views
0

私は次の2つのコードを持っています。印刷対辞書の返却機能

私の質問は、返されたものが、関数が呼び出されたときに最初の行のみを表示するのはなぜですか?

**VERSION 1** 
ColourOfCats = {"timmy":"black","sam":"white","john":"green"} 

def catsfunc (dict): 
    for i in dict.keys(): 
     return (i) 

X = catsfunc(ColourOfCats) 

print (X) 

**VERSION 2** 
ColourOfCats = {"timmy":"black","sam":"white","john":"green"} 

def catsfunc (dict): 
    for i in dict.keys(): 
     print (i) 

catsfunc(ColourOfCats) 

ありがとうございました。

+0

関数から一度だけ返すことができます。 (助けがあれば、戻り値を設定して関数を終了することで 'return'と考えることができます)。 – Ryan

+0

@Ryanありがとう。これは、関数内のif/whileループが(最後でない限り)戻り値を使用しないことを意味し、printのみを使用しますか? 私は理解しているところから、値を保存するためにリターンを使用しています。 – etjk

+0

'x = my_func()'を使用するかどうかに依存する場合は 'x'に値を格納しますが、' print(my_func()) 'を直接使用すると、返された値がprint関数の引数として渡され、コンソールですが、どこにも保存されていません – Gahan

答えて

1

:あなたは以下のようにyieldキーワードを使用して、ジェネレータ関数を作ることができますしかし

returnステートメントは関数の実行を終了し、 は呼び出し元の関数に制御を返します。呼び出しは、呼び出し直後の時点で 呼び出し関数で再開します。

あなた VERSION 8行目で1でそう

それは文が関数の実行を終了し、それはとてもfor loop dict.keys(の次の値のための2回目の反復のために行くしない返し、その後iを返します) 。

あなたの代わりに、その後、イテレータを返すことはありませんすべての結果を返す は、ここにあなたのための一例であることをlistdictsetなどに、最後のリターンで出力を保存したい場合:

ColourOfCats = {"timmy":"black","sam":"white","john":"green"} 

def catsfunc (dict): 
    result=[] 
    for i in dict.keys(): 
     result.append(i) #instead of return here , store the output to a list 
    return result   #now return 

X = catsfunc(ColourOfCats) 

print (X) 

出力:

['timmy', 'john', 'sam'] 
1

return関数内のステートメントを使用すると、値が返され、実行が停止され、呼び出しフローに制御フローが返されます。したがって、あなたがforループを使用する場合でも。関数が最初の値を返すときに別のループは実行されませんが、printを使用すると、関数の流れを壊さない文が出力されます。関数は一度しか返すことができますので

ColourOfCats = {"timmy":"black","sam":"white","john":"green"} 

def catsfunc (dict): 
    for i in dict.keys(): 
     yield i 

X = catsfunc(ColourOfCats) # X is now generator object 

for items in X: # iterate generator object 
    print (items) 
関連する問題