pbm-Flagge

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

@Meishere: Also einfach Fehler unkommentiert übernehmen ist etwas was man in der Schule nicht machen sollte. Schule soll einen doch nicht zu einem tumben Befehlsempfänger erziehen, der nichts in Frage stellt. Wenn das Daten im Portable Bitmap (PBM) Format sein sollen, dann ist das Komma an der Stelle falsch. Ein Lehrer der eine Korrektur mit Begründung an der Stelle nicht anerkennt, sollte vielleicht einen anderen Beruf wählen. Wichtig ist die Begründung, so dass der Lehrer nicht denkt es war eine Unachtsamkeit von Dir das Komma weg zu lassen. Man könnte also zum Beispiel die Stelle kommentieren, dass da vorher ein Komma stand, an der Stelle laut Spezifikation aber nur "whitespace" erlaubt ist. Als Quelle kann man zum Beispiel Wikipedia (http://de.wikipedia.org/wiki/Portable_Bitmap) oder die Dokumentation von netpbm (http://netpbm.sourceforge.net/doc/pbm.html) angeben.

Die ganzen Zahlen da hart rein zu schreiben ist nicht besonders wartbar. An den `range()`-Argumenten ist auch unschön, dass man nachdenken muss wenn man beide Argumente übergibt. Bei einem ``range(25)`` sieht man viel leichter wie viele Elemente da in der Liste enthalten sind -- kann man einfach ablesen: 25. Bei ``range(1, 26)`` muss man sich beide Argumente anschauen und dann auch noch rechnen um auf die 25 zu kommen.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

@BlackJack: Ja du hast natürlich recht und unsere Lehrerin ist auch nicht so, dass sie wütend wäre oder sich nicht "verbessern" lässt.
Ich werde sie aber erst in der nächsten Informatik-Stunde drauf ansprechen und habe erstmla meine Hausaufgaben so gemacht "wie sie es will". Solange es funktioniert ist es ja nur ein "Schönheitsfehler".

@EyDu: Ah. Jetzt habe ich dich verstanden. Einfach schleife ohne print aufrufen und schon klappt's. Da hat mir wieder meine Lehrerin was falsches erzählt bzw. uns etwas vorenthalten... Nämlich, dass man Funktionen auch ohne "print" ausgeben kann-.-

EDIT: Ok, ich habe jetzt doch meine Lehrerin informiert und das Ganze auch in den Kommentaren geschrieben. Mal sehen wie sie reagiert.
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Meishere hat geschrieben:@EyDu: Ah. Jetzt habe ich dich verstanden. Einfach schleife ohne print aufrufen und schon klappt's. Da hat mir wieder meine Lehrerin was falsches erzählt bzw. uns etwas vorenthalten... Nämlich, dass man Funktionen auch ohne "print" ausgeben kann-.-
Ich würde sagen, dass du da eher etwas falsch verstanden hast ;-) "print" macht die Ausgabe von Werten und hat keine magischen Auswirkungen auf die möglicherweise aufgerufenen Funktionen. Funktionen führen lediglich die in ihnen enthaltenen Anweisungen aus. Und wenn da ein "print" steht, dann wird eben einfach etwas ausgegeben. Ist es eine Addition, dann wird eben etwas addiert.

Sebastian
Das Leben ist wie ein Tennisball.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Hmmm... Ok.
Dann habe ich dich wohl doch flasch verstanden...
Aber dann frage ich mich, wieso der Fehler nicht mehr auftritt, wenn man print wegnimmt.
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Um EyDu zu ergaenzen: Funktionen fuehren nur den Code aus den sie enthalten, aber geben _immer_ auch etwas zurueck. Gibt es kein explizites `return` in der Funktion wird `None` zurueckgegeben.
Und damit ist das `print` an der Stelle (fast) dasselbe wie folgendes:

Code: Alles auswählen

In [1]: print None
None
BlackJack

@Meishere: Weil ohne das ``print`` eben nicht mehr der "Datenmüll" ausgegeben wird. Die Rückgabewerte von den Funktionen haben doch nichts in den PBM-Daten zu suchen. Du nimmst ja nicht die ``print``\s weg, welche die 0en und 1en ausgeben.

Das was hinter ``print`` steht wird ausgewertet und dann ausgegeben. Literale wie Zahlen oder Zeichenketten werden zu sich selbst ausgewertet; Operatoren wie ``+``, ``*``, usw. werden angewendet und das Ganze wird zu einem Ergebnis ausgewertet; und Funktionen werden ausgeführt und durch ihren Rückgabewert ersetzt. Wenn eine Funktion nichts explizit mit einer ``return``-Anweisung zurück gibt, dann ist ihr Rückgabewert `None`. Du kannst Dir also vorstellen, dass am Ende jeder Funktion ein ``return None`` steht. Vielleicht hilft ja diese kleine Sitzung beim Verständnis:

Code: Alles auswählen

In [18]: print 42
42

In [19]: print 42 * 23
966

In [20]: print math.sqrt(25)
5.0

In [21]: def f(n):
   ....:     print '*' * n
   ....: 

In [22]: f(10)
**********

In [23]: print f(10)
**********
None
Bei [18] wird einfach nur die 42 ausgegeben. Bei [19] wird der Ausdruck ausgewertet. Bei [20] wird die `sqrt()`-Funktion mit 25 aufgerufen und die gibt die Quadratwurzel (`sqrt` steht für "square root") zurück und die wird dann von ``print`` ausgegeben.

Bei [21] wird eine Funktion definiert die `n` Sternchen mit ``print`` ausgibt. Wenn man diese Funktion aufruft, tut sie das wie man bei [22] sieht, auch. Und bei [23] ist dann das was Du gemacht hast: Es wird die Funktion aufgerufen; die gibt mit ``print`` 10 Sternchen aus; und *dann* wird durch das ``print`` vor dem Aufruf der implizite Rückgabewert von dem Funktionsaufruf ausgegeben. Und das ist halt in diesem wie auch in Deinem Fall unsinnig.
Meishere
User
Beiträge: 27
Registriert: Montag 24. Januar 2011, 16:54

Oh, danke, dass ihr euch so viel Mühe macht :D
So etwas ähnliches habe ich mir schon gedacht. Schließlich sieht man ja, wenn man das Python-Programm laufen lässt, dasss immer none mit ausgegeben wird.
Aber jetzt habe ich das ganze erst richtig verstanden. Da scheinen ein paar wichtige Grundkenntnisse an mir vorbeigegangen zu sein. Ohne meine Lehrerin schlecht mache zu wollen, liegt es wohl an ihr :(
Sie hat uns das ganze nur so halb erklärt. Wir haben als erstes Beispiel eine Funktion mit return gehabt und diese mit print aufgerufen, bei den anderen Funktionen (ohne return) haben wir es genauso gemacht und uns nciht daran gestört, dass "none" mit ausgegeben wurde.
Ich glaube unsere Lehrerin ist ein bisschen überfordert, da sie ja mehrere Programmiersprachen gleichzeitig unterrichten muss :mrgreen:

Naja. Danke nochmal. Das Forum ist echt hilfreich :)

Schöne Grüße
Jetzt sind die guten alten Zeiten, nach denen wir uns in zehn Jahren zurücksehnen.
Peter Ustinov

Jeder Mensch macht Fehler. Das Kunststück liegt darin, sie dann zu machen, wenn keiner zuschaut.
Peter Ustinov
Antworten