Re:ゼロから始める文系プログラマ

未経験がプログラミングを通して人生を変える

【Python問題解説】第一問


スポンサードリンク
 

f:id:ShotaNukumizu_1000:20210405111435p:plain

おはようございます!Shotaです。今日もPythonにまつわる記事を書いていきます!今日は私の記事で出題された解答を説明していきます!(ソースコードとセットで)

 

【目次】

 

 

問題

以下のようなプログラムを書き出して下さい。

 

まず1から500までの数字を順番に取り出す

取り出した数がもし7の倍数の場合は、7の倍数を入れるリストである「lst_a」に格納する

取り出した数がもし13の倍数の場合は、13の倍数を入れるリストである「lst_b」に格納する

取り出した数がもし713両方の倍数の場合は、「lst_c」に格納する

取り出し終えたら、それぞれ7の倍数と13の倍数のリストとわかるようにコマンドプロンプトに出力する(言い換えれば、「7の倍数リスト = 〇〇、13の倍数リスト = 〇〇」というようにprintで出力する)

 

以上の処理をコードに書いて実行すると、コマンドプロンプトには次のように出力されます。

f:id:ShotaNukumizu_1000:20210428101936p:plain

 

▼問題が出題された記事(参照)はコチラ

shotanukumizu-1000.hatenablog.com

 

解法1:appendメソッドを利用

#解法1:appendメソッドを利用
num = 500

lst_a = []
lst_b = []
lst_c = []

for x in range(1, num+1):
    if x % 7 == 0:
        lst_a.append(x)
        if x % 13 == 0:
            lst_c.append(x)

for y in range(1, num+1):
    if y % 13 == 0:
        lst_b.append(y)

else:
    print(f'7の倍数:{lst_a}\n13の倍数:{lst_b}\n7と13の公倍数:{lst_c}')

 

 これはオーソドックスな解き方ですね。最初に変数numに500を格納して、次に空リストを作成して要素を足すという解き方です。

どの解法のコードにも書いていますが、最後に「\n」(コードでは¥nと)と表示されているのは、改行を表す文字列です。

 

print(f'7の倍数:{lst_a}')
print(f'13の倍数:{lst_b}')
print(f'7と13の倍数:{lst_c}')

 

このように書くのは面倒なので、「\n」を用いて一行でこのように書いています。こうするだけでprintを3回書く必要がなくなります。

 

▼コード① 

print(f'7の倍数:{lst_a}\n13の倍数:{lst_b}\n7と13の公倍数:{lst_c}')

 

 あと、文字列の前に小文字の「f」を用意しているのは、挿入したい変数を{}の中に入れるためです。上のコードのように、出力したい変数を{}の中に入れることでその変数の中身を入れることが出来ます。

別の書き方として、文字列の最後に挿入したい変数をformatで括弧閉じしてコードを書くという方法もあります。

 

▼コード②

print('7の倍数:{}\n13の倍数:{}\n7と13の倍数:{}'.format(lst_a, lst_b, lst_c))

 

 この書き方では、どの{}に変数の中身が挿入されているのかひと目でわかりません。変数の中身をprint関数で出力させるためにはコード②で書いたほうがひと目で分かります。(あくまで個人的な意見ですが)

 

解法2: rangeのステップを利用

#解法2:rangeのステップを利用

num = 500

lst_a = []
lst_b = []
lst_c = []

for x in range(7, num+1, 7):
    lst_a.append(x)

for y in range(13, num+1, 13):
    lst_b.append(y)

for z in range(13*7, num+1, 13*7):
    lst_c.append(z)

print(f'7の倍数:{lst_a}\n13の倍数:{lst_b}\n7と13の倍数:{lst_c}')

 

この解き方は、rangeだけを用いてif文を使わない解き方です。以前の記事で触れましたが、rangeの書き方は以下の通りです。

 

range(開始値、終了値、ステップ)

 

始値:最初に取り出す整数の値

終了値:この整数の値から1を引くまで処理が行われます。終了値そのものは処理に含まれないので注意して下さい

ステップ:増加する整数の値(例えば、ステップ値が「10」なら、10ずつ増えることを意味する)

 

このうち、開始値とステップは省略できます。その際、開始値は「0」、ステップは「1」として動かされます。

 

解法3:リスト内包表記を利用

#解法3:リスト内包表記を利用
num = 500

lst_a = [x for x in range(7, num+1) if x % 7 == 0]
lst_b = [y for y in range(13, num+1) if y % 13 == 0]
lst_c = [z for z in range(7*13, num+1) if z % 7 == 0 and z % 13 == 0]

print(f'7の倍数:{lst_a}\n13の倍数:{lst_b}\n7と13の倍数:{lst_c}')

 

個人的には、この解法が最もシンプルで書くコードの量が少ないと思います。リスト内包表記を押さえておけば、appendメソッドやfor文、あるいはif文によるインデントエラーを未然に防ぐことができるのです!

リスト内包表記の書き方を次に簡潔に示しておきます。

 

[式 for 任意の変数 in コンテナ(if 条件式)]

 

これがPythonにおけるリスト内包表記の基本です。後ろにあるif文は省略できます。

 

さて、今回の記事では本ブログ最初の問題の解説、ということでしたがいかがだったでしょうか?あなたは何個解法を思い浮かべましたか?

良ければぜひコメントで教えて下さい!!

 

本ブログでは、こんな感じでPythonにまつわる情報や基本的な知識、Pythonの操作方法やニュースをたくさん紹介していきます。毎週日曜日に、普段とは趣向を変えて有名な自己啓発本・ビジネス書を要約・考察するブログを書いていきます。

この記事がいいと思った人はSNSにシェアしてくれると非常に嬉しいです!

明日は日曜日なので、有名な書籍の解説や考察をまとめた記事を書いていきます。紹介する本は『ニーチェの言葉』です。

今日も最後まで読んでくださりありがとうございました!

 

 

【参考図書】

gihyo.jp