range()

当サイトではアフィリエイトプログラムを利用して商品を紹介しています。

【Python】range()

Python の組み込み関数 range() は連続数字シーケンスである rangeオブジェクト を生成します。たとえば range(10) は 0 から 9 までの 10 個の要素をもつシーケンスを生成します。rangeオブジェクトを list() に渡すとリストに変換されます。

# PYTHON_RANGE

# In[1]

x = list(range(10))
print(x)

# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

1 から 9 までの数字を並べる場合は次のように記述します:

# In[2]

x = list(range(1, 10))
print(x)

# [1, 2, 3, 4, 5, 6, 7, 8, 9]

1 から始まって 2 ずつ増える等差数列を生成することもできます。

# In[3]

x = list(range(1, 10, 2))
print(x)

# [1, 3, 5, 7, 9]

一般に range()関数は次のような形で呼びだします。

range([start,] stop[, step])

start は最初の数字で、デフォルト値は 0 です。
stop には最後の数字に 1 を加えたものを指定します。
step はとなり合う数字の差分です。

range() で数字を降順に並べる

range() のオプション引数 step に負の値を指定すると、数字を降順(大きい順)に並べることができます。

# In[4]

# 数字を降順に並べる
x = list(range(10, 0, -1))

print(x)

# [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]

rangeオブジェクトの数字を合計する

range オブジェクトをsum() 関数に渡すと、rangeオブジェクトの要素を合計します。

# In[5]

# range(5)の要素をすべて足す
# すなわち 1 + 2 + 3 + 4 + 5 を計算する
s = sum(range(5))
print(s)

# 10

繰り返し処理にrange()を利用する

range()関数for と組合わせて繰り返し処理に使うことができます。たとえば range(10) から順に1つずつ値を取り出すときには次のように記述します。

# In[6]

# rangeオブジェクトから順に値を取り出す
for x in range(10):
    print(x, end = "")

# 0123456789

for は range オブジェクトの最初から最後の要素まで順に取り出すので、range() 関数の引数がそのまま繰り返しの回数(ループ回数)となります。

# In[7]

# ループ回数を数える
count = 0
for x in range(100):
    count += 1
print("ループ回数は{}です".format(count))

# ループ回数は100です

最後に range()関数を使って「Python は楽しいな」を 3 回表示させてみましょう。

# In[8]

# Pythonは楽しいな
for x in range(3):
    print("Pythonは楽しいな")

# Pythonは楽しいな
# Pythonは楽しいな
# Pythonは楽しいな

それでは皆さんも range() をフル活用して、Pythonプログラミングを楽しんでください。

コメント

  1. あとりえこばと より:

    Pythonのrangeクラスをを自作するとしたら、以下のようなコードになります。

    class MyRange:
        def __init__(self, *args):
            num_args = len(args)
            if num_args == 0:
                raise TypeError("MyRange expected at least 1 argument, got 0")
            elif num_args == 1:
                self.start = 0
                self.stop = args[0]
                self.step = 1
            elif num_args == 2:
                self.start = args[0]
                self.stop = args[1]
                self.step = 1
            elif num_args == 3:
                self.start = args[0]
                self.stop = args[1]
                self.step = args[2]
            else:
                raise TypeError(f"MyRange expected at most 3 arguments, got {num_args}")
    
            # Adjusting start, stop, and step if step is zero
            if self.step == 0:
                raise ValueError("MyRange() arg 3 must not be zero")
            elif self.step > 0:
                if self.start >= self.stop:
                    raise ValueError("MyRange() arg 3 must be a negative value when start >= stop")
            else:
                if self.start <= self.stop:
                    raise ValueError("MyRange() arg 3 must be a positive value when start <= stop")
    
        def __iter__(self):
            current = self.start
            while (self.step > 0 and current < self.stop) or (self.step < 0 and current > self.stop):
                yield current
                current += self.step
    
        def __repr__(self):
            return f"MyRange({self.start}, {self.stop}, {self.step})"

    興味のある人は上のコードを目で追ってアルゴリズムを確かめてください。

  2. あとりえこばと より:

    【AI連載小説】羽村陽子のプログラミング日記(9)

    ある日、橋本はランチの合間を見計らって、陽子に向かって微笑みながら声をかけました。
    「陽子、range関数を他の関数と組み合わせて使うと、プログラムの幅が広がるんだよ。例えば、zip関数を使ってみるとどうだろう?」
    陽子は興味津々で応えました。
    「zip関数って、二つのリストを同時に扱えるんでしょう?」
    橋本は頷きながら、
    「その通りさ。それにrange関数を組み合わせると、例えばインデックスと要素のペアを手軽に取得できるんだ」
    と説明しました。

    # `zip`関数と`range`関数の組み合わせ
    fruits = ["apple", "banana", "orange", "grape"]
    for index, fruit in zip(range(len(fruits)), fruits):
        print(f"Index: {index}, Fruit: {fruit}")

    実際のコードを見せられながら、橋本は微笑みました。
    「これでリストの要素だけでなく、インデックスも利用できるんだ。プログラムの柔軟性が増すよね」
    陽子は理解が深まりながら、
    「確かに、これならより複雑なプログラムも構築できそうですね。新しいアイディアを試してみるのが楽しみです!」
    と興奮気味に語りました。橋本は最後に助言しました。
    「プログラミングは工夫と柔軟性が大切だから、様々な関数を組み合わせて実験してみて。自分なりのスタイルを見つけるのも楽しいよ」