Problem mit str und int

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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?
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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()
%>
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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...
Benutzeravatar
gkuhl
User
Beiträge: 600
Registriert: Dienstag 25. November 2008, 18:03
Wohnort: Hong Kong

"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
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

Vielen Dank das hab ich gebraucht :)
und n paar neue befehle auch noch dazu gelernt ^^
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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

Code: Alles auswählen

a, b = b, a+b

Code: Alles auswählen

a = b
b = a + b
schreibe??
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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`.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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:

Code: Alles auswählen

python fib2.py > fibonacci.txt
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)
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

`>` schreibt die Datei ja auch immer neu. Du magst `>>` ausprobieren.
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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

Code: Alles auswählen

sys.stdout = open("Dateiname","w")
Gipsyjack
User
Beiträge: 23
Registriert: Samstag 13. November 2010, 20:19

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!!!
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Sehr sehr dreckig.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

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
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Für "get_fibonacci_numbers" wäre hier ein (unendlicher) Generator besser angebracht.
Das Leben ist wie ein Tennisball.
Benutzeravatar
b.esser-wisser
User
Beiträge: 272
Registriert: Freitag 20. Februar 2009, 14:21
Wohnort: Bundeshauptstadt B.

@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?
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Die Tauchen eigentlich überall mal mehr oder weniger unerwartet auf. Hier ist so einiges aufgelistet, bin es aber selber nicht durchgegangen.
Das Leben ist wie ein Tennisball.
BlackJack

@b.esser-wisser: `itertools.islice()` ist IMHO weniger umständlich als `takewhile()` + ``lambda``.
Benutzeravatar
hendrikS
User
Beiträge: 420
Registriert: Mittwoch 24. Dezember 2008, 22:44
Wohnort: Leipzig

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.
Antworten