2017-09-20 3 views
1

Ich schreibe gerade ein Programm, das eine 'for' Schleife und die Bereichsfunktion verwendet, um alle ganzen Zahlen von 999 bis Null zu verarbeiten. Ich muss die Schleifenvielfache von 40 auf einer Zeile einteilen, die durch Leerzeichen getrennt ist, aber mit nur sechs auf einer Zeile. Das Problem, das ich habe, ist die Implementierung eines Zählers, um zu bestimmen, wann sechs Vielfache gedruckt wurden.Python - For Schleife und Zähler

Die Ausgabe sollte wie folgt aussehen:

erforderliche Ausgabe

960 920 880 840 800 760 
720 680 640 600 560 520 
480 440 400 360 320 280 
240 200 160 120 80 40 

Zur Zeit habe ich dies:

def main(): 
    count = 0 
    for num in range(960, 0, -40): 
     print(num, end=' ') 
main() 

Ich weiß, das sollte einfach sein, aber ich bin zu kämpfen das bekommen Bereich zum Formatieren in 6 Spalten. Jede Hilfe wäre willkommen.

Antwort

0

können Sie den Modulo-Operator% des Python verwenden, um bestimmte, wenn Zählung durch 6 teilbar ist Dies ist vielleicht nicht die schönste Antwort, aber wie wäre es:

def main(): 
    count = 0 
    for num in range(960, 0, -40): 
     count += 1 
     print(num, end=' ') 
     if count % 6 == 0: 
      print('') 
main() 
0

Diese Arbeit sollte:

def main(): 
    count = 0 
    for num in range(960, 0, -40): 
     count += 1 
     if count % 6 == 0: 
      print(num, end='\n') 
     else: 
      print(num, end=' ') 
main() 

Grundsätzlich die gleiche Funktion, außer dass wir prüfen, ob der Zähler durch 6 teilbar ist. Wenn ja, drucken Sie eine neue Zeile für die nächste Zeile.

+0

Thank you!Ich hatte das Gefühl, dass ich den Dividendenoperator verwenden musste, weil mein Lehrbuch sich für einen Moment darauf konzentrierte. Ich werde zurückgehen und das näher studieren. :) –

+0

Ja, aber wenn Sie schnellere Reaktion bei der Arbeit an größeren Daten mit Dividend-Operator wollen, ist ein extra Kopf. Führen Sie Ihr Programm tausend Mal in einer Schleife mit "Zeit" und sehen Sie die Leistungsdifferenz zwischen mit und ohne Dividend-Operator. –

0

Inkrementiere den Zähler in jeder Schleife und setze ihn auf null zurück, sobald er sechs erreicht.

def main(): 
    counter = 0 
    for number in range(960, 0, -40): 
     counter += 1 
     print(number, end=' ') 
     if counter == 6: 
      counter = 0 
      print('') 
main() 
2

könnten Sie Python verwenden enumerate für den Zähler und ein bedingter Ausdruck der Code kompakter zu machen:

for i, number in enumerate(range(960, 0, -40), 1): 
    print(number, end=' ' if i%6 else '\n') 

Dies ist Python 3-Code. Für Python 2 fügen Sie diese Zeile an den Anfang der Datei:

from __future__ import print_function 
+0

Dies ist meine Lieblingsantwort. Sehr pythonisch. Ich mag es besser als meine Antwort, obwohl ich, wie ich beschrieben habe, ein Muster für komplexere Szenarien vorgeschlagen habe. – RobertB

0

Es ist vielleicht irrational, aber ich hasse Zähler in Schleifen. Während Sie in diesem speziellen Fall übertrieben sind, haben Sie daran gedacht, einen Generator in den Mix einzubetten? Dies ist ein praktisches Muster für komplexere Situationen:

def print_newline_after_x_iterations(my_range, x): 
    i = my_range.__iter__() 
    while True: 
     try: 
      for _ in range(x): 
       yield next(i) 
      print() 
     except StopIteration: 
      break 

def main2(): 
    for num in print_newline_after_x_iterations(range(960, 0, -40), x=6): 
     print(num, end=' ') 

Ausgang:

>>> main2() 
960 920 880 840 800 760 
720 680 640 600 560 520 
480 440 400 360 320 280 
240 200 160 120 80 40 

Oder auch eine Co-Routine basierte Version verwenden:

def coroutine(f): 
    def wrap(*args, **kwargs): 
     x = f(*args, **kwargs) 
     next(x) 
     return x 
    return wrap 


@coroutine 
def printer(): 
    while True: 
     msg, end = yield 
     print(str(msg), end=end) 


@coroutine 
def columnator(columns=6, outputer=printer): 
    p = printer() 
    try: 
     while True: 
      for _ in range(columns): 
       p.send(((yield), " ")) 
      p.send(("", "\n")) 
    except GeneratorExit as err: 
     p.send(("", "\n")) 


def main3(): 
    s = columnator(6, outputer=printer) 
    for num in range(960, 0, -40): 
     s.send(num) 
    s.close() 

Ausgang:

>>> main3() 
960 920 880 840 800 760 
720 680 640 600 560 520 
480 440 400 360 320 280 
240 200 160 120 80 40 
0

Dies ist eine zweistufige Aufgabe (mit Python 2.7x):

1.Get alle ganzen Zahlen, die ein Vielfaches von 40 in einer Liste sind

2.Split oben aufgeführte Liste alle 6 Elemente, und formatieren Sie die Ausgabe

>>> n=[str(x) for x in range(999,0,-1) if x%40 == 0] 
>>> for x in [n[6*i:6*(i+1)] for i in range(len(n)/6)]: 
...  print ' '.join(x) 
... 
960 920 880 840 800 760 
720 680 640 600 560 520 
480 440 400 360 320 280 
240 200 160 120 80 40