質問: range(0, 10, -1) len(r) #=> 0 for i in r: print(i) # 出力無し ``` どちらもエラーは発生しない。 ### 補足情報(言語/FW/ツール等のバージョンなど) Python: 3.6.1 ipython: 6.1.0
回答: 似たような質問がありましたので参考に貼り付けます。 ***先行事例** Stack overflowのFerdinand Beyerさんによれば、 * Pythonのビルドイン(関数)については、"不正な引数"や"ナルポインタ"は存在しない。 * 大半の関数は、TypeError(NoneTypeのような不正な型)やValueError(型は正しくても、値が受け入れられるドメインの外側にある)を引き起こす。 ***公式ドキュメント** TypeError IndexError ValueError まとめると、 | | TypeEror | IndexError | ValueError | | --- | --- | --- | --- | | 型が異常 | * | - | - | | インデックスに限定した値が異常 | - | * | - | | インデックス以外の理由で値が異常 | - | - | * | ***本題** ここで問題に戻ると、 | | `range(10, 0)` | `range(0, 10, -1)` | | --- | --- | --- | | 型が異常 | - | - | | インデックスに限定した値が異常 | - | - | | インデックス以外の理由で値が異常 | - | - | このように、質問の内容は**Pythonが規定しているエラーの要件を満たしていません**。 でも、対象の値がないからって`0`、**数値としての`0`を返すのも不適当**です。 苦肉の策として、があるのではないでしょうか? '人間の気持ちとしてEmptyを返すくらいならValueErrorだろ!と思いますが、内部では、引数が変数だった場合にむやみに止まるのを防ぐためにEmptyを返しているのかもしれませんね。