2017-10-17 1 views
2

Gestern gab ich eine Frage, wo ich nach einem Weg zu einer unendlichen for Schleife zu tun, ohne while überhaupt mit (weil mein Lehrer will so, und auch, wir können nicht verwenden Befehle haben wir nicht in Klasse gesehen). Es war schwierig, da es offenbar keine sehr praktikable Option war, die nicht while verwendet haben, oder andere Funktionen wie itertools oder .append usw.Wie speichere ich Werte aus einer "for" -Schleife? Python 3

Sie diese Frage auch here
sehen können, vielen Dank für die Feedback, die ihr mir gebracht habt! :)


Aber konnte ich mit meinem Lehrer sprechen, und wir haben die Erlaubnis verwendenitertools oder nur ein Bereich groß genug ist (anstatt wirklich unendlich).


löste ich ein paar Übungen schon, aber jetzt habe ich die folgende Anweisungen:

(Denken Sie über Noten)
• dem Benutzer eine Reihe Fragen (durch Eingänge), und Fragen bis der Benutzer sagt, um zu stoppen .
• Berechnen Sie dann den Durchschnitt von allen eingegebenen Zahlen.

(Es ist eigentlich ein wenig komplizierter, aber ich verkürzt es und ich glaube, ich mit dem Rest umgehen kann)

Wie gesagt, ich muss eine for Schleife verwenden, und ich kann‘ t verwenden Sie whiles überhaupt.

Wenn ich während verwenden könnte, würde ich so etwas tun:

def grades(): 
    totalg = 0 
    countg = 0 
    keepAdding = "y" 
    while(keepAdding == "y"): 
     qualif = int(input("Insert grades obtained, in scale from 0 to 100 ")) 
     totalg = totalg + qualif 
     countg = countg + 1 
     keepAdding = str(input("Do you wish to keep adding data? (y/n) ")) 
    print("The average of your grades is", totalg/countg) 

Wie kann ich so etwas tun, aber mit for Schleifen? Ich habe keine Ahnung, wie man die Daten für spätere Berechnungen speichert.


Auch ich bin in interessiert eine „richtige“ Art und Weise zu wissen, der Lage sein, die Schleife zu beenden, aber ich kann keine break weder verwenden.

Vielen Dank im Voraus! Jeder Rat ist willkommen und willkommen!:)

+0

In der gestrigen Antwort habe ich 'return' verwendet, um die No-'break'-Einschränkung zu überwinden. Oder darfst du 'return' auch nicht benutzen? –

+1

Vielleicht solltest du die Sachen auflisten, die du benutzen darfst. Es ist schwierig, diese Art von Frage zu beantworten, wenn wir nicht wissen, was die Regeln sind. –

+0

Ja. (Entschuldigung für den späten BTW) Ich kann Return verwenden und es ist mehr oder weniger, was ich getan habe, aber in diesem Fall für diesen Code zum Beispiel, wie würde ich den Return-Befehl setzen, um es zu beenden, während die Variablen Wert beibehalten ? Tut mir leid für meine Ignoranz, ich denke, das ist etwas, was ich aus deinem Code ableiten konnte, aber ich fürchte, ich konnte es nicht vollständig verstehen. Und ja, lassen Sie mich eine Liste der Sachen machen, die wir gesehen haben, um es einfacher zu machen. Aber ich denke, wir kommen näher, danke :) – oScarDiAnno

Antwort

4

Eine Möglichkeit, dies zu tun, ist, ohne externe Module, zu verwenden ist two-arg iter; Wenn zwei Argumente übergeben werden, ist die erste eine Funktion ohne Argumente, die immer wieder aufgerufen wird, und die zweite ist ein Sentinel-Wert, der angibt, dass Sie aufhören sollten.

for _ in iter(bool, True): 

Da der bool Konstruktor gibt False, einen Sentinel-Wert von True wird nie auftreten, so dass eine Endlosschleife ist:

So zum Beispiel könnte man eine Endlosschleife mit etwas so einfach wie machen.

In ähnlicher Weise, um eine Schleife zu machen, dass der Benutzer aufgefordert werden, bis sie mit einem bestimmten Sentinel-String reagiert, wie 'q' für beenden (oder auch nur die leere Zeichenkette), könnten Sie tun:

