rangeによるrangeの違い
Pythonのコードをちゃんと書いたことはないのだけど、ある理由でPythonのコードを読んでいて、ふと気になって調べたメモ。
結論から言うと、rangeで範囲を指定したときに列挙される値が、プログラム言語や、同じ言語でも書き方によって違うのだな、と。
実行環境
Python
以下のコードを実行する。
- range.py
for i in range(1, 2): print(i)
実行結果。
1
つまり、for (i = 1; i < 2; ++i)
(疑似コード)って書くのと一緒。
PHP
以下のコードを実行する。
- range.php
<?php foreach (range(1, 2) as $i) { printf("%d\n", $i); }
実行結果。
1 2
つまり、for (i = 1; i <= 2; ++i)
(疑似コード)って書くのと一緒。
Java
ついでなので調べてみたら、Java 8からjava.util.stream.IntStreamというのが追加されていた。
IntStreamには、range(int, int)
とrangeClosed(int, int)
の2種類がある。
forEachメソッドのところは適当にググって真似てみた(謎)。
- Range.java
import java.util.stream.IntStream; public class Range { public static void main(String[] args) { IntStream.range(1, 2).forEach(i -> { System.out.println(i); }); } }
実行結果。
1
こっちはPython式。
- RangeClosed.java
import java.util.stream.IntStream; public class RangeClosed { public static void main(String[] args) { IntStream.rangeClosed(1, 2).forEach(i -> { System.out.println(i); }); } }
実行結果。
1 2
こっちはPHP式。
Ruby
さらについで。Rubyのプログラムもちゃんと書いたことはないのでググって調べてみた。
- range.rb
for i in 1...2 do print(i, "\n") end
または、
for i in Range.new(1, 2, true) do print(i, "\n") end
実行結果。
1
Python式。
- rangeClosed.rb
for i in 1..2 do print(i, "\n") end
または、
for i in Range.new(1, 2) do print(i, "\n") end
実行結果。
1 2
PHP式。
まとめると・・・
言語 | プログラムの記述例 | 実際の範囲 |
---|---|---|
Python | for i in range(1, 100): |
1 <= i < 100 |
PHP | foreach (range(1, 100) as $i) |
1 <= $i <= 100 |
Java | IntStream.range(1, 100).forEach(i (略) |
1 <= i < 100 |
IntStream.rangeClosed(1, 100).forEach(i (略) |
1 <= i <= 100 | |
Ruby | for i in 1..100 do |
1 <= i <= 100 |
for i in Range.new(1, 100) do |
1 <= i <= 100 | |
for i in 1...100 do |
1 <= i < 100 | |
for i in Range.new(1, 100, true) do |
1 <= i < 100 |