コンピュータ言語は必ずし数学や論理学と同じ論理で動くわけではありません。
その理由は、コンピュータの物理的な制約によるものもあれば、言語処理系の制約によるもの、使う人間の便利さを考慮したものなどさまざまです。
例えば、以下の計算を見てみましょう。
python
1>>> print(1.0/49.0*49.0)
20.9999999999999999
数学では交換法則によって1.0/49.049.0 = 49.01.0/49.0 = 49.0/49.0 = 1.0 ですが、コンピュータでは、データによって順番を変えることは処理系にとって難しいですし、CPUの計算精度の問題があり、0.9999999999999999となります。
ではWhile文について考えてみましょう。
多くのコンピュータ言語にあるwhile文は、while文の後ろに書かれた条件が成り立つならループを抜け、成り立たないならループを抜けるという機能を持つ文です。擬似コードで書くと以下のような感じです。
@loop@
if condition goto @break@
・・・
・・・
goto @loop@
@break@
そこで、noob-questionさんのコード
python
1 while l[i] < n and I < len(l):
2 i += 1
をif文を使って書き換えてみると以下のようになります。
python
1 while True:
2 if i < len(l) and l[i] < n:
3 break
4 i += 1
i < len(l) and l[i] < n がブール代数の交換法則を満たすならば l[i] < n and I < len(l) と書いても同じ結果を出すはずです。つまり、どちらで書いてもlist index out of rangeというエラーが出ることになります。エラーがでないようにするには、二重のif文にするしかありません。
python
1 while True:
2 if i < len(l):
3 if l[i] < n:
4 break
5 i += 1
二重のif文は読みにくいですね。
これを元のようなwhile文で書こうと思うと
python
1 while i < len(l):
2 if l[i] < n:
3 break
4 i += 1
ますます読みにくくなります。
A and Bは、Aが偽ならBが何であっても全体として偽になります。
コンピュータの性能的にはAを計算して偽ならBの計算をしない方が高速です。
Aが偽の時にBを計算しないことにすればプログラムは読みやすくなります。
そして、それで困ることは何もありません。
ということで、pythonに限らず、知っている限り全てのコンピュータ言語は、andはAが偽ならBは処理しないというように決めています。
結局、便利だし問題はないということで、こういう処理をするように言語開発者がそう決めたのです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/10 02:23
2021/01/10 10:02