Ich versteh den Code nicht so wirklich^^

Objektorientierte Skriptsprache: (python.org)
Antworten
sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Ich versteh den Code nicht so wirklich^^

Beitrag von sashpta » Sa Jan 03, 2015 1:26 am

Hey
ich bin grade dabei Python zu lernen, nun habe ich hier einen Code aber ich verstehe vieles davon nicht so wirklich, vllt könnt ihr mir ja helfen und mir das mal erklären :)

Code: Alles auswählen

from sys import argv

script, input_file = argv

def print_all(f):
	print f.read()
	
def rewind(f):
	f.seek(0)
	
def print_a_line(line_count, f):
	print line_count, f.readline()
	
current_file = open(input_file)

print "First let's print the whole file:\n"

print_all(current_file)

print "Now let's rewind, kind of like a tape."

rewind(current_file)

print "Let's print three lines:"

current_line = 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)

current_line = current_line + 1
print_a_line(current_line, current_file)
also erstmal was ich glaube von dem Code zu verstehen

Code: Alles auswählen

def print_all
wir geben der Funktion einen Namen, genauso wie in

Code: Alles auswählen

def rewind
und

Code: Alles auswählen

def print_a_line
. Soweit so gut, nun haben wir aber in Klammern von jeder Funktion ein f stehen und in

Code: Alles auswählen

def print_a_line
nich ein line_count
so also soweit ich das jetzt verstanden habe ist das f nur eine Variable, aber woher weiß Python jetzt womit die Variable definiert wird? also ich glaube f ist die Variable für file in diesem Fall, aber woher weiß Python, dass f für file stehen soll? ich könnte ja auch anstatt f z.B. haus schreiben.
so dann ist unter der ersten und letzten Funktion der Befehl print, also wird in PowerShell etwas angezeigt, aber was jeweils?
f.read heißt doch nur, dass die (in diesem Fall die Textdatei) gelesen wird oder?
f.seek(0) sucht doch den Byte 0 raus also den Anfang von der Datei.
und f.readline heißt doch, dass man nur eine bestimmte Zeile lesen möchte, aber was bedeutet line_count denn noch dabei ? und woher weiß Python welche Zeile?

dannach setzten wir bei

Code: Alles auswählen

current_file = open(input_file)
eine Variable, current_file, die wird mit dem Befehl definiert die in der Komandozeile (in PowerShell) angegebene Textdatei zu öffnen oder?

dann kommt

Code: Alles auswählen

print "First let's print the whole file:\n"
ein String mit einem Absatz am Ende wird angezeigt

dann

Code: Alles auswählen

print_all(current_file)
print_all ist der Name von der ersten Funktion und current_file heißt, dass die Textdatei die in der Komandozeile angegeben wurde geöffnet wird. heißt das jetzt, dass
print_all(f) mit dem current_file "verbunden" wird, also, dass ab jetzt Python weiß was f genau ist? <- das versteh ich so garnicht ^^

dann wird wieder ein String angezeigt und wieder das selbe spiel wie vorher nur mit der zweiten Variable <- versteh ich wieder nicht ^^

wieder ein String und dann wird current_line mit Zeile 1 definiert oder?
dann wird die Zeile 1 angezeigt aber wie und wieso?

dann wird zu dem current_line eine Zeile dazu gerechnet (1 + 1 = Zeile 2), also wird nun Zeile 2 angezeigt und danach Zeile 3, aber warum und wie?

Also ich verstehe das mit den Funktionen da oben so garnicht ^^

hoffe ihr könnt mir helfen :)

Danke

LG

Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von darksider3 » Sa Jan 03, 2015 1:01 pm

so also soweit ich das jetzt verstanden habe ist das f nur eine Variable, aber woher weiß Python jetzt womit die Variable definiert wird? also ich glaube f ist die Variable für file in diesem Fall, aber woher weiß Python, dass f für file stehen soll? ich könnte ja auch anstatt f z.B. haus schreiben.
Weiß es nicht. Deshalb wird das in dem Tutorial, das Du gelesen haben wirst(hoffe ich jedenfalls) sicher auch erwähnt, dass man hier von einer Tatsache ausgeht. Sprich, in diesem Programm __kann__ es gar nichts anderes als das Objekt für file sein. Python brauch das nicht zu wissen, weil der Zustand vom Programmierer(hoffentlich) sinnvoll definiert wurde, und genutzt wird.

