Pythonの範囲指定とは?range・スライス・条件分岐の使い方を解説

この記事のポイント

Pythonの範囲指定について、初心者の方でも理解しやすいよう基礎から応用まで段階的に解説していきます。

  • range関数による数値範囲の生成とループ処理での活用方法
  • スライス構文を使ったリストや文字列の部分抽出テクニック
  • 条件分岐と組み合わせたデータフィルタリングの実践的な手法

これらのポイントを押さえることで、効率的なプログラムが作成できるようになります。

目次

Pythonの範囲指定の基本

Pythonプログラミングでデータを効率的に処理するためには範囲指定は欠かせない機能です。ここでは範囲指定の基本概念から、実際のコードでの使い方まで順を追って説明します。範囲指定を理解することで、リストの操作や繰り返し処理がよりスムーズに書けるようになります。

【関連】
Pythonをもっと詳しく学ぶならpaizaラーニング

範囲指定とは?

範囲指定とは、データの中から特定の部分だけを取り出したり、決められた回数だけ処理を繰り返すときに使う仕組みです。例えば、1から10までの数字を順番に処理したい場合や、リストの最初の3つの要素だけを取得したい場合に活用します。

# 動物のリストから最初の3つを取得 animals = ["ネコ", "イヌ", "ウサギ", "ハムスター", "インコ"] first_three = animals[0:3] print(first_three)

出力結果

['ネコ', 'イヌ', 'ウサギ']

Pythonにおけるインデックスと範囲の関係

Pythonでは、リスト文字列の要素にインデックスと呼ばれる番号を付けて管理しています。インデックスは0から始まり、最初の要素が0番目、2番目の要素が1番目というように数えます。

pets = ["ネコ", "イヌ", "ウサギ", "ハムスター"] print(pets[0]) # 最初の要素 print(pets[1]) # 2番目の要素 print(pets[2]) # 3番目の要素

出力結果

ネコ
イヌ
ウサギ

コロンで表現するスライス構文の基礎

リストから複数の要素を一度に取り出すときは、コロン(:)を使ったスライス構文が便利です。コロンは「〜から〜まで」という意味で、開始位置と終了位置を指定できます。終了位置の要素そのものは含まれない点(未満)に注意が必要です。

zoo_animals = ["ライオン", "ゾウ", "キリン", "パンダ", "コアラ"] # 1-3までを取り出す(1, 2, 3が順番に取り出され、4は含まない) middle_animals = zoo_animals[1:4] print(middle_animals)

出力結果

['ゾウ', 'キリン', 'パンダ']

range関数による範囲指定

range関数は、連続する数字の範囲を生成するPythonの組み込み関数です。主に繰り返し処理で使用され、指定した回数だけループを実行したり、特定の数値範囲で計算を行うときに活用します。ここではrange関数の基本的な使い方から応用テクニックまでを学んでいきましょう。

なお、以下の記事でもrange関数について詳しく解説しています。

【関連】Pythonのrangeの使い方を徹底解説!基本から応用まで

range関数の基本構文

range関数は「range(開始値, 終了値, 増分値)」の形で書きますが、初心者が間違えやすいポイントは、指定した終了値そのものは含まれないという点です。例えば、range(1, 5)と書くと1, 2, 3, 4の4つの数字が生成されます。開始値を省略すると0から始まり、増分値を省略すると1ずつ増加します。

# 0から4まで(5は含まない) for i in range(5): print(f"{i}匹目のペンギン")

出力結果

0匹目のペンギン
1匹目のペンギン
2匹目のペンギン
3匹目のペンギン
4匹目のペンギン

for文との組み合わせによる繰り返し処理

range関数は、for文と組み合わせて繰り返し処理を行う場面で最もよく使われます。指定した回数だけ同じ処理を実行したいときや、リストの要素数に応じてインデックス(番号)を順番に取得したいときに便利です。

birds = ["スズメ", "カラス", "ハト"] for i in range(len(birds)): print(f"{i+1}番目の鳥: {birds[i]}")

出力結果

1番目の鳥: スズメ
2番目の鳥: カラス
3番目の鳥: ハト

負の範囲・逆順処理・step指定による柔軟な操作

range関数では、第3引数にstep(増分値)を指定することで、2つおきに数字を取得したり、負の数を指定することで数字を逆順に並べたりすることができます。

# 逆順でカウントダウン print("サルの群れのカウントダウン:") for count in range(5, 0, -1): print(f"残り{count}匹のサル") print("サルがいなくなりました")

