2016-11-21 14 views
2

このPythonスクリプトは、90.0の値を返します。私は、これは一連の値を返すことが期待さ変数の明示的な定義は、関数を呼び出すが反復子は呼び出さないのはなぜですか?

for x in range (5): 
    print(TestFunction(*list(Params)[x])) 

:として

import itertools 

a=[12,345,1423,65,234] 
b=[234,12,34,1,1,1] 
c=[1,2,3,4] 

def TestFunction (a, b, c): 
    result = a + b/c 
    return result 

Params=itertools.product(a, b, c) 

x = 2 
print(TestFunction(*list(Params)[x])) 

しかし、私は、xの範囲のための私の機能を評価したいと思います:246.0,129.0,90.0,70.5,14.0;しかし、私が手に:それはイテレータのときxが明示的にではなく、定義されている場合

"IndexError: list index out of range."

はなぜ機能が評価していますか?

答えて

1
for x in range (5): 
    print(TestFunction(*list(Params)[x])) 

Paramsはイテレータです。ループをはじめて、それをリストに変換することで完全に消費します。したがって、2番目の反復では何もないのでリストに変換すると[]、空のリストが得られ、そのインデックスを取得しようとするとうまくいきません。

代わりに、反復子をループの外側ののリストに変換します。

params = list(Params) 
for x in range(5): 
    print(TestFunction(*params[x])) 
+0

ああ、私がこれを理解しようとしている間に空リストを説明しています。どうもありがとうございました。 – Jellybeard

1

イテレータでlist()を呼び出すと、イテレータが使い果たされるためです。したがって、それは一度だけ呼び出すことができます。

>>> Params=itertools.product(a, b, c) 
>>> Params 
<itertools.product object at 0x7f5ed3da5870> 
>>> list(Params) 
[(12, 234, 1), (12, 234, 2)..., (234, 1, 4)] 
>>> list(Params) 
[] 

あなたはlist(Params)への2回目の呼び出しは空のリストと評価されていることがわかり、そしてIndexErrorを上げる添字しようとすることができます。

あなたは別の変数でイテレータからの値を格納することができ:添字によって任意のアイテムにアクセス、

l = list(Params) 

と、あなたが望むようにそれをアクセスします。

あなたがループ例えばに従って、順次アイテムにアクセスしたい場合は、単にイテレータにnext()を呼び出す:

for i in range(5): 
    print(TestFunction(*next(Params))) 
-1

Paramsはイテレータで、リストに変換すると、それを完全に消費するので。

あなたのケースを処理するための2つの方法があります。

  1. は、ループの外リストにイテレータを変換します

    Params = list(itertools.product(a, b, c)) 
    
  2. 使用copy.copy

    from copy import copy 
    print(TestFunction(*list(copy(Params))[x])) 
    

方法1が適切である。場合によっては方法2が必要な場合があります。

関連する問題