for Schleifen

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
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

ich kapiere die for Schleife wohl nicht so richtig.

Beispielcode:

Code: Alles auswählen

x=[1,2,3
For x in [1,2,3]
     print(x)
Was macht diese For Schleife denn genau? In meinem Buch ist diese so definiert:

"Eine forSchleife wird verwendet, um ein iterierbares Objekt zu durchlaufen." Was bedeutet das denn genau?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Dein Beispielcode ist kaputt. ;-) So müsste es wohl lauten:

Code: Alles auswählen

x = [1, 2, 3]
for i in x:
    print(x)
"Iterierbar" heißt, dass man in einer Schleife nacheinander auf die Elemente in dem Objekt zugreifen kann (in dem Fall erst 1, dann 2, dann 3). In dem eingerückten "Block" nach der Zeile mit dem "for" kommen Anweisungen, die so oft durchgeführt werden, bis alle Elemente einmal "i" waren und durch die Anweisungen verarbeitet wurden (im Beispiel mit print, das Element wird auf dem Bildschirm ausgedruckt).
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

schwierig, klingt aber logisch. Ab er wo braucht man denn heutzutage diese Schleifen?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Immer, wenn du eine bestimmte Ansammlung von Werten hast (z. B. in Form einer Liste oder einem der vielen anderen iterierbaren Objekten), die du auf eine Art und Weise verarbeiten willst. So musst du eben nicht denselben Code zigmal schreiben, sondern nur einmal als for-Schleife. Du könntest zum Beispiel eine Liste von Dateien haben, die du alle nach dem selben Schema verändern willst, oder eine Liste von Dateien im Internet, die du herunterladen möchtest. Es gibt sehr, sehr viele Anwendungsmöglichkeiten.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hättest Du einen Vorschläg, was ich proggen könnte , um for; while; if; Paar Methoden;Variablen zu üben? Vll etwas mathematisches?
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Gary123456 hat geschrieben:wo braucht man denn heutzutage diese Schleifen?
Nirgends. Man kann Schleifen ja "ausrollen". Statt:

Code: Alles auswählen

for i in range(3):
    print(i * i)
könnte man auch schreiben:

Code: Alles auswählen

var0 = 0
var1 = 1
var2 = 2
print(var0 * var0)
print(var1 * var1)
print(var2 * var2)
Das Ergebnis ist in beiden Fällen:

Code: Alles auswählen

0
1
4
Und jetzt schreib zur Übung auf beide Weisen ein Programm, das alle Primzahlen kleiner als 1 Million ausgibt.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Code: Alles auswählen

Namen = ['Thomas', 'Heiko', 'Hubert']

for lalilu in Namen:
    print(lalilu)

Code: Alles auswählen

TotalSum = 0

for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
    TotalSum = TotalSum + i    # oder einfach: TotalSum += i

print(TotalSum)
was ist hier geschehen?

Code: Alles auswählen

i = 0  # man nimmt oft i für "Index"

while i < 10:
    print("Wert von i:", i)
    i = i+1  # hier könnte man auch i++ schreiben, hat den gleichen effekt
print("Jetzt wurde die Schleife so oft durchlaufen, bis i >= 10 ist.")
#oder mit einer for-Schleife
for i in range(10):
    ...
    ...
# hier aber kein i + 1 am Ende der Schleife!

Code: Alles auswählen

# kein richtiges Programmbeispiel
for [variable, irgendwas] in [irgendwas] mache:
    Das
    Dies
    Anweisung3
'''
und hier wäre die Schleife vorbei und wird wieder von vorne durchlaufen,
bis sie am Ende der Liste beispielsweise angekommen ist.
Das "iterierbare Objekt" wäre also in deinem Beispiel diese Liste [1, 2, 3].
'''

Falls ich was falsches hier gesagt habe bitte sofort eins auf den Deckel geben!

mfg
Und jetzt schreib zur Übung auf beide Weisen ein Programm, das alle Primzahlen kleiner als 1 Million ausgibt.
Und danach wird glaube ich sehr deutlich, wofür die Schleifen manchmal ganz nützlich sind :D
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Hallo,

@pillmuncher)

Habe jetzt etwas gegoogelt für eine Formel nach Primzahlen. Es soll keine 100% geben. Gibt es da eine Funktion oder eine Methode mit der man alle Primzahlen ausrechnen kann? Vielleicht bin ich kein MatheGenie, aber diese Schwäche soll mir meine Lust zum Programmieren nicht rauben!

@HarteWare)

Zu den zweitem Code. Der Variable i wird der Wert 0 zugewiesen. Dann läuft eine Schleife solange i kleiner 10 ist. Wenn dieser Schleifenkopf erfüllt ist, Wird der Wert i geprintet und immer um eins erhöht. Wenn es beim Wert 9 angekommen ist, ist diese Schleife nicht merh erfüllt und printet somit "print("Jetzt wurde die Schleife so oft durchlaufen, bis i >= 10 ist.")". Habe ich recht?
Benutzeravatar
Sr4l
User
Beiträge: 1091
Registriert: Donnerstag 28. Dezember 2006, 20:02
Wohnort: Kassel
Kontaktdaten:

Also um Primzahlen zu finden brauchst du keinen besonderen Fähigkeiten und Methoden. Überleg dir einfach mal wie man das in Code umschreiben kann.
"Eine Primzahl ist eine natürliche Zahl, die genau zwei natürliche Zahlen als Teiler hat."
(Teiler: sich selbst und 1)

