プログラミング

【Python】for文とwhileはイテレータで要素を取り出し!

  • このエントリーをはてなブックマークに追加
  • LINEで送る

Pythonのループはfor文やwhile文を使ってループしますが…

『何を対象にループするの?』

『どうやってデータを取り出すの?』

『イテラブルオブジェクトって何?』

『イテレータって何?』

『whileでもforと同じようにデータを取り出せるの?』

このような疑問に答えます。


SEおっさん
SEおっさん
SE歴20年のオッサンが詳しく解説するぞい!
※保有資格:OracleMasterGold/JavaWebコンポーネントディベロッパ/応用情報技術者/簿記2級

【Pythonのfor文】配列をイテレータとinで取り出し!

Pythonのfor文をザックリ説明すると…

イテラブルオブジェクトである配列の要素をinで取り出しながらループさせる命令です。

for文で配列の要素を全て取り出すことができます。

基本の書式はこちら

for文の基本

for 変数名 in 配列(※イテラブルオブジェクト)
  処理

(※)イテレータを持つオブジェクト

この構文が全ての基本です。

配列やイテラブル・イテレータについては、次の章で説明します。

例文をみてみましょう。

【例】配列(リスト)の要素を取り出すfor文

ary = [3, 5, 8]
for x in ary:
    print(x)
3
5
8

リストのイテラブルオブジェクトの要素が順番に変数xに代入されてますね。

リスト要素[3,5,8]が順番に取りだされて、それぞれprint表示されてます。

 

たろちゃん
たろちゃん
配列はリストの事?
いてらぶるオブジェクトも急にでてきたぞ…
次の章で詳しく解説するぞぃ
SEおっさん
SEおっさん
フローチャートで簡単にループを抜ける方法!2つの図形と3つの判定
フローチャートで簡単にループを抜ける方法!2つの図形と3つの判定
フローチャートは、なんとな~くわかってきたけど… ループの抜け方がわからんゾ 『そもそもループの図形ってあるの?』 『終了条件は、どうやって書くの?』 フローチ.....

【Python】配列とイテレータとイテラブルの違い

ゴッチャになりやすい配列とイテレータとイテラブルの違いについてまとめました。

配列とは

実は配列の定義は曖昧で、配列オブジェクトというものはありません。

一般的に配列というと、リストやタプルのオブジェクトとなります。

配列を複数の値を入れるオブジェクトの総称とすると、

配列には様々なオブジェクトがあります。

配列の例

list, tuple, str, range, bytearray, bytes
dict, set, frozenset, flie object

イテラブル(Iterable)とは

イテラブルとは複数の要素を繰り返して取り出すことが可能なことです。

イテラブルなオブジェクトをイテラブルオブジェクトと呼びます。

イテラブル(Iterable)を和訳すると「反復可能」という意味です。

イテラブルオブジェクトも色々あります。

イテラブルオブジェクトの例

list, tuple, str, range, bytearray, bytes
dict, set, frozenset, flie object

たろちゃん
たろちゃん
配列はイテラブルオブジェクトなの?

まぁ、Yesじゃな
SEおっさん
SEおっさん

先ほども言ったように、配列の定義は曖昧です。

一般的に配列と言われるオブジェクト(リストやタプルなど)はイテレータを持っています。

イテレータを持つオブジェクトがイテラブルオブジェクトです。

イテレータ(iterator)とは

イテレータ(iterator)とは要素を反復して取り出すことのできるインタフェースです。

インタフェースとはイテレータが持つメソッド__iter__()と__next__()が相当します。

 

イテレータは「反復子」とも呼ばれ、for文の繰り返し処理もイテレータを介してを実現します。

たろちゃん
たろちゃん
うーん
チンプンカンプン

