for も,言語によって文法,実行結果は色々です。
同じ for という単語が使われていても,言語によって実際の挙動は違う可能性があります。
制御変数を途中でいじるとどうなる?
C においては,途中で制御変数を変更すると,意図した通り(?)次のループは変更した値を更新した値で実行されます。i を 5 にして,しかる後次のループでは i++ して 6 として実行。
#include <stdio.h>
int main(void){
int i;
for (i = 0; i < 10; i++) {
printf("%d\n", i);
if (i == 3) {
i = 5;
}
}
}
実行結果
0
1
2
3
6
7
8
9
Python では,制御変数をどういじろうが,粛々と実行が進みます。
つまり,前もって制御変数のリスト(正確な用語ではないかもしれないが)が作られそのリストに従って,順に制御変数に割り当ててループが実行される。
for i in range(10):
print(i)
if i == 3:
i = 5
0
1
2
3
4
5
6
7
8
9
ループを break で脱出したあとの制御変数の値はどうなる
Python では,break したときの値が保存されています。
for i in range(10):
if i == 3:
break
print(i)
3
C でも,同じです。
#include <stdio.h>
int main(void){
int i;
for (i = 0; i < 10; i++) {
if (i == 3) {
break;
}
}
printf("%d\n", i);
}
3
でも,Julia だと,スコープの関係で,ループを抜け出すと制御変数は「蒸発」しています。
julia> for i = 0:9
if i == 3
break
end
end
julia> print(i)
ERROR: UndefVarError: `i` not defined
Stacktrace:
[1] top-level scope
@ REPL[2]:1
なんだかんだと言っても,for にしろ何にしろ,それぞれの言語仕様によるので,一概に 「for はなんとかかんとかなんだよ。」と決めつけるのは良くないでしょうね。
C や BASIC (ALGOL なども),for は 「 i を 1 から n まで k 刻みで変化させて以下を実行してね」ということだったけど
Python や Julia その他の for は「i を 1 から n まで k 刻みまで変化してできる集合を順番に取って,以下を実行してね」になっている。だから,途中で制御変数をいじっても,何の遅滞もなく物事が進む。
今更ではあるが,「ドイツ語のfürの意味」についてあえてこじつけるなら,昔の言語 C, BASIC, ALGOL は「❼ ⸨時間的⸩ ⸨期間を表して⸩ …の間〔の予定で〕; ⸨予定の日時を表して⸩ …に.」なのかもしれないが,最近の新しい言語では「❿ ⸨反復・連続;無冠詞の同一語を反復して⸩ …ずつ, …ごとに.」に近いのかもしれない。
後者に関しては,for each に近いのだろう。繰り返しについてはあと2つ,for next, do loop がある。
要するに,「郷に入れば郷に従え」。個人的な感想・感慨はおいておいて,各言語の文法規約に従いましょう。従わないとプログラムが動かないんだからしようがない。