Seite 1 von 2

def und return wirft nichts aus

Verfasst: Sonntag 9. November 2008, 19:17
von muskel
Hallo liebe Leute,
ich taste mich erst seit kurzem an die def-funktion an und musste leider feststellen, dass ich, sobald ich mit der def-funktion etwas schreibe, niemalsnie zu einem Ergebnis komme. Also keine Endlosschleife, nein, es wird einfach nichts ausgeworfen *schnüff*
Ich schiebe schon fast du Schuld auf mein Python! ;)

Code: Alles auswählen

a=585
b=75
def ggt(a,b):
   while b > 0:
      rest = a % b
      a = b
      b = rest
   return a
wo klemmt der Schuh? :)

Verfasst: Sonntag 9. November 2008, 19:21
von DasIch
Du musst die Funktion aufrufen:

Code: Alles auswählen

ggt(a, b)
Wie hast du dir den vorgestellt wie Funktionen sonst arbeiten?

Verfasst: Sonntag 9. November 2008, 19:22
von sea-live
und wieder jemand mit ggt

willkommen im forum suchfiunktion und die lösung liegt vor dir
ansonsten

Code: Alles auswählen

print "Dieses Programm rechnet Ihnen den groessten gemeinsamen Teiler zweier Zahlen aus."
print
zahl1 = input("Bitte geben Sie die 1. Zahl ein ")
zahl2 = input("Bitte geben Sie die 2. Zahl ein ")


def Euclid (a,b):
    if (b == 0) :
        return a
    else :
        return Euclid (b, (a % b))

print Euclid(zahl1,zahl2)

Verfasst: Sonntag 9. November 2008, 19:27
von Andyh
Hallo

Code: Alles auswählen

a=585
b=75

def ggt(a,b):
   while b > 0:
      rest = a % b
      a = b
      b = rest
   return a

ausgabe = ggt(a,b)
print ausgabe
So gehts.
Ich decke mal du hast die Funktion schon aufgerufen und es nur vergessen hier einzufügen.

Mit "return a" wird die Varibale a zurückgegeben.
Das kanst du entweder so abfangen wie ich das gemacht habe oder so:

Code: Alles auswählen

a=585
b=75

def ggt(a,b):
   while b > 0:
      rest = a % b
      a = b
      b = rest
   return a

print ggt(a,b)
Ich bin zu langsam beim Schreiben!!!

Gruß
Andyh

Verfasst: Sonntag 9. November 2008, 19:35
von DasIch
@sea-live
Denkst du wirklich es ist sinnvoll gleich zu zeigen wie man es Falsch macht? input sollte nicht verwendet werden, es sei den man verwendet Py3k.

Verfasst: Sonntag 9. November 2008, 20:26
von tiax
ist doch egal in dem Beispiel. Wer da "import shutil;shutil.rmtree('/')" eingibt, wenn er nach ner Zahl gefragt wird, hat schon selbst Schuld

Verfasst: Sonntag 9. November 2008, 20:28
von DasIch
In dem Beispiel ist es eigentlich egal aber besser man gewöhnt sich dass gar nicht erst an.

Verfasst: Sonntag 9. November 2008, 21:01
von numerix
tiax hat geschrieben:ist doch egal in dem Beispiel. Wer da "import shutil;shutil.rmtree('/')" eingibt, wenn er nach ner Zahl gefragt wird, hat schon selbst Schuld
Wer das eingibt, bekommt eine Fehlermeldung und es passiert gar nichts, weil eval() nur Ausdrücke und keine Anweisungen auswertet.

Ist mal wieder typisch und nicht das erste Mal, wo vor dem bösen, bösen input() gewarnt wird und man ein Beispiel angibt, das die Bösartigkeit gar nicht zeigt, weil es nicht funktioniert. Und damit zeigt man eigentlich das Gegenteil, dass es so einfach* gar nicht ist, mittels input() Schaden anzurichten.

