2016-12-14 4 views
0

関数を操作するプログラムを作成しようとしていました - 現在の関数に関するメッセージを表示し、必要なパラメータを入力しますパラメータの種類と数に応じて機能を有効にし、有効にします。"ValueError:アンパックする値が多すぎます"リストのリストを反復するときにPython例外が発生する

それを実行しようとすると、私は次の例外を取得: とValueError:解凍するためにあまりにも多くの値が(3を期待)

コード:

s = ['Q4', 'Q5a', 'Q5b', 'Q5c', 'Q5d', 'Q6'] 
f = [Trapez_rule, myFilter, myFilterMulti, myPrime, isFib, repeated] 
inp = [['function', 'boundry a', 'boundry b', 'parts'], ['list', 'function'], ['list', 'list of functions'], ['number'], ['number'], ['function', 'number']] 
reqtype = [['f', 'n', 'n', 'n'], ['l', 'f'], ['l', 'lf'], ['n'], ['n'], ['f', 'n']] 

for j, k, l in f, inp, reqtype: # for i, j, k, l in s, f, inp, reqtype: 
    # print(i) 
    print(j.__doc__) 
    lst = [] 
    for w, r in k, l: 
     print(w) 
     if r == 'f': 
      x = input() 
      x = 'lambda x: ' 
      exec(x) 
      lst.append(x) # 'x' 
     elif r == 'n': 
      x = input() 
      lst.append(x) 
     elif r == 'l': 
      m = [] 
      x = 0 
      while x != -1: 
       x = input() 
       m.append(x) 
      lst.append(m) 
     elif r == 'lf': 
      m = [] 
      x = 0 
      while x != -1: 
       x = input() 
       x = 'lambda x: ' 
       exec(x) 
       m.append(x) 
      lst.append(m) 
    execfunc = 'j(' 
    for q in range(len(lst) - 1): 
     execfunc += lst[q] + ', ' 
    execfunc += lst[q] + ')' 
    exec(execfunc) 

私は修正する方法を理解することができませんでしたコードが、私は理由はループのインデックスとしてネストされたリストの使用だと思う。

+0

私は、あなたが 'x = input(); x = 'ラムダx:'; exec(x) 'が実行します。 –

+0

スタックトレースを投稿できますか?このコードはこれまでに有効でしたか? – TemporalWolf

+0

あなたは '' j、k、l、f、inp、reqtypeのために ''どういうことをしますか?私はそうは思わない。 –

答えて

1

私はあなたがこの行が何をするかについて混乱していると信じて:

for j, k, l in f, inp, reqtype: 

私はあなたが最初の反復では、jfの最初の値を取るだろう、という期待と信じて、kは最初の値になりますinpで、lは、reqtypeの最初の値をとります。第2の反復では、j,kおよびlのそれぞれは、それぞれf,inpおよびreqtypeの第2の値をとる。

それはそうではありません。

代わりにこれを試してみてください:

for j, k, l in zip(f, inp, reqtype): 

ジップはPython Standard Libraryドキュメント、hereに記載されています。

+0

助けてください。しかしもう一つの問題があります。 "execfunc"のコードは何も返しません。理由は何ですか?以前に実行するコマンドを印刷しようとしましたが、それは問題ありませんでした。 jは関数を指します。また、リストの入力whileループは、 "-1"を入力として与えても折れません。 –

+0

私は何かの理由で関数が "None"を返すということ以外にも、ほとんどの問題を解決することができました。その呼び出しは、そのパラメータを持つjに対するものです。 jは関数リストのイテレータです。あなたはそれを引き起こす原因を考え出すのを助けてくれますか?また、私は興味があります - 実際に "zip"コマンドが実行されたのでしょうか? –

+0

@ gland - 私は 'j()'が 'None'を返す理由については推測しません。それは新しい質問をする価値があるかもしれません。私は私の答えで 'zip()'文書へのリンクを追加しました。 [The Python Tutorial](https://docs.python.org/3.6/tutorial/index.html)で作業することをお勧めします。[標準ライブラリのドキュメント](https://docs.python .org/3.6/library/index.html)? –

関連する問題