Seite 1 von 2
Problem mit str und int
Verfasst: Sonntag 28. November 2010, 15:57
von Gipsyjack
Hallo,
aslo ich will ein skript, das mir die Fibonacci Zahlen berechnet ersteinmal interativ..
d.h. ich will eine Zahl eingeben und anschließend soll durch eine definierte Funktion die dazu gehörige Fib-Zahl berechnet werden.
Code: Alles auswählen
#!/usr/bin/python
import math
n = int(input)
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1.0) + fib(n-2.0)
print fib(n)
ich verstehe aber nicht was falsch daran ist, bei mir kommt immer der fehler:
Code: Alles auswählen
TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'
aber warum?? mit
n=int(input) wird doch die Zahl als int definiert womit ich rechnen kann..
MfG
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 16:04
von cofi
Gipsyjack hat geschrieben:aber warum?? mit
n=int(input) wird doch die Zahl als int definiert womit ich rechnen kann..
Nein, kein Stueck. Noch dazu wirft eben `int` die Exception. `input` ist eine Funktion, die du aufrufen solltest.
Da du Python2 benutzt, solltest du statt `input` aber `raw_input` nutzen.
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 16:18
von Gipsyjack
ok danke, aber raw_input liefert doch auch nur einen string?
und was genau meinst du mit "input" ist eine funktion?
tut input nicht einfach "lesen" was ich in der standardeingabe tippe und wandelt es in ein int um?
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 16:32
von cofi
Gipsyjack hat geschrieben:ok danke, aber raw_input liefert doch auch nur einen string?
und was genau meinst du mit "input" ist eine funktion?
tut input nicht einfach "lesen" was ich in der standardeingabe tippe und wandelt es in ein int um?
Nein, `input` wertet den String per `eval` aus. Also ja, es wandelt "23" zur Zahl 23 um, aber warum willst du dann noch `int` darauf aufrufen?
Code: Alles auswählen
%> python
Python 2.6.6 (r266:84292, Oct 9 2010, 12:24:52)
[GCC 4.4.5] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> input
<built-in function input>
>>> input()
__import__("sys").exit()
%>
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 16:44
von Gipsyjack
Code: Alles auswählen
#!/usr/bin/python
import math
import sys
n = input
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1.0) + fib(n-2.0)
print fib(n)
okay das ergibt sinn.. mit dem input
aber wenn ich das programm jetzt so laufen lasse kommt immer noch der feher, dass die fprmatierung nicht stimm:
Code: Alles auswählen
Traceback (most recent call last):
File "fib.py", line 21, in <module>
print fib(n)
File "fib.py", line 19, in fib
return fib(n-1.0) + fib(n-2.0)
TypeError: unsupported operand type(s) for -: 'builtin_function_or_method' and 'float'
kannst du mir bitte genau erklären, wie das funktioniert? also der unterschied zwischen raw_input und input bzw was dsa mit einer funktion zu tun hat??
weil eine funktion definiert man doch und die werte die in raw_input und input sind doch variablen??
PS:
wenn ich statt
n= input
z.b.:
n=5 schreibe kommt das richtige ergebniss raus, also muss oben was nicht stimmen..
EDIT: ich glaube das ist ein grundlegendes versändnisproblem bei mir...
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 17:03
von gkuhl
"input" und "raw_input"
sind Funktionen. Und diese lassen sich halt nicht in einen Integer umwandeln:
Code: Alles auswählen
>>> type(input)
<type 'builtin_function_or_method'>
>>> n = input
>>> type(n)
<type 'builtin_function_or_method'>
>>> n is input
True
>>> int(n)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'
>>> int(input)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string or a number, not 'builtin_function_or_method'
Du möchtest "input", bzw. besser wäre "raw_input", aufrufen:
Code: Alles auswählen
>>> n = input()
42
>>> type(n)
<type 'int'>
>>> n = raw_input()
42
>>> type(n)
<type 'str'>
>>> n = int(n)
>>> type(n)
<type 'int'>
Grüße
Gerrit
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 17:15
von Gipsyjack
Vielen Dank das hab ich gebraucht

