第15回【Python】指定された数字までの出力、指定された数字までの出力、指定された行数の数字の出力、指定された範囲・行数の数字の出力

現在取り組んでいるのは、paiza ラーニング問題集「二重ループメニュー」になります。

はじめに

猫とキャンプと野球観戦と AWS が大好きな旦那、LeoSaki です。モフモフしたい。

Python をゼロから勉強してみよう、のコーナー 15 回目です。

今回から「二重ループメニュー」に挑戦したいと思います。ループメニューを繰り返しやってきて、for 文や while 文は身についた・・・はず。それを二重にして使えばいいんだろう、とお気軽な気持ちでやっていく所存です。

それでは、今日も頑張ってみようと思います。

指定された数字までの出力

正の整数 N が与えられるので、1 〜 N の整数を 1 から順に半角スペース区切りで 1 行で出力してください。
出力の末尾には改行を入れてください。

んん? これは・・・二重ループになりますか? とりあえず、正攻法で書いてみる。

Python
N = int(input())
for i in range(1,N+1):
    if i == N:
        print(i)
    else:
        print(i,end=" ")

print 関数は末尾に改行がつく。end= で改行の代わりに使用するものを指定してあげれば良い。

VBA だとどうなるだろう。イミディエイトウィンドウで同じようなことを再現してみる。

VBA
N = Cells(1, 1)
For i = 1 To N
    If i = N Then
        Debug.Print i
    Else
        Debug.Print i;
    End If
Next

VBA は、Debug.Print にセミコロン(;)で同じことができる。

指定された数字までの出力

正の整数 N が与えられるので、1 〜 N の整数を 1 から順に改行区切りで N 行で出力してください。

この問題のタイトルは間違っていない。「指定された数字までの出力」で 2 問出題されている。せめて「2」とかつけてほしかったなぁ。

今度は、改行区切りで出力しろ、と。これも二重ループにならない気がする。

Python
N = int(input())
for i in range(1,N+1):
    print(i)

基本は大事。どんなに面倒だと思っても手を動かそう。暗に面倒だと言っているのかもしれない。

VBA
N = Cells(1, 1)
For i = 1 To N
    Debug.Print i
Next

指定された行数の数字の出力

整数 N が与えられるので、 1 から 5 までの数字を半角スペース区切りしたもの
“1 2 3 4 5" を N 行出力してください。
出力の末尾には改行を入れてください。

おっ? ようやく二重ループを使う問題だろうか。やってみよう。

Python
N = int(input())
for _ in range(N):
    for i in range(1,6):
        if i == 5:
            print(i)
        else:
            print(i,end=" ")

print(“1 2 3 4 5") とかしたら二重ループにしなくていいじゃん、というとタブチ先生がやってくるので注意。

ちなみに、以下は間違い。最初、こっちの方が記述少ない、と思って書いたけれど、5 の後ろにも半角スペースが入っちゃう。

Python(誤答)
N = int(input())
for _ in range(N):
    for i in range(1,6):
        print(i,end=" ")
    print()

paiza は前問、前々問を活かして解くという作りになっている。だから身につきやすいと思った。

VBA
N = Cells(1, 1)
For i = 1 To N
    For j = 1 To 5
        If j = 5 Then
            Debug.Print j
        Else
            Debug.Print j;
        End If
    Next
Next

Python のアンダーバー(_)ってなんか良い。VBA の利用しないのに出てくる「i」ってコードが長くなると、少し邪魔になってきちゃう。「i」がどこで利用されているかコードをさらって、見つからないって悩んでしまいそう。じゃあ、この「i」はなんなんだ! とか。

使わないからアンダーバー(_)って理にかなっている。

指定された範囲・行数の数字の出力

整数 N , K が与えられるので、 1 から N までの数字を半角スペース区切りしたもの
“1 2 … (N-1) N" を K 行出力してください。

ここまでの 3 問の総まとめって感じですね。

Python
N,K = map(int,input().split())
for _ in range(N):
    for i in range(1,K+1):
        if i == K:
            print(i)
        else:
            print(i,end=" ")

range 内の範囲指定だけ気を付ければ難しくないと思う。ちょっとわかりづらいけれど、慣れてくるとなんてことない。

VBA
S = Split(Cells(1, 1), " ")
N = Val(S(0))
K = Val(S(1))
For i = 1 To N
    For j = 1 To K
        If j = K Then
            Debug.Print j
        Else
            Debug.Print j;
        End If
    Next
Next

for 文での範囲指定は VBA の方がわかりやすいけど、Python のようにスッキリとは書けない。まぁ、他の言語でも、だいたいは同じ感じになると思う。

最後に

まずは小手調べ。2 回基本のループを書かせた後に、それを組み合わせて二重ループを書かせる。paiza さん、よく考えてらっしゃる。何事も基本が大事。

他の言語と比較した際の、Python の読みやすさって確かにあるなぁと感じた。あと、書いていて楽。余計なものが削られているので、波カッコや角カッコが漏れていてエラーってことが少ない。

比較のために VBA を書いているのだけれど、よく End If を忘れたり、Next を忘れたりするんだよなぁ。Python と VBA との頭の切り替えがきちんとできていないと言われたらそれまでだけど。

いろいろと見直すことができて、面白い! 何事もポジティブに受け取ろう!

引き続き、お付き合いよろしくお願いいたします!

Pythonpaiza,学習,Python

Posted by LeoSaki