高校生物551766 views
英語613639 views
いろは3010814 views
小学社会310485 views
小学算数1200427 views
雑学1473612 views
高校日本史190571 views
高校倫理1440106 views
ヒストリア290598 views
中学英語811710 views
Help
Tools
NewsSpreadsheetCalendarSlidesTier ListPen ToolIllustrationCrayonPixel ArtASCII ArtPerspectiveEndless StairsGraphMind MapER DiagramFamily TreeMemeCurved TextImage EditorMosaicRetro FilterPencil SketchOCR/HighlighterMakeup EditorFaviconVideo TrimmerScrolling VideoVideo TitleColor PickerColor ExtractorBonfireFireworksWater RippleWater SplashBreaking GlassWood GrainMarble TextureCSS ButtonIcon MakerBar ChartGrouped Bar ChartStacked Bar ChartPie ChartLine ChartArea ChartStacked Area ChartScatter Plot3D Bar Chart3D Pie ChartBar Chart RaceBubble ChartPopulation PyramidPictogramEarningsCandlestick ChartInvestment RiskMortgage SimulatorCalculatorMatrix CalculatorFunction GraphPolynomial ExpansionVenn DiagramField VisualizerRubik's Cube Group TheoryTraveling SalesmanVoronoi and DelaunayFractalColumn ArithmeticDraw Math FiguresArithmetic AnimationArithmetic Word ProblemsCounting with Tree DiagramsCube NetsCross SectionsMotion PathMechanicsWavesLight and LensesThermodynamicsHow Semiconductors WorkMolecular StructuresAtomic OrbitalsElectrochemical CellsChemical EquilibriumCrystal LatticesBuffer pHComplex IonsDNA Double HelixCell DivisionMembrane ChannelsNerve ImpulseRock ClassificationWeatherConstellationsSolar and Lunar Eclipses3D ModelingFloor PlanSeismic StructuresIntersection TurnMaglevCooking AnimationOrigamiLive Viewer CountGeoJSON MapRailway MapPopulation MapCrime MapLand Price MapSchool MapShrine and Castle MapHouse of Representatives MapWord MapSolitaireReversiHakoiri MusumeChessHamburgerRippleSlide Puzzle MakerNeon PinballNovel MakerJapanese Typing PracticePiano Score EditorMusic Theory

English

Python の StopIteration とは

StopIteration は、イテレータが終端に達したことを示す例外です。普段は for 文が自動的に処理してくれるため意識することは少ないですが、イテレータを手動で操作する際には重要な概念です。

StopIteration とは

イテレータの next() を呼び出し続けると、要素がなくなった時点で StopIteration 例外が発生します。

numbers = [1, 2]
it = iter(numbers)

print(next(it))  # 1
print(next(it))  # 2
print(next(it))  # StopIteration 例外!

実行すると以下のようなエラーメッセージが表示されます。

Traceback (most recent call last):
  File "...", line 5, in <module>
    print(next(it))
StopIteration

for 文と StopIteration

for 文は内部で StopIteration をキャッチしてループを終了します。だから普段は意識する必要がありません。

# この for 文は...
for n in [1, 2, 3]:
    print(n)

# 内部的にはこう動いている
it = iter([1, 2, 3])
while True:
    try:
        n = next(it)
        print(n)
    except StopIteration:
        break

手動で StopIteration を扱う

next() のデフォルト値を使わない場合は、try-except で捕捉します。

numbers = [1, 2]
it = iter(numbers)

while True:
    try:
        n = next(it)
        print(n)
    except StopIteration:
        print("イテレータが終了しました")
        break

ジェネレータと StopIteration

ジェネレータ関数が終了すると、自動的に StopIteration が発生します。

def count_up_to(n):
    i = 1
    while i <= n:
        yield i
        i += 1
    # 関数終了時に StopIteration が自動発生

gen = count_up_to(2)
print(next(gen))  # 1
print(next(gen))  # 2
print(next(gen))  # StopIteration

StopIteration に値を持たせる

StopIteration は値を持つことができます。ジェネレータで return を使うと、その値が StopIterationvalue 属性に格納されます。

def gen_with_return():
    yield 1
    yield 2
    return "完了"

g = gen_with_return()
print(next(g))  # 1
print(next(g))  # 2

try:
    next(g)
except StopIteration as e:
    print(e.value)  # 完了

この仕組みは、コルーチンや yield from と組み合わせて使われることがあります。