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

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

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

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

Q&A

4回答

1172閲覧

pythonのとある問題について

garchomp

総合スコア128

Python 3.x

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

0グッド

0クリップ

投稿2017/05/24 01:09

現在簡単な問題を解くことをやっていますが、以下のコードで一応通りましたが、どうもぎこちない感じがしてなりません。

python

1x = input().split(" ") 2x0=int(x[0]) 3x1=int(x[1]) 4count=0 5for i in range(0,10): 6 print(x0,end="") 7 x0+=x1 8 count+=1 9 if 10>count: 10 print(" ",end="") 11 12

もうちょっとこう・・・スッキリ各方法もあるのかなと思いますが、どのような書き方がベストなんでしょうか?

また、組み立てる上での思考順序とかももしありましたらご教授お願いします。

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

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

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

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

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

guest

回答4

0

python

1x0, x1 = map(int, input().split()) 2results = (x0 + x1 * i for i in range(10)) 3print(*results)

投稿2017/05/24 04:45

YouheiSakurai

総合スコア6142

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

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

0

  • rangeにそもそも等差数列を作る機能がある
  • 文字列のリストを任意の区切り文字で結合する事ができる

python

1x = input().split(" ") 2start=int(x[0]) 3diff=int(x[1]) 4print(" ".join(map(str,range(start, start+diff*10, diff))))

投稿2017/05/24 02:38

ozwk

総合スコア13512

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

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

garchomp

2017/05/24 02:50

回答ありがとうございます! 等差数列を創る機能(map)はpythonで使うこともできたんですね・・・一ヶ月まえjavascriptでかじった程度が、内包表記に慣れる必要もあるみたいです^^; 苦手ではありますが、少しずつ練習して慣れるように頑張ります。
ozwk

2017/05/24 02:52

mapはただ数値のリストを文字列のリストにしているだけです。
garchomp

2017/05/24 02:54

intから全体がstrに変わったという認識でよろしいでしょうか? とりあえずいろいろ調べながら勉強進めてみます・・・
guest

0

同様の情報を分散させることは一般的にプログラムの無用な複雑化につながりバグの原因にもなるので避けた方がよいと思います。論理を考える上での規範の一つといってよいでしょう。coco_bauerさんの回答はそういう観点での指摘ですね。

同じ結果を得るためのアルゴリズムにはいくつものバリエーションがあります。それはコードをどうしたいかの観点により選択基準も違います。好みもあるでしょう。

例えばcountを除くとしてiによってどういう判定をするかについてもいくつか考えられます。元のコードでは「最後の要素の後ろにはスペースは印字しない」でしたが、それは「最初以外の要素の印字の直前にスペースを印字」するという方が分かりやすく感じる向きもあるでしょう。「最初以外」という境界条件の方が間違えにくいからです。ループを10回にしても20回にしても「最初以外」という条件判定は変える必要がないという点もポイントです。

さらに、最後の印字結果の次の値の計算を無駄に行っていることが気になる場合もあるかも知れません。加算なんてのは大したことない処理時間なので気にしなくてもいいですが、これが計算時間がかかる処理だったらどうでしょうか。気にするんじゃないでしょうか?

そんなことを考えると次のようなコードの方が好ましい場合もあります(これが一番よいわけではありません。あくまで一つの例です)。x0をprintする箇所が2か所になっている点は「好ましくない」と感じますが、ループの中が最小限の処理内容になっている点(条件判定もない点)さらには印字(出力)するのに必要最小限の計算を行っている点は「よい」と感じます。

python

1x = input().split(" ") 2x0 = int(x[0]) 3x1 = int(x[1]) 4print(x0,end="") 5for i in range(0,9): 6 x0 += x1 7 print("",x0,end="")

こういうちまちました点を細かく考えるというのは大部のコードを書くようになってから一々やっていたのでは時間がかかりすぎます。多くのプログラマーはそんな細かな点を一々考えずに書いていると思います。ただ初心者のころから多くの論理を書いてきた経験によって「ちまちま考えなくてもよりよいスタイルが自然に出てくる」ようになっているので実際にはちまちま考えません。ベテランになって「息をするようにコードが出てくる」人もいるでしょう。そういう人は多くの時間を訓練に費やした人だと思います。(自分はそんな域には全然達していませんのではっきりとはわかりませんが・・・)

質問者さんはまだ論理を組むこと自体を練習している段階ですので人から聞くのはまだまだ早いと思います。自分でコードをいろいろいじって経験を積む(考える訓練をする)方が得るものは大きいのではないでしょうか。

投稿2017/05/24 02:33

KSwordOfHaste

総合スコア18392

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

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

garchomp

2017/05/24 02:42

回答ありがとうございます! なるほど。一つの問題に対して色んな考え方をできるだけ自分で見出してみる。 その中でどの記述がベストプラクティスなのかを、とにかく書いて経験を積む。 その中で(感覚)でベストプラクティスな記述がわかるようになり、そこからさらに膨大化してきたらいかに読みやすく、かつスマートにするかを考える・・・なるほどですね。 なかなか面白いなと思いました。頑張ってみます!
KSwordOfHaste

2017/05/24 03:02

ちまちま考えつつ経験を積み、最終的にはちまちま考えずに済むozwkさんの回答のような知識を得るところへたどり着くのが一応の目標点になると思います w;
guest

0

変数 i は、for-in 文にあるだけで、それ以外のところで使われていません。
また、コードを追っていくと、変数 count と変数 i は同じ値になっている事が判ります。

こうした観測から
countは要らないのではないか(iで代用できるのではないか)
という改善策が思いつきませんか?

質問のコードからcountを外してみると、すっきり。

x = input().split(" ") x0=int(x[0]) x1=int(x[1]) # count=0 「countは使わないので、削除」 for i in range(0,10): print(x0,end="") x0+=x1 # count+=1 「countは使わないので、削除」 # if 10>count: 「countの代わりにiを使うので、書き換え」 if 10>i: print(" ",end="")

投稿2017/05/24 01:23

coco_bauer

総合スコア6915

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

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

garchomp

2017/05/24 02:19

回答ありがとうございます! 完全に盲点でした@@ なんで気づかなかったんだろう・・・orz よく考えてみたら変なiの使い方他のコードでもしてたような気がします・・・(汗)
magichan

2017/05/24 03:11

この場合、i の範囲は 0~9 なので、条件文 (10>i) は常にTrueとなるので (9>i) と書き換える必用があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問