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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

Q&A

4回答

1223閲覧

PythonのFor分岐に関する質問です。

python365

総合スコア31

Python 3.x

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2018/09/03 22:41

前提・実現したいこと

初歩的な質問で恐縮ですが。。
以下のコードの2行目でなぜ「2からa_num-1を繰り返す」となるのか分かりません。
「2からa_numを繰り返す」ではないのでしょうか?
また、for numとありますが、numのところはどんな文字でも良いのでしょうか?
(例えば、for abcなど。。)
宜しくお願いします。

該当のソースコード

python

1a_num=57 2for num in range(2,a_num): 3 if a_num%num==0: 4 print(a_num,"は素数でない") 5 break

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

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

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

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

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

guest

回答4

0

以下のコードの2行目でなぜ「2からa_num-1を繰り返す」となるのか分かりません。

rangeの仕様です。a_num「未満」の値がループされるようになっています。

参考:
4. 組み込み型 — Python 3.6.5 ドキュメント # range

numはどんな文字列でも構いません。
(キーワードや組み込みの名前と重複させないという一般的な話は別として)

投稿2018/09/03 22:51

hayataka2049

総合スコア30933

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

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

0

以下のコードの2行目でなぜ「2からa_num-1を繰り返す」となるのか分かりません。

理解する、んじゃなくて、そう決まってるんだからそう覚えておこう、ということですね。

また、for numとありますが、numのところはどんな文字でも良いのでしょうか?

そこに書かれるのは変数名となりますんで、変数名として定義できる文字列であればなんでもいいです
#まあ、他に使われてる名前とかはダメ、とかありますが

投稿2018/09/03 22:50

y_waiwai

総合スコア87749

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

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

0

c での繰り返しの書き方は次のようになります。

c

1int a_num = 20; 2for (int i = 2; i < a_num; i++) { 3 `処理` 4}

これを見て人はすぐに、2 から a_num - 1 まで繰り返すと認識します。
(2 <= i < a_num の条件で i を変化させていく)

puthon では

python

1a_num = 20 2for i in range(2, a_num): 3 print(i)

とかいてあれば、2 から a_num - 1 まで繰り返します。
そのようの range の仕様が決められてるのです。
(2 <= i < a_num の条件で i を変化させていく)

range の仕様を 2 < i < a_num で変化させるとか、 2 <= i <= a_num で変化させるとこかの設計選択も可能性としては
考えられます。
でも 2 <= i < a_num で変化さえるという仕様が妥当と判断されたのだと思います。

for i in range(2, a_num)
は i を 2 <= i < a_num で変化させることを指示します。変化させる変数名前は 自由につけることができます。
abc でも 良いです。でも自由なのだからこそ、人が理解しやすい名前をつけるべきなのです。
abc では for の本文中に現れたときに わかりくいです。
(i は index の略で、ループカンターとして i を使うことは プログラマにとっては一般的です。)

  • Pythonのfor文によるループ処理(range, enumerate, zipなど)

https://note.nkmk.me/python-for-usage/

  • Python入門(5) 繰り返し文

http://www.isc.meiji.ac.jp/~mizutani/python/intro5_python.html

投稿2018/09/17 07:22

katoy

総合スコア22324

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

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

0

他の方が十分な回答をされてますが・・・少々蛇足なコメントをしてみました。

リファレンスを見るとこれが仕様であることはわかりますが、計算機の世界に触れて間もない時代には「なぜそんな仕様なんだろう」と感じるかもしれません。リファレンスにもいちいち「なぜ?」とは書いてないだろうと思います。しかしちょっとプログラミングの経験を積むと早晩なぜそうなっているかがわかってくるだろうと思います。


rangeの完全なパラメーターは

range(start, stop, step)

となっていてstartを省略すると規定値は0、stepを省略すると規定値は1が仮定され、stopは省略できません。

最もよく用いられるのは

range(stop)

という形式ですがこの場合生成される数列は0, 1, 2, ..., stop-1です。これが「仕様」なのですが、なぜこういう仕様なのでしょうか?

「rangeの一般形はstartから始まってstopを超えない値を生成すること」なので、こういう仕様ですとrange(N)と記述した場合「N個の数列を生成する」こととなりfor文で用いた場合「N回繰り返す」ことを簡潔かつ自然に表現できます。しかしstartの規定値を0ではなく1として生成する数列を

1, 2, ..., stop

という仕様の方が自然に感じるかもしれません。つまりstop-1ではなくstopが最後の要素になるという考え方ですね。そういう仕様も確かにあり得るとは思います。実例を言えばBASICのFOR文ではfor i=1 to Nと記述すると1からNまでN回ループするのでそういう考え方に近いと思います。

