for loop

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
parf
User
Beiträge: 5
Registriert: Sonntag 12. Februar 2017, 00:05

Hallo,

ich würde gerne ein Python Programm, das durch EINEN Loop die Zahlen 1 bis 50 (inklusiv) und die
Zahlen 100 bis 201 (exklusiv) aufaddiert.

Wie muss ich da vorgehen?

Die einzelnen Loops sind mir klar, Bsp:

Code: Alles auswählen

x=0
for y in range (1,51):
x+=y
print(x)
Über eine Antwort würde ich mich freuen...
Zuletzt geändert von Anonymous am Sonntag 12. Februar 2017, 01:13, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

Dafür ist die `chain()`-Funktion aus dem `itertools`-Modul praktisch, und eine eigene Schleife muss man auch nicht schreiben, das erledigt die `sum()`-Funktion:

Code: Alles auswählen

In [18]: from itertools import chain

In [19]: sum(chain(range(1, 51), range(100, 201)))
Out[19]: 16425
parf
User
Beiträge: 5
Registriert: Sonntag 12. Februar 2017, 00:05

Danke schonmal, aber gibt es keine Möglichkeit die beiden Loops einfach zu verknüpfen?
BlackJack

@parf: Warum? Man kann die `range`-Objekte mit den Werten doch einfach mit `chain()` ”verketten”. Dafür ist die Funktion da.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Was genau meinst du damit überhaupt und was erhoffst du dir davon?
parf
User
Beiträge: 5
Registriert: Sonntag 12. Februar 2017, 00:05

BlackJack hat geschrieben:@parf: Warum? Man kann die `range`-Objekte mit den Werten doch einfach mit `chain()` ”verketten”. Dafür ist die Funktion da.
Beispielsweise:

Code: Alles auswählen

    x=0
    for y in range (1,51) and in range (100, 201):
    x+=y
    print(x)
Irgendwie in die Richtung? Ist sowas überhaupt möglich zwei ranges hintereinander zu stellen ohne "sum"?
Zuletzt geändert von Anonymous am Sonntag 12. Februar 2017, 12:36, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@parf: Sag doch mal bitte was Du tatsächlich machen möchtest, und warum Du das unbedingt *so* machen möchtest, und warum zur Hölle die `chain()`-Funktion, die genau das macht was Du willst, nicht in Frage kommt. :K
parf
User
Beiträge: 5
Registriert: Sonntag 12. Februar 2017, 00:05

BlackJack hat geschrieben:@parf: Sag doch mal bitte was Du tatsächlich machen möchtest, und warum Du das unbedingt *so* machen möchtest, und warum zur Hölle die `chain()`-Funktion, die genau das macht was Du willst, nicht in Frage kommt. :K
;-)

Also ich möchte eigentlich nur die beiden ranges aufaddieren. Ich habe wie oben beschrieben gelernt wie man einzelne ranges aufaddiert.
Ich bin nicht unzufrieden mit deiner ersten Antwort :-D. Meine Frage ist einfach nur ob man das nicht auch nach dem Prinzip wie ich es geschrieben habe verknüpfen kann.
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

parf hat geschrieben: Meine Frage ist einfach nur ob man das nicht auch nach dem Prinzip wie ich es geschrieben habe verknüpfen kann.
Du kannst die von BlackJack gezeigte Verwendung von chain auch mit einer Schleife kombinieren. Aber das wäre wie gesagt die umständlichere Variante.

Ansonsten gäbe es für den konkreten Fall hier, wo die beiden Ranges disjunkt sind theoretisch noch die sehr skurile Variante, das was du vorschlägst mit einer Vereinigungsmenge, über die iteriert wird zu lösen. Das ist m.M.n. aber sehr abwegig, würde unter keinen Umständen praktisch angewendet und bringt auch diverse Probleme mit sich (z.B. keine vorhersagbare Reihenfolge, jede Zahl kann nur einmal vorkommen, nicht lazy etc.)