出力結果

サルの群れのカウントダウン:
残り5匹のサル
残り4匹のサル
残り3匹のサル
残り2匹のサル
残り1匹のサル
サルがいなくなりました

rangeとリスト化のポイント

実はrange関数が生成するのは実際の数字のリストではなく、範囲オブジェクトという特殊なデータ形式です。中身を具体的に確認したい場合は、list関数を使って通常のリストに変換する必要があります。

手間に見えますが、この仕組みにより大きな範囲を指定しても、メモリをほとんど消費せずにすむという効率性があります。

import sys # 100万個の範囲を指定 num_count = 1000000 range_obj = range(num_count) list_obj = list(range_obj) # getsizeofでメモリ消費量を取得する print(f"rangeオブジェクトのサイズ: {sys.getsizeof(range_obj)} バイト") print(f"リストのサイズ : {sys.getsizeof(list_obj)} バイト")

出力結果

rangeオブジェクトのサイズ: 48 バイト
リストのサイズ            : 8000056 バイト

スライス構文による配列の範囲抽出

スライス構文は、リストや文字列から特定の範囲の要素を抽出するPythonの機能で、データの一部分だけを取り出したり、特定のパターンで要素をサンプリング(選別)したりする際に活用します。

ここでは、スライスの基本的な書き方から高度なテクニックまでを実例とともに学んでいきましょう。

リストのスライス基本構文とコロンの意味

スライス構文は「リスト[開始:終了:ステップ]」の形で記述します。コロンで区切られた各部分には、それぞれ開始インデックス、終了インデックス、取得間隔の意味があります。終了インデックスの値自体は含まれず(例:[1:4]は1, 2, 3の値を取得)、各パラメータは省略することも可能です。

farm_animals = ["ウシ", "ブタ", "ヒツジ", "ニワトリ", "ヤギ", "ウマ"] # 最初の3つを取得 first_three = farm_animals[0:3] print("最初の3匹:", first_three) # 2番目から最後まで from_second = farm_animals[1:] print("2番目以降:", from_second)

出力結果

最初の3匹: ['ウシ', 'ブタ', 'ヒツジ']
2番目以降: ['ブタ', 'ヒツジ', 'ニワトリ', 'ヤギ', 'ウマ']

範囲外アクセス・負のインデックスの仕組み

Pythonでは、負のインデックスを使って後ろから数えて要素にアクセスでき、例えば-1が最後の要素、-2が最後から2番目の要素を表します。通常のインデックス指定は範囲外はIndexErrorとなりますが、スライスで範囲外を指定してもエラーにならず、存在する部分だけが抽出される点も特徴です。

ocean_animals = ["クジラ", "イルカ", "アザラシ", "ペンギン", "ラッコ"] # 負のインデックスで後ろから取得 last_two = ocean_animals[-2:] print("最後の2匹:", last_two) # 最後の要素を除いて取得 except_last = ocean_animals[:-1] print("最後を除く:", except_last)

出力結果

最後の2匹: ['ペンギン', 'ラッコ']
最後を除く: ['クジラ', 'イルカ', 'アザラシ', 'ペンギン']

文字列に対する範囲指定と抽出の実例

Pythonの文字列も、リストと同じようにスライス構文を使って部分的に抽出できます。文字列の特定の位置から指定した文字数だけ取り出したり、文字を飛ばし飛ばしで取得することが可能です。これは、文字列処理や文書解析で頻繁に使われるテクニックです。

animal_name = "シロクマ" first_char = animal_name[0] print("最初の文字:", first_char) animal_sentence = "ゾウは大きな動物です" animal_part = animal_sentence[0:2] print("動物名部分:", animal_part)

出力結果

最初の文字: シ
動物名部分: ゾウ

複雑なスライス(ステップやネスト)の活用例

ステップを指定することで、要素を一定間隔で取得したり、逆順に並べ替えることができます。ステップに-1を指定するとリスト全体が逆順になり、正の数を指定するとその数だけ飛ばしながら取得します。これらの組み合わせにより、データの並べ替えや特定パターンでの抽出が可能になります。

jungle_animals = ["トラ", "サル", "オウム", "ヘビ", "チョウ", "カエル"] # 1つおきに取得 every_other = jungle_animals[::2] print("1つおき:", every_other) # 逆順に並び替え reversed_animals = jungle_animals[::-1] print("逆順:", reversed_animals)

出力結果