イテレータの機能とメソッドを説明しますね。

    イテレータの機能
    • 求められるたびに要素をひとつずつ返す
    • データがなくなるとデータの代わりに StopIteration 例外を返す
      (例外がデータの終了する条件となる)
    イテレータのメソッド
    • 自身を戻り値とする__iter__()メソッド
      for文などでイテレータ化が要求された時に呼ばれる
    • 次の要素を返す__next__()メソッド
      呼ばれる度に新しい値を返す
      返す値がない時はStopIteration例外をraiseする

     



    スポンサーリンク

    【python】イテレータのメソッドを実装したクラスを作る

    イテレータのメソッドをを実装したクラスを作ってみましょう。

    class MyIter(object):
        def __init__(self, *numbers):
            self._numbers = numbers
            self._i = 0
        def __iter__(self):
            return self
        def __next__(self):
            if self._i == len(self._numbers):
                raise StopIteration()
            value = self._numbers[self._i]
            self._i += 1
            return value

    for文で実行してみましょう。

    my_iter = MyIter(1000, 2000, 3000)
    for num in my_iter:
        print('%d' % num)
    
    1000
    2000
    3000

    自作のクラスでイテレータを実装しても、for文の書式にしたがってループされていますね。

    内部ではメソッド__iter__()で初期化してから、__next__()で要素を順番に取り出しています。

    また、

    配列といわれるオブジェクトでは、ほとんどイテレータが実装されています。

    配列はイテラブルオブジェクトと言って過言ではないでしょう。

    たろちゃん
    たろちゃん
    なぜ配列はイテラブルオブジェクトなの?

    ズバリ!
    その方が都合がいいからじゃ
    SEおっさん
    SEおっさん

    配列は要素を取り出せた方が便利ですよね。

    だからイテレータが実装されているのです。

    配列と呼ばれるオブジェクトには次の種類がありますが、全てイテレータが実装されています。

    • シーケンス(list, tuple, str, range, bytearray, bytes)
    • 辞書(dict)
    • 集合(set, frozenset)
    • ファイル(flie object)

    listやtupleはイテレータメソッドを持つイテラブルオブジェクトの代表です。

    ファイルも1つずつデータを取り出せるのでイテラブルです。

    連番を作成できるrangeもイテラブルです。

    Pythonのfor文ではインデックスの加算する構文はありません。

    range関数を使用してインデックスの加算を行って連番を作成します。

    初めに述べたこの構文が全ての基本になります。頑張ってマスターしましょう♪

    イテレータ(iterator)とは

    要素を反復して取り出すことのできるインタフェース

     

    【Python】for文のインクリメントはrangeで変数にinする
    【Python】for文のインクリメントはrangeで変数にinする
    Pythonのfor文を使ってループしますが、 カウンタをインクリメントする方法が他言語と大きく異なります。 『for文でインデックスのインクリメント方法は?』.....

    【python】while文もイテレータで要素を取り出し

    listからイテレータのiter・nextメソッドを使用して要素を取り出すことができます。

    while文を用いてリスト内の全要素を取り出してみましょう。

    while文の書式はこちら

    while文の書式

    while 条件式:
        処理

    • 条件式を満たす(True)の間は処理を実行し続ける
    • breakで処理を終了する

    whileでイテレータを使用した例文。

    l = [1000, 2000, 3000]
    it = iter(l)
    while True:
        try:
            print(next(it))
        except StopIteration:
            break
    
    1000
    2000
    3000

    リスト内の全要素が取り出されていますね。

    for文を使用した例文と全く同じ結果です。

    たろちゃん
    たろちゃん
    やっとわかってきたよ!

    【Python】まとめ!for・while文とイテレータ

    いかがでしたでしょうか。

    Pythonのfor文でイテレータで要素の取り出す方法

    • 配列・イテレータ・イテラブルの違い
    • while文でfor文と同様の結果を持つj日j日
    • for文はinとイテレータで取り出し!whileも♪

    について紹介いたしました。

    振り返ってみましょう!

    基本の書式はこちら

    for文の基本

    for 変数名 in 配列(※イテラブルオブジェクト)
      処理

    (※)イテレータを持つオブジェクト

    この構文が全ての基本です。

    イテレータ(iterator)とは

    要素を反復して取り出すことのできるインタフェース

    イテレータのメソッド
    • 自身を戻り値とする__iter__()メソッド
      for文などでイテレータ化が要求された時に呼ばれる
    • 次の要素を返す__next__()メソッド
      呼ばれる度に新しい値を返す
      返す値がない時はStopIteration例外をraiseする


    【ご参考】

    for文でインクリメントするケーススタディはコチラ

    【Python】for文のインクリメントはrangeで変数にinする
    【Python】for文のインクリメントはrangeで変数にinする
    Pythonのfor文を使ってループしますが、 カウンタをインクリメントする方法が他言語と大きく異なります。 『for文でインデックスのインクリメント方法は?』.....


    for文でイテレータのindexを取得するケーススタディはコチラ

    Pythonのfor文!enumerateで配列のindex取得♪
    Pythonのfor文!enumerateで配列のindex取得♪
    Pythonのfor文は配列の要素を取得しながらループできますが、 配列の位置インデックスは簡単に取得できるのでしょうか。 『配列の各要素とインデックス位置を簡.....


    何事も基本が重要。ループの基本を学びたい方はコチラ

    フローチャートで簡単にループを抜ける方法!2つの図形と3つの判定
    フローチャートで簡単にループを抜ける方法!2つの図形と3つの判定
    フローチャートは、なんとな~くわかってきたけど… ループの抜け方がわからんゾ 『そもそもループの図形ってあるの?』 『終了条件は、どうやって書くの?』 フローチ.....

     

    SEおっさん
    SEおっさん
    ここまで読んでくれてありがとう!

    プロフィールの詳細はこちら


    スポンサーリンク
    • このエントリーをはてなブックマークに追加
    • LINEで送る

    コメントを残す

    *