高校生物551766 views
英語613639 views
小学社会310485 views
中学数学623755 views
いろは3010814 views
雑学1473612 views
高校化学2924392 views
中学社会668760 views
世界の国564520 views
高校国語788336 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 の for 文の裏側で何が起きているか

Python の for 文はシンプルに見えますが、内部ではイテレータプロトコルが動いています。その仕組みを理解すると、Python のループ処理がより深く理解できます。

for 文の基本

普段何気なく書いている for 文を見てみましょう。

numbers = [1, 2, 3]
for n in numbers:
    print(n)

この3行のコードの裏側では、実は複数のステップが実行されています。

裏側の動作

for 文は内部で以下の処理を行っています。

iter() でイテレータを取得

next() で要素を1つ取り出す

StopIteration が発生するまで繰り返す

ループ終了

これを明示的に書くと、次のようになります。

numbers = [1, 2, 3]
iterator = iter(numbers)

while True:
    try:
        n = next(iterator)
        print(n)
    except StopIteration:
        break

iter() と next() の役割

iter() はオブジェクトの __iter__() メソッドを呼び出し、イテレータを返します。next() はイテレータの __next__() メソッドを呼び出し、次の要素を返します。

text = "ABC"
it = iter(text)

print(next(it))  # A
print(next(it))  # B
print(next(it))  # C
print(next(it))  # StopIteration 例外が発生

なぜこの仕組みがあるのか

この仕組みのおかげで、どんなオブジェクトでも __iter__()__next__() を実装すれば for 文で使えるようになります。リスト、文字列、ファイル、ジェネレータなど、あらゆるものが同じ方法で繰り返し処理できるのはこのためです。

# ファイルもイテラブル
with open("data.txt") as f:
    for line in f:  # 1行ずつイテレート
        print(line)

for 文の裏側を知ることで、カスタムイテレータやジェネレータを作る際の理解が深まります。