前提・実現したいこと
初歩的な質問で恐縮ですが。。
以下のコードの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ページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
以下のコードの2行目でなぜ「2からa_num-1を繰り返す」となるのか分かりません。
rangeの仕様です。a_num「未満」の値がループされるようになっています。
参考:
4. 組み込み型 — Python 3.6.5 ドキュメント # range
numはどんな文字列でも構いません。
(キーワードや組み込みの名前と重複させないという一般的な話は別として)
投稿2018/09/03 22:51
総合スコア30933
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
総合スコア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)がメモリーに格納されている場合
番地 | データ |
---|---|
100 | 10 |
101 | 20 |
102 | 30 |
のようになっています。これを配列(あるいはリスト)と見立てて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
総合スコア18394
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/04 02:49
2018/09/04 03:03 編集
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。