【Python問題解説】第一問
スポンサードリンク
おはようございます!Shotaです。今日もPythonにまつわる記事を書いていきます!今日は私の記事で出題された解答を説明していきます!(ソースコードとセットで)
【目次】
問題
以下のようなプログラムを書き出して下さい。
◎まず1から500までの数字を順番に取り出す
◎取り出した数がもし7の倍数の場合は、7の倍数を入れるリストである「lst_a」に格納する
◎取り出した数がもし13の倍数の場合は、13の倍数を入れるリストである「lst_b」に格納する
◎取り出した数がもし7と13両方の倍数の場合は、「lst_c」に格納する
◎取り出し終えたら、それぞれ7の倍数と13の倍数のリストとわかるようにコマンドプロンプトに出力する(言い換えれば、「7の倍数リスト = 〇〇、13の倍数リスト = 〇〇」というようにprintで出力する)
以上の処理をコードに書いて実行すると、コマンドプロンプトには次のように出力されます。
▼問題が出題された記事(参照)はコチラ
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にシェアしてくれると非常に嬉しいです!
明日は日曜日なので、有名な書籍の解説や考察をまとめた記事を書いていきます。紹介する本は『ニーチェの言葉』です。
今日も最後まで読んでくださりありがとうございました!
【参考図書】