1つおき: ['トラ', 'オウム', 'チョウ']
逆順: ['カエル', 'チョウ', 'ヘビ', 'オウム', 'サル', 'トラ']

条件分岐(if)と範囲指定の組み合わせ活用

条件分岐(if文)と範囲指定を組み合わせることで、より柔軟なデータ処理が可能になります。特定の条件を満たすデータだけを抽出したり、範囲内の値かどうかをチェックする処理は、実際のプログラムでよく使われます。

ここでは、if文と範囲指定を組み合わせた実践的なプログラムの書き方を学んでいきましょう。

数字の範囲チェックにおけるifの基本構文

if文を使って、数値が特定の範囲内にあるかどうかをチェックできます。比較演算子(<、>、<=、>=)を組み合わせることで、最小値と最大値の間にある値だけを判定することが可能です。andやorといった論理演算子も組み込んで、条件文を記述することもできます。

animal_age = 5 if 3 <= animal_age <= 10: # if a <= animal_age and animal_age <= 10: でも可 print(f"年齢{animal_age}歳のキツネは成年です") else: print(f"年齢{animal_age}歳のキツネは成年ではありません")

出力結果

年齢5歳のキツネは成年です

複数条件による抽出・フィルタリング処理

複数の条件を組み合わせて、リストからデータをフィルタリングする処理です。for文による繰り返し処理とif文による判定を組み合わせることで、条件に一致する要素だけを新しいリストに追加できます。この手法は、大量のデータから必要な情報だけを取り出すときに便利です。

animal_weights = [2, 15, 45, 8, 120, 3, 67] medium_animals = [] for weight in animal_weights: if 10 <= weight <= 50: medium_animals.append(weight) print("中型動物の体重:", medium_animals)

出力結果

中型動物の体重: [15, 45]

rangeとifを組み合わせた制御ロジックの実例

range関数で生成した数値に対してif文で条件判定を行う処理は、特定のパターンでの処理実行や、条件付きカウンターの実装などで活用されます。例えば偶数だけ処理したり、特定の倍数のときだけ異なる処理を実行するといった制御が可能です。

print("動物園の動物カウント:") for i in range(1, 11): if i % 3 == 0: print(f"{i}匹目: トラ(特別展示)") else: print(f"{i}匹目: ライオン")

出力結果

動物園の動物カウント:
1匹目: ライオン
2匹目: ライオン
3匹目: トラ(特別展示)
4匹目: ライオン
5匹目: ライオン
6匹目: トラ(特別展示)
7匹目: ライオン
8匹目: ライオン
9匹目: トラ(特別展示)
10匹目: ライオン

よく使う範囲指定テクニックと実践例

実際の開発現場では、範囲指定を使ったさまざまなプログラミングテクニックが活用されています。ここでは、日常的によく使われるパターンから、より効率的な処理方法まで、実践的な例とともに紹介します。これらのテクニックを身につけることで、誰が見ても読みやすく、コンピュータにとっては効率的なコードが書けるようになります。

forとrangeで扱う典型的な反復処理パターン

繰り返し処理では、リストの長さに応じた回数の処理や、連番を使った処理がよく使われます。インデックス番号が必要な場合は、range(len(リスト))の書き方でリストの長さ分の番号をつくります。また、特定の回数だけ同じ処理を繰り返したいときにも、rangeが活躍します。

pet_names = ["ポチ", "タマ", "チロ", "モモ"] print("ペットの登録処理:") for i in range(len(pet_names)): print(f"ID:{i+1} - {pet_names[i]}を登録しました")

出力結果

ペットの登録処理:
ID:1 - ポチを登録しました
ID:2 - タマを登録しました
ID:3 - チロを登録しました
ID:4 - モモを登録しました

スライスと条件分岐を組み合わせたデータ加工

リストの一部分を取り出してから、さらに条件によってフィルタリングする処理です。大きなデータセットから必要な範囲を切り出し、その中から条件に合うものだけを選択するという2段階の処理を組み合わせることで、効率的なデータ加工が可能になります。

all_animals = ["イヌ", "ネコ", "ウサギ", "ハムスター", "カメ", "インコ", "金魚"] small_pets = all_animals[1:5] # 一部を切り出し suitable_pets = [] for pet in small_pets: if len(pet) <= 3: # 名前が3文字以下 suitable_pets.append(pet) print("元データ:", all_animals) print("切り出したデータ:", small_pets) print("適した小動物:", suitable_pets)

出力結果

