2017-04-07 6 views
0

Schreiben Sie eine Funktionsleistung, die zwei Argumente akzeptiert, a und b, und berechnet eine Potenz zur Potenz b. Beispiel: power (2,3) = 8 Raise einen TypeError mit der Nachricht Argument muss Integer oder Float sein, wenn die Eingaben etwas anderes als ints oder floats sind. Hinweis: Verwenden Sie nicht **Rekursive Funktion zum Exponentialberechnen ohne "*"

Mein Code unten ist nicht mir meine gewünschte Ausgabe gegeben. Bitte, was könnte falsch sein?

def power(a, b): 
    if a == type(int) or a == type(float) and b == type(int) or b == type(float): 
     def add(a, b): 
      num = a 
      for i in range(b): 
       num += 1 
      return num 

     def multiply(a, b): 
      num = 0 
      for i in range(b): 
       num = add(num, a) 
      return num 

     def power(a, b): 
      num = 1 
      for i in range(b): 
       num = multiply(num, a) 
      return num 
    else: 
     return "Argument must be integer or float" 
+0

Sie können also '*' oder '**' nicht verwenden? – Carcigenicate

+0

Und wenn die Ausgabe falsch ist, müssen Sie es debuggen. Sie haben 3 innere Funktionen definiert. Welche gibt schlechte Ergebnisse zurück? – Carcigenicate

+0

es passiert nicht die if-Bedingung für die Funktionen – wapadunk

Antwort

1

Es gibt eine Reihe von Problemen mit Ihrem Code.

Zunächst ist Ihre Typüberprüfung fraktal falsch (es wird immer falscher, je tiefer man hineinblickt). Sie sollten wahrscheinlich isinstance(a, (int, float)) and isinstance(b, (int, float)) anstatt der rückwärts Zeug, die Sie jetzt haben. Momentan prüfen Sie, ob a und b der Klasse type entsprechen (dies ist der Typ von int und float). Sie haben auch die Ausdruck Gruppierung falsch, wie der and-Operator bindet enger als die or s tun (Ihr Code tut a or (b and c) or d, wenn Sie wollten (a or b) and (c or d)).

Als nächstes definieren Sie neue Funktionen tun Sie Ihre Stromberechnung, aber Sie rufen sie nie von der äußeren power-Funktion (damit sie nie etwas tun). Wenn Sie die inneren Funktionen behalten wollen, brauchen Sie irgendwo einen Anruf return power(a, b). Sie können jedoch die Dinge vereinfachen, indem Sie die inneren Funktionen loswerden und die Berechnung direkt in einigen verschachtelten Schleifen durchführen. Verschachtelte Funktionen sind nur sehr selten erforderlich.

Sie tun auch nicht, was Sie im Fehlerfall tun sollen. Sie sollen raise eine TypeError, nicht eine Zeichenfolge zurückgeben.

Und schließlich, ich denke, Sie haben das ganze Problem viel komplizierter als nötig gemacht. Ihre Aufgabe lautet, nicht ** zu verwenden, aber ich vermute, dass Sie weiterhin die Operatoren * und + verwenden dürfen. Ich würde einfach etwas in einer Schleife multiplizieren, anstatt alles von Grund auf neu zu definieren (was nicht einmal funktioniert, da Ihre add Funktion += benötigt).

Ein weiterer Hinweis: Die Problemaussage sagt nicht, ob b (der Exponent) immer eine ganze Zahl sein wird, oder ob es einen Bruchteil haben kann. Die Behandlung von Teilexponenten ist viel schwieriger als die Behandlung ganzzahliger Exponenten. Daher würde ich Ihren Lehrer fragen, ob das tatsächlich Teil der Aufgabe ist, bevor Sie viel Zeit darauf verwenden, es zu lösen. Es kann sein, dass Sie sowohl int als auch float Typen unterstützen müssen, aber selbst wenn b ein Float ist, wird es immer noch eine ganze Zahl sein.

+0

Danke! Wird * für eine andere Version verwenden.Aber um den obigen Code zu korrigieren; habe Probleme mit "Return Power (a, b)" in der Funktion – wapadunk

+0

zu integrieren Sie würden wahrscheinlich wollen, dass gerade über dem "else", auf der gleichen Einrückungsebene wie die 'def 'Anweisungen für die inneren Funktionen. Es ist ziemlich peinlich, dass Sie den gleichen Namen für die innere Power-Funktion verwenden wie den äußeren, aber es ist kein Problem, das den Code daran hindert, ausgeführt zu werden (es sieht nur so aus, als würden Sie Rekursionen durchführen, wenn Sie nicht sind). – Blckknght

+0

es funktionierte gut nach den Korrekturen, Sie sind hervorragend. – wapadunk