3か月ぐらいしかpythonを使っていないビギナーの疑問なので、
本当のpythonの良さが分かっていないのだと思いますが、
どうしてpythonにはC言語ライクなfor文がないのでしょうか?
0から10まで回すためのfor文
1から10までを回すためのfor文
1から10までを0.1刻みで回すfor文
複雑な終端条件のfor文
10から1まで回すfor文
...
などなど
それぞれについてGoogle検索して目的のfor文を探す必要があります。
(それとも慣れると大丈夫なんでしょうか)
例えば1から10まで0.1刻みで回すfor文の場合
for i in range(1,11,0.1):
となりますが、これでは1とか11とか0.1が何を指しているかよく分からないし。
ちょっと複雑なfor文を書こうとするとすぐにGoogle検索する必要が出てきます。
メリットは何なのでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/16 01:48
回答9件
0
どうしてpythonにはC言語ライクなfor文がないのでしょうか?
C
1for (ループ初期化; ループ継続の判定; ループ継続時の追加処理) { 2 /* ループ本体処理 */ 3}
C言語ライクなfor文 = ループ初期化+ループ継続の判定+ループ継続時の追加処理 は、良くも悪くも 自由度が高過ぎる ため、Pythonに限らずモダンなプログラミング言語では採用されないことが多いように思います。C言語との互換性・類似性が重視される場合は、C言語ライクfor文 と Python的for文(foreach文)の両方が提供されるように思います。
また別の観点では、次のような違いがあります:
- C言語ライクfor文 = 手続き的・どのように反復処理するか(HOW)
- Python的for文 = 宣言的・何についての反復処理か(WHAT)
C言語ライクfor文は(C言語自身の古さもあり)どちらかと言えばコンピュータ寄り=「CPUで具体的に 何をする のか」という観点で記述されます。一方で、Python的for文はプログラマが「私(人間)は抽象的に 何をしたい のか」という観点で記述します。
例)リスト構造に含まれる全要素を列挙したい場合:
- C言語ライクfor文 = ポインタ型の宣言や、リンクノード間を辿るコード記述が必要
- Python的for文 = 直接的に「リストを走査する」処理を直接コード化できる
このような抽象化は、「イテレータ(iterator)」という仕組み・パターンを介して実現されます。プログラマの慣れの問題はありますが、一般的には後者の方がモダンで好ましいというトレンドにあります。
Pythonチュートリアル - for文より引用:
Pythonの
for
文は、読者がC言語やPascal言語で使いなれているかもしれないfor
文とは少し違います。(Pascalのように) 常に算術型の数列にわたる反復を行ったり、(Cのように)繰返しステップと停止条件を両方ともユーザが定義できるようにするのとは違い、Pythonのfor
文は、任意のシーケンス型(リストまたは文字列)にわたって反復を行います。
投稿2018/10/10 09:55
総合スコア6191
0
Cのfor文とpythonのfor文は、見た目は似ているようでかなり別のものだと思った方がいいと思います。Cにおいて、
C
1for(A;B;C){ 2 // 中身 3}
というのは、結局
C
1A 2while(B){ 3 // 中身 4 C; 5}
というのと同じですかね。つまり、まずAで初期化して、Bという条件が満たされている間、 中身のコード+Cを繰り返し実行する、という繰り返しを指示したものだと思いますが、pythonではあまり繰り返しということは意識されない気がします。pythonのfor文の一般形は
python
1for x in iterable_object: 2 do_something(x)
という感じです。iterable_objectというのは、何かしら1つずつ取り出してこれるオブジェクトです。(詳しくは、__iter__というメソッドを正しく実装しているものです。)組み込み型ではlist(配列)やrangeはもちろんのこと、set, dictなどが該当します。pythonのfor文では、このiterable_objectから一つずつ何か取り出して、それに対して何か操作をします。そして取り出し終わるか、breakが実行されたら、for文は終了します。
pythonのfor文のメリットは、配列などの中身を直接取り出すことができることだと思います。Cの場合は、配列の長さより小さいうちは、などという条件をつけてインデックスを一つずつ大きくし、arr[i]として配列の中身にアクセスしていく必要がありますが、pythonの場合は、単に
python
1for x in arr: 2 do_something(x)
とすれば良いのです。配列の中身を取り出すために、インデックを初期化したり、停止条件をつけたりという余計なことを考えなくても良いわけです。
複雑なfor文を書きたいときは、みなさんおっしゃるようにwhileを使えば良いと思います。つまり
C
1for(A;B;C){ 2 // 中身 3}
は
python
1A 2while B: 3 # 中身 4 C
と書けば良いです。でも、上に述べたようなpythonのfor文の特徴(一つずつ何か取り出してきて実行する)という特徴をうまく使えば、こういう構文はあまり必要にならないと思います。
投稿2018/10/10 09:57
総合スコア122
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/10 11:35
2018/10/10 11:50
2018/10/10 12:02
2018/10/10 12:06
2018/10/10 12:23
0
どうしてpythonにはC言語ライクなfor文がないのでしょうか?
イテレータを利用する方がモダンなのかと。
実際に最近の~~C/~~C++では、範囲ベースfor文が積極的に使われているかと思います。
(**修正: ** Cでは範囲ベースfor文は使えないようです。)
確かにCライクのfor文が欲しくなる時もありますが、そこまで不便さは感じないですね。
0から10まで回すためのfor文
1から10までを回すためのfor文
1から10までを0.1刻みで回すfor文
10から1まで回すfor文
全て range(start, stop, step) で対応可能です。
複雑な終端条件のfor文
while True で無限ループし、条件に合うとき break すれば良いです。
場合に依っては itertools.count も便利です。
だいたいこの手の疑問はデザインと歴史を調べれば解消するのですが、載っていないですね。
投稿2018/10/10 09:07
編集2018/10/10 09:20総合スコア35668
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/10 09:25
2018/10/10 09:31
0
range
の仕様を覚えれば、とりあえず大抵のインデックスループに対応できます。
どうしてもCライクなforがほしければ、whileで同様のことを実現しましょう。
なぜpythonにはCライクなfor文がないのか?
以下憶測。
Cスタイルのforってかなり滅茶苦茶なことができる構文です。カンマ演算子と代入で自由自在に難読コードを生成できます。
それを嫌ったというのは大いにありそう。
あと、単純に構文上なじまない気がします。文のヘッダで「代入文」を実行するというのも気持ち悪いですし。
投稿2018/10/10 09:30
総合スコア30935
0
c
1for (int i = 0; i < 10; i += 1) { 2}
と、
python
1i = 0 2while i < 10: 3 i += 1
に、どれほどの違いがあるというのだろう?
むしろPythonの方が文字数少ないというのに。
投稿2018/10/10 09:20
総合スコア16733
0
たしかに自分も C++ から来たので、for(;;) スタイルの構文がないのは戸惑いましたが、慣れの問題です。
次の2パターンだけ抑えておけば、大丈夫かと思います。
パターン1 数値の範囲 for
c
1for(TYPE i = begin; i < end; i += step)
は以下と読み替えます。
python
1range(begin, end, step) 2# float の場合は 3numpy.arange(begin, end, step) # range() の上位互換
パターン2 数値の範囲以外の for
python
1while 条件: 2 # 処理
投稿2018/10/10 09:14
総合スコア21956
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報
- Pythonのfor文によるループ処理(range, enumerate, zipなど)
https://note.nkmk.me/python-for-usage/
本当は、逆になぜ C では あのような for 構文が用意されたか? を考えるべきかもしれません。
i++ や ++i は機械語のそのまま落とせる表現です。
fortan での繰り返し構文は do 変数=初期値,最終値[,刻み幅] でした。(web 検索して調べました)
投稿2018/10/10 12:35
編集2018/10/15 15:32総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。