HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

rangeによるrangeの違い

Pythonのコードをちゃんと書いたことはないのだけど、ある理由でPythonのコードを読んでいて、ふと気になって調べたメモ。

結論から言うと、rangeで範囲を指定したときに列挙される値が、プログラム言語や、同じ言語でも書き方によって違うのだな、と。

実行環境

Python

以下のコードを実行する。

  • range.py
for i in range(1, 2):
    print(i)

実行結果。

1

つまり、for (i = 1; i < 2; ++i)(疑似コード)って書くのと一緒。

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メソッドのところは適当にググって真似てみた(謎)。

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式。

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