Seite 1 von 1
Byte of Python - unklarheit
Verfasst: Montag 29. März 2010, 21:28
von mastachief
Huhu,
so mache ja derzeit das Byte of Python durch und bin nun bei den Listen.
Code: Alles auswählen
#!/usr/bin/python
# Dies ist meine Einkaufsliste
einkaufsliste = ['Aepfel', 'Mangos', 'Karotten', 'Bananen']
print 'Ich habe', len(einkaufsliste), 'Dinge einzukaufen.'
print 'Diese Dinge sind:', # Beachten Sie das Komma am Zeilenende
for ding in einkaufsliste:
print ding,
print '\nIch muss auch Reis einkaufen.'
einkaufsliste.append('Reis')
print 'Meine Einkaufsliste ist jetzt', einkaufsliste
print 'Jetzt werde ich meine Einkaufsliste sortieren.'
einkaufsliste.sort()
print 'Die sortierte Einkaufsliste ist', einkaufsliste
print 'Zuerst werde ich', einkaufsliste[0], 'kaufen.'
altesding = einkaufsliste[0]
del einkaufsliste[0]
print 'Ich habe', altesding, 'gekauft.'
print 'Meine Einkaufsliste ist jetzt', einkaufsliste
Das kommt dann raus:
$ python listen.py
Ich habe 4 Dinge einzukaufen.
Diese Dinge sind: Aepfel Mangos Karotten Bananen
Ich muss auch Reis einkaufen.
Meine Einkaufsliste ist jetzt ['Aepfel', 'Mangos', 'Karotten', 'Bananen', 'Reis']
Jetzt werde ich meine Einkaufsliste sortieren.
Die sortierte Einkaufsliste ist ['Aepfel', 'Bananen', 'Karotten', 'Mangos', 'Reis']
Zuerst werde ich Aepfel kaufen.
Ich habe Aepfel gekauft.
Meine Einkaufsliste ist jetzt ['Bananen', 'Karotten', 'Mangos', 'Reis']
Hier ist mir etwas sehr unklar.
print 'Diese Dinge sind:', # Beachten Sie das Komma am Zeilenende
for ding in einkaufsliste:
print ding,
Die Variable "Ding" ist doch gar nirgens definiert. Woher weiß dann das Programm das er mit der Variable "Ding" jeweils ein String aus der Liste gemeint ist?
Grüße vom Einsteiger

Verfasst: Montag 29. März 2010, 21:36
von Leonidas
Na durch das ``for``, dort wird definiert dass ``ding`` erst das erste Element der Liste ist, dann das zweite Element der Liste, dann das dritte....
Verfasst: Dienstag 30. März 2010, 00:30
von mouses
Klartext: die Variable Ding wird in der for-Zeile definiert, gilt dann aber auch nur innerhalb des for-blockes. In anderen Sprachen (genauer C++) muss für sowas explizit ein Iterator verwendet werden, oder aber ein kompleter for-Block:
for (int i = 0; i < liste.length; i++) {
cout << liste;
}
Java kann das übrigens auch mittels foreach.
noch was: Variablen werden in Python soweit ich weiß nie direkt als Typ deklariert, sondern bekommen automatisch den Typ des Wertes, der ihnen als erstes zugewiesen wird. Nachteil: wenn man das anders gewohnt ist übersieht man gerne die erste Definition einer Variable
Verfasst: Dienstag 30. März 2010, 01:06
von gkuhl
mouses hat geschrieben:Klartext: die Variable Ding wird in der for-Zeile definiert, gilt dann aber auch nur innerhalb des for-blockes.
Das ist falsch! Der Name ``ding`` ist nach der Schleife auch außerhalb des Blockes bekannt.
Code: Alles auswählen
In [4]: for ding in xrange(1,10):
...: print ding,
...:
...:
1 2 3 4 5 6 7 8 9
In [5]: ding
Out[5]: 9
Grüße
Gerrit
Verfasst: Dienstag 30. März 2010, 01:25
von DasIch
mouses hat geschrieben:noch was: Variablen werden in Python soweit ich weiß nie direkt als Typ deklariert, sondern bekommen automatisch den Typ des Wertes, der ihnen als erstes zugewiesen wird. Nachteil: wenn man das anders gewohnt ist übersieht man gerne die erste Definition einer Variable
Python hat keine Variablen sondern Namen bzw. Referenzen und da die Sprache dynamisch ist haben diese auch keinen Typ sondern zeigen auf ein Objekt welches ein Typ hat, wobei dieser Typ ebenfalls ein Objekt ist. Damit dass funktioniert haben wir ein Objekt type welches ein Exemplar von type, also sich selbst, ist.
Verfasst: Dienstag 30. März 2010, 08:27
von Darii
DasIch hat geschrieben:Python hat keine Variablen sondern Namen bzw. Referenzen
Ich denke man darf die Variablen in Python durchaus Variablen nennen, denn nichts anderes sind sie.
Verfasst: Dienstag 30. März 2010, 10:00
von Hyperion
Darii hat geschrieben:DasIch hat geschrieben:Python hat keine Variablen sondern Namen bzw. Referenzen
Ich denke man darf die Variablen in Python durchaus Variablen nennen, denn nichts anderes sind sie.
Terminologien sind immer ein gewisses Problem. Wobei auch das Wort Referenz in diesem Zusammenhang problematisch ist... aber das Thema hatten wir ja auch schon zig mal