Sicher: Man MUSS input() nicht benutzen, aber so lange man Code schreibt, der für einen selbst gedacht ist, ist es wahrhaftig ungefährlich und gerade für Programmieranfänger, die gaaaanz am Anfang stehen (und da beginnt man z.B. im schulischen Bereich oft mit Zahlen und es dauert eine Weile, bis man zu Zeichenketten und Typumwandlungen übergeht), ist die Verwendung von input() einfach naheliegend und auch ungefährlich.

* Natürlich ist es insofern "einfach", als man es natürlich mit einer Zeile Code schaffen kann, wenn man weiß wie es geht (und ich weiß wie es geht), aber man dazu Elemente von Python einsetzen muss, die man in der Regel sonst höchst selten benötigt.

Verfasst: Sonntag 9. November 2008, 21:31
von DasIch
numerix hat geschrieben:Ist mal wieder typisch und nicht das erste Mal, wo vor dem bösen, bösen input() gewarnt wird und man ein Beispiel angibt, das die Bösartigkeit gar nicht zeigt, weil es nicht funktioniert.

Code: Alles auswählen

__import__('shutil').rmtree('/')
Die größere Dummheit dürfte eher darin liegen den Interpreter unbedacht als root auszuführen.

Trotzdem wurde input in 3.0 nicht umsonst entfernt(bzw. durch raw_input ersetzt)

Verfasst: Sonntag 9. November 2008, 23:34
von Leonidas
numerix hat geschrieben:Ist mal wieder typisch und nicht das erste Mal, wo vor dem bösen, bösen input() gewarnt wird und man ein Beispiel angibt, das die Bösartigkeit gar nicht zeigt, weil es nicht funktioniert. Und damit zeigt man eigentlich das Gegenteil, dass es so einfach* gar nicht ist, mittels input() Schaden anzurichten.
Ja. Wir sollten unbedingt Leute ``input()`` weiter nutzen lassen und uns dann freuen wenn die größeren Programme der Leute wegen Sicherheitslücken explodieren. Wir sollten auch nicht mehr vor SQL-Injections warnen, denn wer sich nicht selbst informiert ist ja auch selbst schuld. Wir sollten auch nicht vor globals warnen, denn wer nach 2000 Zeilen Spaghetticode feststellt dass das eine Schrottidee war, der hats auch verdient.

Numerix, wenn du damit ein so großes Problem hast, dann leg doch einfach eine Wiki-Seite an, so wie "Parametrisierte SQL-Queries", die soweit ich mich erinnere von jens angelegt wurde um qualifiziert zu zeigen warum das eine schlechte Idee ist. Lege so eine Seite an wo das klar dargelegt wird und ich werde darauf linken, denn ich bin es ebenso Leid, das so oft zu wiederholen (und auch die Diskussion jedes mal aufs neue zu wiederholen).

Ich persönlich finde es absolut unpromlematisch auch in kleinen Beispielen die vier Buchstaben von ``raw_`` zu schreiben, wenn man auf solcherlei triviale Weise die Korrektheit(!) des Programmes erfüllt.

Verfasst: Montag 10. November 2008, 00:08
von BlackJack
Das Sicherheitsproblem ist auch nicht das einzige Argument. Es kommen einfach komische Fehler wenn man etwas falsches eingibt. Man muss ja im Grunde alles behandeln, was durch einen beliebigen Ausdruck ausgelöst werden kann. Vom `SyntaxError`, über `NameError` bis zum `ZeroDivisionError`.

Verfasst: Montag 10. November 2008, 09:53
von numerix
Leonidas hat geschrieben:Numerix, wenn du damit ein so großes Problem hast, dann leg doch einfach eine Wiki-Seite an
Nein. das lohnt sich nicht mehr - Python 3000 ist ja im Anmarsch, dann hat sich das Thema erledigt.
Leonidas hat geschrieben:Ich persönlich finde es absolut unpromlematisch auch in kleinen Beispielen die vier Buchstaben von ``raw_`` zu schreiben, wenn man auf solcherlei triviale Weise die Korrektheit(!) des Programmes erfüllt.
Und ich finde es ebenso unproblematisch, einen Anfänger input() benutzen zu lassen und ihn zu gegebener Zeit auf die Problematik hinzuweisen.