Code: Alles auswählen

In [1]: x = 0

In [2]: for y in set(range(1, 51)) | set(range(100, 201)):
    ...:     x += y

parf
User
Beiträge: 5
Registriert: Sonntag 12. Februar 2017, 00:05

nezzcarth hat geschrieben:
parf hat geschrieben: Meine Frage ist einfach nur ob man das nicht auch nach dem Prinzip wie ich es geschrieben habe verknüpfen kann.
Du kannst die von BlackJack gezeigte Verwendung von chain auch mit einer Schleife kombinieren. Aber das wäre wie gesagt die umständlichere Variante.

Ansonsten gäbe es für den konkreten Fall hier, wo die beiden Ranges disjunkt sind theoretisch noch die sehr skurile Variante, das was du vorschlägst mit einer Vereinigungsmenge, über die iteriert wird zu lösen. Das ist m.M.n. aber sehr abwegig, würde unter keinen Umständen praktisch angewendet und bringt auch diverse Probleme mit sich (z.B. keine vorhersagbare Reihenfolge, jede Zahl kann nur einmal vorkommen, nicht lazy etc.)

Code: Alles auswählen

In [1]: x = 0

In [2]: for y in set(range(1, 51)) | set(range(100, 201)):
    ...:     x += y


SUPER, danke!!
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@nezzcarth: statt Sets würde man wohl eher auf Listen kommen: »list(range(1, 51)) + list(range(100,201))«.

@parf: Dein »and in«-Syntaxwunsch wird doch schon exakt durch »chain« abgebildet:

Code: Alles auswählen

x=0
for y in chain(range(1,51), range(100, 201)):
    x += y
print(x)
nezzcarth
User
Beiträge: 1632
Registriert: Samstag 16. April 2011, 12:47

Sirius3 hat geschrieben: @nezzcarth: statt Sets würde man wohl eher auf Listen kommen: »list(range(1, 51)) + list(range(100,201))«.
Ja, du hast recht :oops: Diese Variante hat auch zwei der drei genannten Nachteile nicht. (Allerdings kommt in meinem Vorschlag wie "gewünscht" ein logischer Operator vor ;) Mit Listen ist es außerdem noch seltsamer, da es da wirklich keinen Grund gibt, nicht chain zu verwenden; die Verwendung von Sets ist zumindest auch konzeptuell ein bisschen anders)
BlackJack

@parf: Bitte nicht das was nezzcarth geschrieben hat verwenden. Das tut weh. Das ist nicht zum verwenden gedacht. Das hat nezzcarth selbst geschrieben, dass das keine ernstgemeinte Lösung ist. Wenn Du wirklich nur diese beiden `ranges()` addieren möchtest, dann ist die Lösung ``sum(chain(range(1, 51), range(100, 201)))``. Alles andere ist umständlicher (zumindest zu schreiben), und warum eine umständlichere Lösung verwenden? Wobei die aller einfachste Lösung natürlich ``print(16425)`` ist.

Wenn es unbedingt eine explizite Schleife sein soll, dann nimm die `chain()`-Funktion. Noch mal: die ist genau dafür gemacht.

Falls ``print(16425)`` keine Lösung ist, dann stellt sich wieder die Frage was Du denn *eingentlich* *tatsächlich* machen möchtest? Denn es macht ja nicht so viel Sinn ``sum(chain(range(1, 51), range(100, 201)))`` zu schreiben wenn das alles feste Werte sind. Falls die Zahlen eigentlich Variablen sind, sagen wir mal `a` bis `d`, dann kann man das auch als geschlossene Formel schreiben, ganz ohne Schleifen: ``-(a**2 - a - b**2 - b + c**2 - c - d**2 + d)/2``:

Code: Alles auswählen

In [74]: a = 1; b = 50; c = 100; d = 201

In [75]: -(a**2 - a - b**2 - b + c**2 - c - d**2 + d)/2
Out[75]: 16425
Antworten