Verfasst: Dienstag 30. März 2010, 15:15
von mouses
gkuhl hat geschrieben:mouses hat geschrieben:Klartext: die Variable Ding wird in der for-Zeile definiert, gilt dann aber auch nur innerhalb des for-blockes.
Das ist falsch! Der Name ``ding`` ist nach der Schleife auch außerhalb des Blockes bekannt.
Code: Alles auswählen
In [4]: for ding in xrange(1,10):
...: print ding,
...:
...:
1 2 3 4 5 6 7 8 9
In [5]: ding
Out[5]: 9
???
Okay, anscheinend kenne ich die Sprache dann doch noch nicht so gut.
Finde ich übrigens befremdlich, dass eine innerhalb einer Schleife definierte Variable auch außerhalb noch erkannt wird. Da gibts doch sogar einen Begriff für; wie hieß der nochmal?
Aber gut; wenn man von C(++)-Like-Sprachen hierhin wechselt ist sowieso alles erstmal anders.
Thema Variablen <-> Namen:
Es ist durchus klar, dass das keine Variablen im üblichen Sinne sind. Alleine schon deswegen, weil alles ein Objekt ist und so behandelt werden kann.
Allerdings _kann_ man sie normalerweise so verwenden, weswegen auf der Semantischen ebene diese durchaus als solche tituliert werden können. Vorausgesetzt man bekommt irgendwann mt, dass diese weit mehr sind als Variablen in anderen Sprachen.
Verfasst: Dienstag 30. März 2010, 15:32
von jbs
In der for-schleife wird das Objekt ganz normal an den Namen gebunden, sodass sie auch darüber hinaus besteht. Etwas anderes ist es bei LC's. Dort gibt es Seiteneffekte bei Python 2.x bei Python 3.x hingegen nicht:
Code: Alles auswählen
>>> #3
>>> for i in range(10):
... pass
...
>>> i
9
>>> [j for j in range(1)]
[0]
>>> j
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'j' is not defined
>>>
Code: Alles auswählen
>>> #2
>>> for i in range(10):
... pass
...
>>> i
9
>>> [j for j in range(1)]
[0]
>>> j
0
>>>
Verfasst: Dienstag 30. März 2010, 15:42
von gkuhl
mouses hat geschrieben:Aber gut; wenn man von C(++)-Like-Sprachen hierhin wechselt ist sowieso alles erstmal anders.
Bei C gibt es das auch. Keine Ahnung ob es unter C++ anders ist.
Code: Alles auswählen
#include <stdio.h>
int main() {
int i;
for (i=0; i<10; i++)
printf("%d ", i);
printf("\n%d\n", i);
}
Ausgabe:
Grüße
Gerrit
Verfasst: Dienstag 30. März 2010, 16:23
von Darii
gkuhl hat geschrieben:Bei C gibt es das auch.
Nein, da deklarierst du die Variable schon vorher. Würdest du i im for deklarieren(geht erst ab C99), dann wäre sie außerhalb nicht sichtbar. In diesem Punkt unterscheidet sich C nämlich von Python. In Python wird bei Schleifen kein neuer Gültigkeitsbereich(Scope) für Variablen erstellt, in C(und auch C++) schon.
Code: Alles auswählen
#include <stdio.h>
int main (int argc, char const *argv[])
{
for(int i = 0; i < 10; ++i) printf("%d ", i);
printf("\n%d\n", i);
return 0;
}
kompiliert gar nicht erst
Verfasst: Dienstag 30. März 2010, 17:11
von gkuhl
@Darii: Danke, gut zu wissen.