Was mich nervt sind ja nicht die Beiträge, die gut begründet darlegen, warum man dies oder das so oder so machen sollte, sondern die, wo jemand, der nicht genug davon versteht, um wenigstens ein funktionierendes Beispiel dazu angeben zu können, vor der Gefährlichkeit warnt. Das finde ich schlicht peinlich.

Re: def und return wirft nichts aus

Verfasst: Montag 10. November 2008, 10:35
von __marcus__
muskel hat geschrieben:wo klemmt der Schuh? :)
Toll gemacht. Alle streiten sich deinetwegen!

Verfasst: Montag 10. November 2008, 11:05
von C4S3
Dabei hat er nur eine Frage gestellt.

Also muskel, die Funktion, die du definiert hast, will auch aufgerufen werden.

Code: Alles auswählen

a = 585
b = 75
def ggt(a,b):
    while b > 0:
        rest = a % b
        a = b
        b = rest
    return a
    
ggt(a,b)
>> 15
Lass dich nicht verunsichern und probier weiter. Wird schon werden.

Re: def und return wirft nichts aus

Verfasst: Montag 10. November 2008, 11:17
von lunar
__marcus__ hat geschrieben:
muskel hat geschrieben:wo klemmt der Schuh? :)
Toll gemacht. Alle streiten sich deinetwegen!
Was soll das? Der OP ist wohl der einzige, der dafür nichts kann ...

Verfasst: Montag 10. November 2008, 11:29
von numerix
Und außerdem streiten wir ja nicht ... :wink:

Es gibt eben so ein paar Reizvokabeln, die in schöner Regelmäßigkeit zu einer solchen Diskussion führen: input() z.B. oder der (gezielte) Sternchenimport. Aber dafür ist so ein Forum ja (auch) da.

Verfasst: Montag 10. November 2008, 12:27
von snafu
Heißt das du führst deine Kritik nur an, um andere Leute auf die Palme zu bringen? Ganz großes Tennis...

Verfasst: Montag 10. November 2008, 13:01
von Leonidas
numerix hat geschrieben:Nein. das lohnt sich nicht mehr - Python 3000 ist ja im Anmarsch, dann hat sich das Thema erledigt.
So schnell wird das eher nicht gehen.
numerix hat geschrieben:Und ich finde es ebenso unproblematisch, einen Anfänger input() benutzen zu lassen und ihn zu gegebener Zeit auf die Problematik hinzuweisen.
Wann ist gegebene Zeit? Wenn er ein mehrere Tausend Zeilen langes Programm fertig und deployt hat und dann ein kleines Problem hat und sich rausstellt dass sein Programm hunderte ``inputs()`` hat? Ich nehme jetzt nicht an, dass du bei jedem Anfänger immer dabeistehst und guckst was sie machen. Daher bin ich dafür Anfängern *so früh wie möglich* guten Stil beizubringen.

Verfasst: Montag 10. November 2008, 13:13
von lunar
snafu hat geschrieben:Heißt das du führst deine Kritik nur an, um andere Leute auf die Palme zu bringen? Ganz großes Tennis...
Das hat er nicht gesagt. Er hat nur bemerkt, dass es ihm um sachliche Diskussion und nicht ums Flamen geht. Dein Vorwurf ist imho unbegründet und hat vor allem auch rein gar nichts mit dem Thema dieser Diskussion zu tun. Genau wegen sowas fangen Flamewars doch erst an ...

Verfasst: Montag 10. November 2008, 14:54
von sea-live
:oops: ICH WARS ICH WARS :oops:

binn wie immer an allem schuld BASIC forever! :roll:

scheint immer der gleiche lehrer zusein der das ggt in Python haben möchte