2017-04-18 5 views
1
class Fibonacci: 
    def fn(num): 
     if num <= 0: 
      return 0 
     if num <= 1: 
      return 1 

     else: 
      Result = fn(num - 1) +fn(num - 2) 
      return Result 

amount = int(input("How many numbers do you want? : ")) 

i = 1 
while i < amount: 
    FibValue = fn(i) 
    print(FibValue) 
    i += 1 

Fibonacci() 

Hier meine Fehler sind:Funktion läuft von selbst, aber nicht, wenn in einer Klasse

File "C:/Users/Carsten/PycharmProjects/untitled/Lesson13.py", line 30, in <module> 
class Fibonacci: 
File "C:/Users/Carsten/PycharmProjects/untitled/Lesson13.py", line 45, in Fibonacci 
FibValue = fn(i) 
File "C:/Users/Carsten/PycharmProjects/untitled/Lesson13.py", line 38, in fn 
Result = fn(num - 1) +fn(num - 2) 
NameError: name 'fn' is not defined 

Ich bin nicht ganz sicher, warum ich die def Fibonacci laufen kann: Funktion auf seinem eigenen, sondern als sobald ich es unter eine Klasse stelle, gibt es mir diese Fehler. Ich bin noch ein Anfänger und habe keine Ahnung, was diese Fehler bedeuten, aber selbst das Nachschlagen hilft nicht viel. Jede Hilfe wird geschätzt. Ich weiß, dass ich das nur als eigenständige Funktion nutzen kann, aber ich bin mitten in einem Problem in der Youtube-Serie, die ich mir anschaue, um mich selbst zu unterrichten, und ich möchte nicht einfach im Video springen und nur die Antwort sehen um den Rest des Problems. Danke

+1

Verwendung 'Fibonacci(). Fn (i)'. Dies instanziiert ein Objekt und ruft dann seine 'fn()' Methode auf. – stanleyli

+1

Diese Funktion ist ein schrecklicher Kandidat für eine Klasse. –

+0

@ IgnacioVazquez-Abrams können Sie erklären, warum? –

Antwort

1

Wenn Sie die Funktion in eine Klassenmethode ändern (d. H. Innerhalb der Klasse einfügen), dann kann nur ein Objekt dieser Klasse die Funktion aufrufen. Die Syntax lautet wie Stanleyli erwähnt. Vielleicht ein wenig mehr klar:

fib_obj = Fibonacci() 
fib_value = fib_obj.fn(i) 

Wie Ignazio bereits erwähnt, ist dies ein sehr schlechtes Beispiel für Klasse-Nutzung. Die Klasse hat keine Attribute (Daten, die mit dem Objekt verknüpft sind) und macht die Klasse nur härter, um die Funktion zu verwenden.

A-Klasse ist besser genutzt, wenn Sie eine Sammlung von Daten und Funktionen, die auf diesen Daten handeln, wo die Kombination ein Konzept höhere Ebene verkörpert. Zum Beispiel wäre ein Spielbrett mit Stückpositionen und Bewegungsfunktionen eine gute Verwendung einer Klasse.


Ich verstehe jetzt. Siehe auch die Tutorial-Referenzen here. Im Wesentlichen ein iterable ist eine Klasse, die ein nächstes (explizites) und/oder __next__ (implizites) Verfahren beinhaltet. Deshalb beginnen Sie mit der Klassenstruktur.

Sobald Sie das getan haben, Ihr Hauptprogramm reduziert sich auf

for i in Fibonacci(amount): 
    print i 
+0

vielen Dank. Ich verstehe. Ich vergesse jetzt auch die Grundlagen aus früheren Lektionen. Ich sollte eine Klasse erstellen, die bei jedem nächsten Aufruf Werte aus der Fib-Sequenz zurückgibt. Ich war mir nicht sicher, wie ich das machen sollte und versuchte das Problem zu lösen. Immer noch nicht vollständig verstehen, und warum ich auch eine __iter __ (Selbst) -Funktion brauche. Ich werde die Brücke in ungefähr einer Minute überqueren. Danke für die Hilfe –

+0

Aha! Sie müssen einen * Generator * oder einen * Iterator * erstellen, nicht eine * Klasse *. – Prune

+0

Hier ist das Video Ich bin auf https://www.youtube.com/watch?v=SFCiaBKwkE4&index=13&list=PLGLfVvz_LVvTn3cK5e6LjhgGiSeVlIRwt und der Titel ist, lernen, Programm 13 Iterables: List Verständnis: Generatoren. In den Anweisungen sagt er, eine Klasse zu erstellen, die bei jedem nächsten Aufruf Werte aus der Fibonacci-Folge zurückgibt. Vielleicht brauche ich keine Klasse, aber er will eine für das Problem. Sowieso.Nochmals vielen Dank und ich habe versucht, die Frage zu verbessern, aber ich habe keine 15 Wiederholungen. –

Verwandte Themen