2016-12-14 3 views
0

Ich habe versucht, ein Programm zu bauen, das Funktionen manipuliert (Übungen) - zeigt eine Nachricht über aktuelle Funktion aktiviert, erhält die Eingabe für notwendige Parameter benötigt Aktivieren Sie die Funktion je nach Art und Anzahl der Parameter und aktivieren Sie sie."ValueError: zu viele Werte zum Entpacken" python Ausnahme beim Iterieren einer Liste der Liste

Wenn es zu laufen versuchen, ich die folgende Ausnahme erhalten: Valueerror: zu viele Werte (erwartet 3)

Der Code auszupacken:

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) 

Ich konnte nicht verstehen, wie sie zu beheben der Code, aber ich denke, der Grund ist die Verwendung von geschachtelten Listen als Schleifenindex.

+0

Ich habe keine Ahnung, was Sie denken 'x = input(); x = 'Lambda x:'; exec (x) 'wird tun. –

+0

Können Sie den Stack-Trace veröffentlichen? Hat dieser Code jemals funktioniert? – TemporalWolf

+0

Was denkst du 'für j, k, l in f, inp, reqtype:' tut? Ich denke nicht, dass es das tut. –

Antwort

1

Ich glaube, Sie sind verwirrt darüber, was diese Zeile tut:

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

Ich glaube, Sie erwarten, dass in der ersten Iteration j auf dem ersten Wert in f nehmen, k auf dem ersten Wert nehmen in inp und l werden den ersten Wert in reqtype übernehmen. Bei der zweiten Iteration nimmt jeder von j, k und l die zweiten Werte von f, inp bzw. an.

Das ist nicht, was es tut.

Versuchen Sie stattdessen:

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

Zip ist in der Python Standard Library Dokumentation beschrieben, here.

+0

Es hilft. Aber es gibt jetzt ein anderes Problem - der Code von "execfunc" gibt nichts zurück. Hast du eine Ahnung warum? Ich habe versucht, den Befehl zu drucken, der vorher ausgeführt wurde, und es war in Ordnung. j zeigt auf die Funktion. Außerdem bricht die While-Schleife der Liste nicht ab, wenn sie "-1" als Eingabe erhält. –

+0

Ich konnte das meiste des Problems lösen, außer dass die Funktionen aus irgendeinem Grund "None" zurückgeben. Der Aufruf ist für j mit seinen Parametern. j ist der Iterator für die Funktionsliste. Kannst du mir helfen herauszufinden, was das verursacht? Ich bin auch neugierig - war der Befehl "zip" tatsächlich? –

+0

@ גגזזגגר - Ich werde nicht darüber spekulieren, warum 'j()' 'None' zurückgibt. Das könnte sich in einer neuen Frage lohnen. Ich habe einen Link zum 'zip()' doc in meiner Antwort hinzugefügt. Ich schlage vor, dass Sie das [Python-Tutorial] (https://docs.python.org/3.6/tutorial/index.html) durcharbeiten und sich mit der [Dokumentation der Standardbibliothek] vertraut machen (https: //docs.python .org/3.6/library/index.html)? –

Verwandte Themen