2017-03-08 9 views
0

私はdictを繰り返し処理する関数を呼び出す次のpythonコードを持っています。期待通りに動作しないの下 コード:forループと関数内のpython呼び出し関数が含まれていますelse構造体が含まれています

list1=["test1","test2","test3","test4"] 
list2=["toto1","test1","test3","toto4"] 

def functest(t): 
    for l in list2: 
     if t == l: 
      return cond1 
     else: 
      return "rien" 

for t in list1: 
    titi=functest(t) 
    print titi 

が、私は4回印刷toto1私が持っているティティVARを印刷します。

私の関数内でelseを削除した場合、コードが動作するようです。

どのようにこの現象を説明できますか?

返された文字列をelseに追加すると、なぜ文字列だけが出力されるのですか?

おかげ

+1

???ユーザーが実行できるコードを提供する必要があります。これは、エラーを再現します。このコードは 'if'条件が' True'の場合に 'NamerError'を生成しますので、何かを残しておくことは明らかです。 –

+1

適切な例を提供してください(http://stackoverflow.com/help/mcve参照)。 – stybl

+0

このコードでは、あなたのループの中で 'return' *を実行するので、' 'rien" 'len(list1)回だけ出力し、' 'toto1" 'は' t == l'なら常に失敗します。最初の反復の後に戻る 'else'ブロックに渡します。 –

答えて

1

returnは、関数を終了し、ループバックに、あなたのプログラムを返すため。したがって、ループ内にelseステートメントを追加すると、list1の現在の要素は'toto1'と比較され、elseステートメントが入力され、関数は"rien"を返します。あなたはlist2で試合を見つけるまでelse声明、あなたループを削除

def functest(t): 
    for l in list2: 
     if t == l: 
      return cond1 
     else: 
      return "rien" # we always end up here on the first iteration, 
          # when comparing against "toto1" 

。しかし、list2の要素のどれもがチェックされているlist1の要素と一致しないので、"rien"を返すことを前提としている場合は、return文をループから外して、すべての要素をチェックした後にのみ返さなければなりません。

def functest(t): 
    for l in list2: 
     if t == l: 
      return "match found" 
    return "rien" 

デモ `cond1`が何であるかを

>>> for t in list1: 
     titi=functest(t) 
     print (titi) 

match found 
rien 
match found 
rien 
+0

ありがとう –

関連する問題