Falls du doch Wert auf etwas effizienteres legst wo sich Leute schon Gedanken gemacht haben um das zu vereinfachen schau einmal hier vorbei: http://de.wikipedia.org/wiki/Primzahltest
Benutzeravatar
pillmuncher
User
Beiträge: 1484
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

Gary123456 hat geschrieben:Habe jetzt etwas gegoogelt für eine Formel nach Primzahlen. Es soll keine 100% geben. Gibt es da eine Funktion oder eine Methode mit der man alle Primzahlen ausrechnen kann? Vielleicht bin ich kein MatheGenie, aber diese Schwäche soll mir meine Lust zum Programmieren nicht rauben!
Die bekannteste Methode ist das Sieb des Eratosthenes. Das zwar nicht der performanteste Weg, Primzahlen zu ermitteln, aber wohl eine gute Übung, da man dazu zwei ineinander geschachtelte Schleifen verwenden muss.

Ich hoffe allerdings, du willst nicht wirklich versuchen, dasselbe ohne for-Schleife zu programmieren, da du dazu offensichtlich mehr als 1 Million Zeilen Pythoncode schreiben müsstest. Ich hatte nur geschrieben "auf beide Weisen", um dir deutlich zu machen, worin der Vorteil von for-Schleifen besteht.
In specifications, Murphy's Law supersedes Ohm's.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

Gary123456 hat geschrieben:Hallo,


@HarteWare)

Zu den zweitem Code. Der Variable i wird der Wert 0 zugewiesen. Dann läuft eine Schleife solange i kleiner 10 ist. Wenn dieser Schleifenkopf erfüllt ist, Wird der Wert i geprintet und immer um eins erhöht. Wenn es beim Wert 9 angekommen ist, ist diese Schleife nicht merh erfüllt und printet somit "print("Jetzt wurde die Schleife so oft durchlaufen, bis i >= 10 ist.")". Habe ich recht?
Nun, wenn i den Wert 9 hat wird die Schleife noch einmal durchlaufen, da 9 < 10 aber dann wird i um 1 erhöht und beim nächsten mal ist die Bedingung nichtmehr erfüllt, da 10 *nicht* < 10. P.S.: Ich glaube du meintest den 3. Code, oder?

Das "was ist hier passiert" war ursprünglich auf den Code darüber bezogen, weil ich der Ansicht war, dass das Beispiel das Vorgehen der for-Schleife ein wenig darstellt :D

Zu beachten ist, dass man beim Initieren von Variablen immer (soweit ich weiß) einen Standard Wert zuweisen muss. Mann kann nicht einfach nur "i" schreiben. Außerdem, ich glaube dadurch kann man schon (teilweise!) den Datentyp bestimmen.
Wenn ich schreibe i = 'heiko' dann würde in dem Programm ein fehler auftreten weil Python mit 'heiko' nicht rechnen kann. Das wäre in etwa als würde ich dirch fragen:
"was gibt 2 m² + eine Banane"

mfg
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich habe keine Ahnung wie ich das angehen sollte. Dieses Thema: http://www.python-forum.de/viewtopic.php?f=9&t=30707. Ist das der leichteste Code? Wenn ja, überschätzt ihr mich wohl.
BlackJack

@Gary123456: Das was in meinem Eintrag unter „Die übliche Implementierung (Python 2)” ist die, nun ja, übliche Implementierung für das Sieb ohne irgendwelche Besonderheiten in Python (2). Das „komplizierteste” unter dem Aspekt von Sprachkonstrukten ist der Generatorausdruck in der letzten Zeile. Alles andere was da verwendet wird sind absolute Python-Grundlagen. Dann kommt noch die mathematische Idee von dem Sieb-Algorithmus dazu. Das ist aber letztendlich gar nicht so schwer wenn man das mal selber mit Papier und Bleistift für die ersten 100 Zahlen durchspielt.
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Ich kenn ja leider nur Schleifen, Bedingungen und wenige Methoden. Vll kann ich dazu auch was basteln.
Benutzeravatar
HarteWare
User
Beiträge: 69
Registriert: Samstag 23. Februar 2013, 21:16
Wohnort: localhost

In dem Fall könnte ich noch das hier sehr empfehlen, ist bestimmt schon zick mal im Forum der Link:
http://learnpythonthehardway.org/book/

Generell können die verschiedenen Tutorials die Grundlagen meiner Meinung nach gut vermitteln.
Gary123456 hat geschrieben:Vll kann ich dazu auch was basteln.
Ist bestimmt eine gute Idee. Denn umso mehr man damit "arbeitet" umso vertrauter wird man damit, zumindest ist es mit den meisten Dingen so.

mfg
Gary123456
User
Beiträge: 318
Registriert: Dienstag 26. Februar 2013, 18:39

Mal eine ganz andere Frage:

Was sind genau Instanzen?

X=0

wäre 0 dann die Instanz? X referenziert momentan eine Instanz des Typs int. War der letzte Teil die Antwort auf meine Frage? :shock:
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Zuerst: Instanz ist eine falsche Uebersetzung von "instance", richtiger waere "Exemplar".

Effektiv ist in Python alles ein Exemplar: Klassen von Meta-Klassen und Objekte von Klassen. In deinem Fall hast du recht: `0` ist ein Exemplar der Klasse `int`. Um es komplett zu machen: `X` ist ein Name an den das Objekt `0` gebunden ist.
Antworten