und n paar neue befehle auch noch dazu gelernt ^^
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 19:20
von Gipsyjack
Also will nicht nochmal n neuen Thread aufmachen und unnötig "Müll" verursachen
will die gesamte Funktion jetzt Iterativ schreiben:
Code: Alles auswählen
#!/usr/bin/python
import math
import sys
n = input()
def fib(n):
a=0
b=1
for i in range(n):
a, b = b, a+b
return a
#if n == 0:
#return 0
#elif n == 1:
#return 1
#else:
#return fib(n-1.0) + fib(n-2.0)
print fib(n)
so kommen auch die richtigen ergebnisse raus, aber warum kommt was anderes raus wenn ich statt
schreibe??
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 19:23
von cofi
Letzteres ist aequivalent zu `b = 2 * b`.
Ersteres wertet erst die rechte Seite aus, d.h. das `a` dort ist noch das alte `a`, nicht `b`.
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 20:29
von Gipsyjack
ok danke, ich wollts ausführlicher schreiben war dann aber verwirrt warums nicht ging... eine bitte hätte ich noch:
ich wollte mir jetzt die Fibonacci Zahlen noch in eine Datei ausgeben.
dazu starte ich das Skript in Python wie folgt:
damit leite ich die ausgabe in die datei um.
jedoch kommt in der datei nur die geforderte fib-Zahl raus und nicht die verherigen, ich habe es mit einem zähler probiert aber das bringt auch nichts..
Code: Alles auswählen
#!/usr/bin/python
import math
import sys
n = input()
def fib(n):
i=0
while i<n:
a=0
b=1
for i in range(n):
a, b = b, a+b
print a
return a
i = i + 1
print fib(n)
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 20:51
von nomnom
`>` schreibt die Datei ja auch immer neu. Du magst `>>` ausprobieren.
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 20:56
von Gipsyjack
nomnom hat geschrieben:`>` schreibt die Datei ja auch immer neu. Du magst `>>` ausprobieren.
trotz dessen wird nur die n-te fib-zahl ausgegeben, ich muss irgendwas in der while-Bedingung ändern, damit er nach jedem Schritt einen Wert ausgibt..
kann man das auch noch schöner gestalten, dass das starten in linux wgfällt, also die stdout in die datei legen?
EDIT:
Das mit der Ausgabe habe ich hinbekommen:
einfach diese zeile an Anfang einfügen
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 21:46
von Gipsyjack
Für diejenigen dies interessiert hier die Lösung, habs noch rausgefunden:
Code: Alles auswählen
#!/usr/bin/python
import math
import sys
sys.stdout = open("Zahlen","w")
n = input()
a=0
b=1
i=0
while i<n:
a, b = b, a+b
i = i + 1
print "f",i,"ist",a
danke an alle für die hilfe!!!
Re: Problem mit str und int
Verfasst: Sonntag 28. November 2010, 22:59
von jbs
Sehr sehr dreckig.
Re: Problem mit str und int
Verfasst: Montag 29. November 2010, 15:52
von b.esser-wisser
jbs hat geschrieben:Sehr sehr dreckig.
Falls für jemandem unklar sein sollte wie es besser geht:
http://paste.pocoo.org/show/297571/
hth, Jörg
Re: Problem mit str und int
Verfasst: Montag 29. November 2010, 15:57
von EyDu
Für "get_fibonacci_numbers" wäre hier ein (unendlicher) Generator besser angebracht.
Re: Problem mit str und int
Verfasst: Montag 29. November 2010, 19:33
von b.esser-wisser
@Eydu: stimmt natürlich
Code: Alles auswählen
In [1]: def get_fibo():
...: a, b = 0,1
...: while True:
...: a, b = b, a + b
...: yield a
...:
In [2]: import itertools
In [3]: l = list(itertools.takewhile(lambda n: n<1000, get_fibo()))
In [4]: l
Out[4]: [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]
Gibt es eigentlich irgendeine Anwendung für Fibonacci-Zahlen?
Re: Problem mit str und int
Verfasst: Montag 29. November 2010, 19:59
von EyDu
Die Tauchen eigentlich überall mal mehr oder weniger unerwartet auf.
Hier ist so einiges aufgelistet, bin es aber selber nicht durchgegangen.
Re: Problem mit str und int
Verfasst: Montag 29. November 2010, 20:44
von BlackJack
@b.esser-wisser: `itertools.islice()` ist IMHO weniger umständlich als `takewhile()` + ``lambda``.
Re: Problem mit str und int
Verfasst: Montag 29. November 2010, 20:58
von hendrikS
Fuer grosse n stoesst Du aber schnell an die Grenzen Deines PCs. In diesem Dokument
http://www.mathematik.uni-muenchen.de/~ ... zth_01.pdf ist eine Methode beschrieben mit der man fib(n) wesentlich schneller berechnen kann. Mal nach der 2x2 Matrix mit den drei Einsen und der einen Null suchen. Ist auch eine schoene Uebung das mal umzusetzen.