元データ: ['イヌ', 'ネコ', 'ウサギ', 'ハムスター', 'カメ', 'インコ', '金魚']
切り出したデータ: ['ネコ', 'ウサギ', 'ハムスター', 'カメ']
適した小動物: ['ネコ', 'ウサギ', 'カメ']

rangeとenumerateを併用した効率的なインデックス処理

enumerateは、リストの要素とそのインデックスを同時に取得できる関数です。rangeとlenを組み合わせる方法と比べて、コードが読みやすくなるため、よりPython らしい書き方とされています。インデックスと値の両方をつかって処理する場面で威力を発揮します。

wild_animals = ["オオカミ", "クマ", "シカ", "キツネ"] print("野生動物の目撃情報:") for index, animal in enumerate(wild_animals): print(f"報告{index+1}: {animal}を発見")

出力結果

野生動物の目撃情報:
報告1: オオカミを発見
報告2: クマを発見
報告3: シカを発見
報告4: キツネを発見

エラー回避のポイント

範囲指定でよくある間違いは、リストの長さを超えたインデックスにアクセスすることです。事前にlenでリストの長さを確認したり、try-except文を使って例外処理を組み込むことで、エラーが発生したときもプログラムが異常終了せず、安全に実行できます。また、スライスやrangeのときは範囲の終了値が含まれない、という点も注意が必要です。

sea_animals = ["イルカ", "クジラ"] # 安全なアクセス方法 try: for i in range(len(sea_animals) + 1): # 意図的に範囲外アクセス print(sea_animals[i]) except IndexError: print("リストの範囲を超えました")

出力結果

イルカ
クジラ
リストの範囲を超えました

よくある質問(Q&A)

Q: range(5)とrange(0,5)は同じ結果になりますか?

A: はい、どちらも0から4までの同じ結果になります。range関数では開始値を省略すると自動的に0から始まるため、range(5)はrange(0,5)と同じ動作をします。

Q: リストのスライスで[::-1]はどんな意味ですか?

A: 全ての要素を逆順に取得する意味です。開始と終了を省略し、ステップに-1を指定することで、リスト全体を後ろから一つずつ並べ替えます。

animals = ["イヌ", "ネコ", "ウサギ"] print(animals[::-1])

出力結果

['ウサギ', 'ネコ', 'イヌ']

Q: 範囲外のインデックスを指定するとどうなりますか?

A: 通常のインデックスアクセス(例:data[100])ではエラーになりますが、スライス(例:data[0:100])では範囲外を指定してもエラーにならず、存在する部分だけが返されます。

Q: for文でインデックスと値を同時に取得する最良の方法は?

A: enumerate関数を使用する方法が推奨されます。range(len())よりも簡潔で読みやすく、Pythonらしいコードになります。

pets = ["ハムスター", "インコ"] for i, pet in enumerate(pets): print(f"{i}: {pet}")

出力結果

0: ハムスター
1: インコ

Q: range関数の結果を直接printで表示できないのはなぜ?

A: rangeは実際の数値リストを作っているのではなく、rangeオブジェクトという数字を生成するルールだけを返すためです。数値を確認したい場合はlist()で変換してから表示する必要があります。

まとめ

Pythonの範囲指定は、効率的なプログラム作成において欠かせない基本的なスキルです。range関数による数値範囲の生成、スライス構文でのデータ抽出、条件分岐との組み合わせなど、さまざまな場面で活用できる汎用性の高い機能といえます。

ポイント

  • range関数は繰り返し処理で頻繁に使用される基本機能である
  • スライス構文により配列の部分抽出が直感的に行える
  • 負のインデックスで後ろからの要素アクセスが可能となる
  • 条件分岐と組み合わせることで柔軟なデータ処理を実現できる
  • enumerateの活用でより読みやすいコードが書ける

初心者の方は、まず基本的なrange関数とスライスの使い方を覚え、慣れてきたら条件分岐や応用的なテクニックに挑戦してみてください。実際にコードを書いて動かしながら学習することで、より深く理解できるでしょう。

プログラミングを体系的に学習したい方には、実際にコードを書きながら学べるpaizaラーニングがおすすめです。段階的にスキルアップしながら、実践的なプログラミング能力を身につけることができます。

レベルを更に上げたい方はpaizaプログラミングスキルチェックへ

  1. paizaラーニングトップ
  2. ナレッジ
  3. Pythonのナレッジ記事一覧
  4. Pythonの範囲指定とは?range・スライス・条件分岐の使い方を解説