2017-09-20 12 views
1

私は現在、 'for'ループとrange関数を使って999からゼロまでのすべての整数を処理するプログラムを書いています。私はスペースで区切られた1行の40のループ倍数でコーディングする必要がありますが、1行に6つしかありません。私が抱えている問題は、6つの倍数がいつ印刷されたかを判断するためにカウンタを実装することです。Python - forループとカウンタ

出力は次のようになります。

必要な出力

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

現在、私はこれがあります。

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

を、私は、これは簡単であるべき知っているが、私は得るのに苦労しています6列にフォーマットする範囲。どんな助けもありがとう。

答えて

0

あなたがカウントはこれが一番きれいな答えではないかもしれませんが、どのように約6で割り切れるならば確定するPythonの剰余演算子%を使用することができます。これは動作するはず

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

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() 

基本的に同じ機能ですが、カウントが6で割り切れるかどうかを確認します。もしそうなら、次の行に新しい行を出力します。

+0

ありがとう出力!私は、私の教科書がそれに焦点を当てたので、配当計算を使う必要があると感じました。私は戻って、その近くを勉強します。 :) –

+0

ええ、配当演算子を使ってより大きいデータを扱うときに、より速い応答が必要な場合は余分なヘッドです。 「時間」を使用してループでプログラムを1000回実行し、被除数の有無にかかわらずパフォーマンスの違いを確認します。 –

0

すべてのループでカウンタをインクリメントし、6に達するとゼロにリセットします。

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

あなたは、Pythonのenumerateカウンターのための条件式は、コードをよりコンパクトにするために使用することができます

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

これは、Python 3のコードです。 Python 2の場合は、ファイルの先頭に次の行を追加します。

from __future__ import print_function 
+0

これは私の好きな答えです。非常にpythonic。私は私の答えよりも好きですが、私が説明したように、私はより複雑なシナリオのパターンを提案していました。 – RobertB

0

おそらく非合理ですが、ループ内のカウンタが嫌いです。この特定の例では過度の過労ですが、ミックスにジェネレータを埋め込むことを考えましたか?これは、より複雑な状況のために便利なパターンです:

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=' ') 

出力:

>>> 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 

あるいはコルーチンベースのバージョンを使用します。

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() 

出力:

>>> 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

これは2段階のタスクです( Pythonの2.7倍):リストリストの上

2.Splitごとに6つの要素の中に40の倍数である

し1.Getすべての整数、およびフォーマット

>>> 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 
関連する問題