Falls Du aber nicht weißt, was ein Objekt ist: Wenn Du beispielsweise(wie bei dir) eine Datei öffnest, wird von Python mit open() ein Objekt an die Variable übergeben, um darauf bestimmte Aktionen, wie z.B file.write auszuführen. Da brauch man am Ende auch nicht mit dem Klassennamen(glaube zumindest das dies eine war) agieren.
Diese Variable kannst Du dann überall hinschieben. Wie die Funktion print_all(f) beispielsweise. Du übergibst einfach das Objekt, dass Du von open() bekommen hast, durch die Variable(current_file) an die Funktion. Und zwar als solches. So kann man auf diesem Objekt.. blah, siehe Absatz hier drüber. Deshalb brauch Python auch nichts darüber zu wissen, was das Objekt im genauen für dich ist... es könnte auch eine Klasse Namens "Foo" sein, die zufällig die selben Funktionen hat(wenn Du nicht explizit ein file-Objekt verlangst, was hier ja nicht der Fall ist). :)
so dann ist unter der ersten und letzten Funktion der Befehl print, also wird in PowerShell etwas angezeigt, aber was jeweils?
f.read heißt doch nur, dass die (in diesem Fall die Textdatei) gelesen wird oder?
file.read() liest soviel es möglich ist aus einer Datei, was meistens(oder immer), bis ans Ende der Datei ist, es sei denn, Du übergibst der Datei eine Zahl(f.read(LeseXZeichen), also beispielsweise für 5 Zeichen f.read(5)).
f.seek(0) sucht doch den Byte 0 raus also den Anfang von der Datei.
Naja, fast. ^^ f.seek(0) setzt den Zeiger in der Datei auf die Position 0, um von dort wieder an zu fangen. Das ist nötig, wenn man durch eine Lese/Schreibaktion irgendwie die Position verlässt(eben durch Lesen/schreiben), oder aber die Datei am Ende geöffnet wird.
und f.readline heißt doch, dass man nur eine bestimmte Zeile lesen möchte, aber was bedeutet line_count denn noch dabei ? und woher weiß Python welche Zeile?
file.readline() liest bis zum Ende einer Zeile(makiert durch einen Zeilenumbruch(\n) oder EOF), und setzt dann in der nächsten Zeile den Zeiger. Genau das selbe passiert dann auch bei der Funktion print_a_line(current_line, current_file). Hier wird einfach die Zahl current_line +1 gerechnet, dadurch wird es erst 1, dann 2 und dann 3. Das hat nichts mit der Funktion readline() zu tun, wie man in der Funktion sehen kann. Es wird einfach der Dateizeiger auf Anfang gesetzt, und hypothetisch gesagt, das dies Zeile 1,2,3 ist.(könnte ja auch 5,6,7 sein, jenachdem ob der User weiter gelesen hat oder nicht, deshalb hypothetisch :) )

Ansonsten, welches Tutorial liest Du? Wenn es sowas nicht erklärt, ist es definitiv nichts, woran man was lernen sollte.. ._.

Grüße :)
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir :)
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von sashpta » So Jan 04, 2015 12:02 am

Vielen Dank für die Antwort :)

Ich benutze dieses Tutorial http://learnpythonthehardway.org/book/ die Aufgabe hier ist die Nummer 20 :)
Joa das ist so aufgebaut, dass sich alles so im Verlauf erklären soll, nur das Problem ist, wenn die Aufgabe lautet die einzelnen Zeilen zu erklären und man diese zu dem Zeitpunk nicht versteht bringt das einem auch nichts wenns später mal erklärt wird ^^

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8858
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von Xin » So Jan 04, 2015 11:29 am

sashpta hat geschrieben:Vielen Dank für die Antwort :)

Ich benutze dieses Tutorial http://learnpythonthehardway.org/book/ die Aufgabe hier ist die Nummer 20 :)
Joa das ist so aufgebaut, dass sich alles so im Verlauf erklären soll, nur das Problem ist, wenn die Aufgabe lautet die einzelnen Zeilen zu erklären und man diese zu dem Zeitpunk nicht versteht bringt das einem auch nichts wenns später mal erklärt wird ^^
Ich habe Assembler 'the hard way' gelernt: Die in dem Buch abgedruckten Listings waren falsch, aber es standen Befehle drin - wenn der Übersetzer sie syntaktisch nicht anmeckert, müssen sie ja irgendwas bewirken. Wenn man verstanden hatte, was in dem abgedruckten Listing (falsch) gemacht wurde, konnte man es so umschreiben, dass es das im Buch beschriebene Problem löst. ^^

Wenn ein Tutorial schon "the hard way" heißt... klingelt da nix? :-D
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von sashpta » So Jan 04, 2015 12:40 pm

Ja schon deswegen habe ich ja hier gefragt ums zu verstehen ^^
Wie meinst du das mit den Listings und diesem Assembler?

Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von darksider3 » Mo Jan 05, 2015 1:04 am

Listings: Code XY löst folgendermaßen das folgende Problem korrekt und gibt XY aus.
Assembler: Programmiersprache die sehr hardware-nah ist, und als besonders schwierig gilt(siehe Wikipedia)

Lies lieber ein ordentliches Tutorial, bis Du Programmiertechnische Grundlagen gelernt hast. Diese "The Hard-Way" Tutorials bringen einem als Anfänger erstmal wenig, wenn man nicht gerade Stunden und Tage in ein einziges Codeschnippselchen stecken will oder kann.
Das offizielle bsp.: https://docs.python.org/3/tutorial/
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir :)
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von sashpta » Mo Jan 05, 2015 2:40 am

Oke danke :)

Also erst das tutorial durcharbeiten und dann das Buch richtig?

Benutzeravatar
darksider3
Beiträge: 347
Registriert: Fr Sep 14, 2012 6:26 pm
Wohnort: /dev/sda1
Kontaktdaten:

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von darksider3 » Mo Jan 05, 2015 10:25 am

Such dir einfach was aus. ;) Hängt davon ab, wv. Zeit und Lust Du hast. Das "The hard way"-Zeugs dauert länger, aber bringt dir im Endeffekt mehr. Musst Du aber aufmerksamer Lesen.

Das offizielle Tutorial geht im grunde schneller, aber deckt nicht soviel ab(Codestil usw.), und Du "musst" weniger selbst machen. Bis auf lesen natürlich.
effizienz ist, wenn ich ein loch bohre und hinterher mein nachbar auch ein bild aufhängen kann... ^^
Meine Homepage und der Microblog von mir :)
Live Life dont let Life Live You!
Am meisten Aktiv in Webentwicklung und PHP im Wiki

sashpta
Beiträge: 104
Registriert: Fr Dez 12, 2014 2:55 pm

Re: Ich versteh den Code nicht so wirklich^^

Beitrag von sashpta » Mo Jan 05, 2015 1:24 pm

Hm oke danke ich werd mal sehen :)

Antworten