Seite 1 von 1

for loop

Verfasst: Sonntag 12. Februar 2017, 00:10
von parf
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...

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 01:17
von 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

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 01:37
von parf
Danke schonmal, aber gibt es keine Möglichkeit die beiden Loops einfach zu verknüpfen?

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 01:57
von BlackJack
@parf: Warum? Man kann die `range`-Objekte mit den Werten doch einfach mit `chain()` ”verketten”. Dafür ist die Funktion da.

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 01:59
von DasIch
Was genau meinst du damit überhaupt und was erhoffst du dir davon?

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 12:22
von parf
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"?

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 12:38
von 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

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 13:26
von parf
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.

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 13:44
von nezzcarth
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


Re: for loop

Verfasst: Sonntag 12. Februar 2017, 13:50
von parf
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!!

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 18:35
von Sirius3
@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)

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 18:56
von nezzcarth
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)

Re: for loop

Verfasst: Sonntag 12. Februar 2017, 19:27
von 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