Byte of Python - unklarheit

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.
Antworten
mastachief
User
Beiträge: 3
Registriert: Sonntag 28. März 2010, 22:51

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 ;)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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....
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
mouses
User
Beiträge: 5
Registriert: Montag 29. März 2010, 23:55

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

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
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

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.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 :-)
mouses
User
Beiträge: 5
Registriert: Montag 29. März 2010, 23:55

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

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

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:

Code: Alles auswählen

0 1 2 3 4 5 6 7 8 9 
10
Grüße
Gerrit
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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

@Darii: Danke, gut zu wissen.
Antworten