for inp in iter(lambda: input("Insert grades obtained, in scale from 0 to 100 (type 'q' to quit)"), 'q'): 
    val = int(inp) 
    ... rest of loop ... 

Offensichtlich ist dies ein wenig obskur (zwei-arg iter wird selten gesehen), so würden Sie normalerweise while True: mit der Schleife verwenden, die einen Test-und-break oder Test-und-return enthält (letzteres verletzt nicht den Buchstaben der Anforderungen des Lehrers). In ähnlicher Weise kann die Ausnahmebehandlung verwendet werden, um die Schleife zu verlassen, obwohl es hässlich:

try: 
    for ...: 
     if test_for_end: 
      raise StopIteration 
except StopIteration: 
    pass 
# You're outside the loop 

Hinweis: Buchstäblich alles, was ich erwähnt habe, ist schrecklich Stil, abgesehen von einer tatsächlichen while True: Schleife mit einer Test-und- break/return Fall. Aber du hast eine Hand hinter deinem Rücken gefesselt, also schlage ich ein paar schreckliche Mutantenhände vor, die du ersetzen kannst.

+0

Ich vermute, dass das OP nicht 'iter' verwenden kann ... –

+0

@ PM2Ring: Möglich. One-arg 'iter' ist nicht völlig unbekannt, so dass sie es gesehen haben könnten, auch wenn sie nicht in die Zwei-Arg-Form eingeführt wurden.Wenn sie über die eingebauten Funktionen gingen, ist es da; Wenn sie darüber berichten, wie eine for-Schleife funktioniert, ist "iter" ein impliziter Teil aller "for" -Schleifen, also wer weiß? – ShadowRanger

+0

Ich glaube, ich könnte iter wissen, naja, eigentlich, zuerst glaubte ich, dass es in iter.tools enthalten war und mein Lehrer erlaubte das. Wir haben es im Unterricht nicht gesehen, das ist sicher, aber ich denke ich könnte es benutzen. Ich sah jedoch einige andere Dinge, die wir nicht nutzen konnten, wie "Lambda". Ich denke, ich mache euch Kerle ein wenig zu viel kämpfen, wirklich, vielen Dank dafür. Aber ich denke, es wäre einfacher, wenn @ PM2Ring sagt, ich habe eine Liste mit Sachen gemacht, die wir gesehen haben. Gib mir eine Sekunde, es wäre auch nützlich für mich – oScarDiAnno

-1

Vielleicht Speichern aller Daten in einem Array erhalten? Ich denke Arrays auf Python Arbeit als Linked Lists, so dass Sie keine Überlaufprobleme haben, zumindest, dass ein Ausgangspunkt sein würde

+1

One: Nein, Python verwendet keine verketteten Listen für den 'list' Typ (' array' ist ein Modul für C spezifische Typen und wahrscheinlich nicht das, was du meinst) . Zwei: Das ist nicht wirklich eine Antwort; es antwortet irgendwie auf den Titel der Frage, aber der Kern der Frage besteht nicht darin, die ursprünglichen Werte überhaupt zu speichern; selbst wenn, wäre dies zu vage/breit, um als Antwort zu dienen. – ShadowRanger

3

Auch wenn ‚no- Pause‘ -Regel und eine Anforderung für einen „richtigen "Weg, um eine Schleife zu beenden ist etwas widersprüchlich, ich würde sagen, dass möglich ist, auch ohne Rückkehr:

grades = [0] 
for j in grades: 
    t = int(raw_input('grade:')) 
    ans = raw_input('more? [y/n]:').lower() 
    if(ans == 'y'): 
     grades.append(t) 
    else: 
     grades[0] = t 

print(sum(grades)*1.0/len(grades)) 

hier wir iterieren nur ständig wachsende Liste von Werten, und wenn wir aufhören müssen - Wir hören einfach auf, Werte hinzuzufügen, und die Schleife endet.

JEDOCH Dies ist nicht eine richtige Art und Weise, dass die Frage der Handhabung, lesen ShadowRanger für weitere Details - das ist schlecht Codierung Stil und sollte nicht verwendet werden.

Verwandte Themen