質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

3回答

1537閲覧

n個のアスタリスクをw個ごとに改行しながら表示するコードで、なくても表示が実現するのに付加されている記述とは何

haruohmi

総合スコア10

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/02/23 05:20

python3の文法をきちんと理解し治そうと思って勉強し直していたところ、for文の2重ループを使って、n個のアスタリスクをw個ごとに改行しながら表示する、というコード次のように何のために付加されているのか理解できない部分が出てきました。コードは次のようです。jupyter notebook python3.7.4

python3

1# n個の’*’をw個ごとに改行しながら表示 2 3n = int(input('全部で何個表示:')) 4w = int(input('何個ごとに改行:')) 5for i in range(1, n + 1): 6 print('*', end='') 7 if i % w == 0: 8 print() 9if n % w != 1: 10 print() 11print() 12

次が結果です。

python3

1全部で何個表示:17 2何個ごとに改行:6 3****** 4****** 5***** 6

上のコードの終わりの3行はなくても同一の結果が出てきます。nやwの値を幾つか変えても結果はそのように出てきます。これは一体何なのでしょうか。お教えください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

最後の3行の有無で、どう変わるかをまず、確認します。
lf.py

python3

1n = int(input('全部で何個表示:')) 2w = int(input('何個ごとに改行:')) 3 4for i in range(1, n + 1): 5 print('*', end='') 6 if i % w == 0: 7 print() 8if n % w != 1: 9 print() 10print()

lf-0.py

python3

1n = int(input('全部で何個表示:')) 2w = int(input('何個ごとに改行:')) 3 4for i in range(1, n + 1): 5 print('*', end='') 6 if i % w == 0: 7 print()

実行例
イメージ説明

2行目で * が5つある行の最後が改行されるかどうかの差があります。

私なら、 次のように書きます。
lf-01.py

python3

1n = int(input('全部で何個表示:')) 2w = int(input('何個ごとに改行:')) 3 4for i in range(1, n + 1): 5 print('*', end='') 6 if i % w == 0: 7 print() 8if n % w != 0: 9 print()

4, 3 や 4, 2 を入力したときの lf.py と lf-01.py の差を観てください。
実行例
イメージ説明

投稿2020/02/24 03:00

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruohmi

2020/02/26 01:47

丁寧にありがとうございます。
guest

0

最後の3行は改行文字を入れるためのコードです。
消しても同じように見えますが、ドラッグして見ると違うことに気づくはずです。
改行文字を「_」で置き換えるとこんな感じです。

python

1全部で何個表示:17_ 2何個ごとに改行:6_ 3******_ 4******_ 5*****_ 6_ # ここに余分な改行がある

シンプルかつ余分な改行も出さないコードです。

python

1# n個の’*’をw個ごとに改行しながら表示 2 3n = int(input('全部で何個表示:')) 4w = int(input('何個ごとに改行:')) 5for _ in range(n//w): 6 print('*' * w) 7if n%w != 0: 8 print('*' * (n%w))

【訂正】n%wが0のとき余分な改行が出てしまうのを修正しました。

投稿2020/02/23 05:46

編集2020/02/26 06:29
ChaosRepainter

総合スコア108

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruohmi

2020/02/23 06:39

なるほど、スマートな書き方だと思います。ところでなぜ改行を入れるコードが記述されているのでしょうか。使用していますのは、柴田望洋『新・明解Python入門』です。
ChaosRepainter

2020/02/23 07:47

そりゃ改行入れないと文字がそのまま続くからじゃない? 改行文字を「_」で置き換えるというのを正確に書くと 全部で何個表示:17_何個ごとに改行:6_******_******_*****__ こんな感じになるからね
guest

0

後ろの3行は改行を出力してるだけなので、見えないだけかと。
どういう条件のときにその改行を出してるのか読んでみては

投稿2020/02/23 05:40

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

haruohmi

2020/02/23 06:14

どうもよくわからないのですが、余りが0の場合、1の場合、それ以外で改行の数が違ってきているようですが、なぜそのようなことをする必要があるのかがよくわかりません。
y_waiwai

2020/02/23 06:37

まあ、それは読んだとおり、としか言いようがないです。 なぜそのようにしているかは、そのコードの製作者に聞かないとなんとも言えません
haruohmi

2020/02/23 06:43

なるほど、おっしゃるとおりです。申し訳ありません。何なのでしょうね。
y_waiwai

2020/02/23 06:49

このif文が if n % w != 0: であれば、最後の行の途中で終わったときに改行を挿入するってことで意味は通るんですが。 原典をみて、本当にここが !=1 なのか見てみては。
haruohmi

2020/02/23 07:22

0ではなく1になっています。誤植でしょうか。その可能性もあり得ますね。そのテキストは柴田望洋『新・明解Python入門』で本そのものは正確な記述でわかりやすいのでが、ほかにも誤植がありました。誤植の可能性はありますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問