人間が日常用いる序数は「最初を1番目、最後はN番目」という習慣ですが、計算機言語では「最初は0番目、最後はN-1番目」と考えることが多いと思います。Pythonのrangeもそうであるといえましょう。その理由は単純に「最初が0」の方が都合がよいことがあるからです。例えばこの数列を配列やリストの指標として用いることを想定してみるとPythonのリストや配列の指標は1が最初ではなく0が最初なので「最初からN個の要素をアクセスするための指標」の数列を生成したい場合range(N)と記述できるのです。

じゃぁなぜ指標は「最初が0」なのかといえばおそらく計算の都合だと思います。計算機ではメモリーにデータを格納してそれをプロセッサーがアクセスしながら計算を進めるためメモリーのアクセスには「番地」を計算する必要があります。例えば100番地から始まる各々1バイトの3つの連続データ(10, 20, 30)がメモリーに格納されている場合

番地データ
10010
10120
10230

のようになっています。これを配列(あるいはリスト)と見立ててi番目の要素の番地を計算することを考えたとき、序数を「1から始める」という考え方を用いるならi番目のデータの番地は

100 + i - 1

のように計算の都合上1を減算する必要がでてきます。これを「序数を0から始める」考え方に変えれば

100 + i

でよくなります。アドレスの計算なんてプログラマーが気にしなくてもPythonインタープリタがよきに計らってくれるのだからこれが根拠で「0始まりがよい」とは言えないかもしれません。しかし、「i番目から始まる部分数列の中のj番目」というアクセスを考えてみてください。「1から始まる序数」の考え方を用いる場合は「元の領域のi + j - 1番目」ということになり、プログラマーが考えなければならない「指標」の計算上にも「-1」という数合わせが必要になってきますね。これに対し序数を0から始める考え方では「元の領域のi + j番目」という単純加算でよくなますし、番地計算は

100 + i + j

でよくなるのでこちらの方がプログラミング上も言語の実装上もすっきりとした考え方にできるといえると思います。このように指標を0から始めた方が色々と合理的な面があると思います。合理的な仕様を採用すると論理が単純になるためバグ(不良)も作りこみにくくなります。そういう事情で多くの言語設計者が序数の仕様を「0から始める」と定めているのではないでしょうか。


数学ではギリシャで発達した時代には1が最初の数だったそうです。0という数がまだ認識されてなかったからだそうですが、0が発明されてみると「0を数の始まりとする」考え方の利点が様々な面でわかってきたのだそうです。上の話題もその一つではないかと思います。今日でも人間の序数の表現では(ギリシャ時代の習慣で?)「最初は1」と考えますが、少なくとも計算機の世界をとらえる際には多くのプログラマーが「最初を0」とする考え方に親しむようになるのではないでしょうか。

投稿2018/09/04 01:13

KSwordOfHaste

総合スコア18394

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

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

umyu

2018/09/04 01:59 編集

蛇足の蛇足ですが、@KSwordOfHasteさんへ ◆Python作者によるPythonは0オリジンのインデックスを使う理由の説明 https://plus.google.com/115212051037621986145/posts/YTUxbXYZyfi http://python-history.blogspot.com/2013/10/why-python-uses-0-based-indexing.html ◆[Python-ideas] [Python-Dev]Inclusive Range https://mail.python.org/pipermail/python-ideas/2010-October/008188.html ◆所感としては 良し悪しは別としてJavaだとIntStreamはrangeとrangeClosedに分かれてますね。 https://docs.oracle.com/javase/jp/10/docs/api/java/util/stream/IntStream.html#rangeClosed(int,int)
KSwordOfHaste

2018/09/04 02:49

コメントありがとうございます。 > Using 0-based indexing, half-open intervals, and suitable defaults (as Python ended up having), they are beautiful: a[:n] and a[i:i+n]; the former is long for a[0:n]. といったあたり、beautifulは「合理的」と同義と思いました。自分の回答は作者さんのコメントを見てのものではないですがたいていのプログラマーはこの合理性を好むという点がポイントではないかと愚考します。
KSwordOfHaste

2018/09/04 03:03 編集

Javaのrange/rangeClosedの例は、ループは様々な場面で用いられるため終端条件は < limit <= limit の両方の場合がありJavaやSwiftなどその両方に対応した機能を用意している言語やライブラリーがあるということだと思います。本回答はその中の「< limit」という終端条件に着目して「なぜその仕様があり得るのか」に関しての考えを述べたものです。なお個人的にはどちらか一方だけを用意するとしたら「< limit」という終端条件の方を採用するのがより合理的ではないかと思ったりします。 --- と書いちゃいましたが「< limitの方がより合理的」はいいすぎかも。単に「< limit」という終端条件にもこんな合理的なケースがあるという程度のことかも知れません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問