Python zip()関数の一次踏み込み

2478 ワード

Python zip()関数の踏み込みテスト1:
a = [1, 1, 1, 1]
b = [2, 2, 2, 2]
c = zip(a, b)

for i in c:
    print('for  {}'.format(i))

d = [x for x in c]
print(d)
  1:
   for  (1, 2)
   for  (1, 2)
   for  (1, 2)
   for  (1, 2)
  2:
   []


まず、zipをループして返されるオブジェクトには最初に値があり、2回目に値がないのはなぜですか?zipドキュメントの表示
class zip(object):
    """
    zip(iter1 [,iter2 [...]]) --> zip object
    
    **Return a zip object whose .__next__() method returns a tuple where
    the i-th element comes from the i-th iterable argument.  The .__next__()
    method continues until the shortest iterable in the argument sequence
    is exhausted and then it raises StopIteration.**
    """
    def __getattribute__(self, *args, **kwargs): # real signature unknown
        """ Return getattr(self, name). """
        pass

    def __init__(self, iter1, iter2=None, *some): # real signature unknown; restored from __doc__
        pass

    def __iter__(self, *args, **kwargs): # real signature unknown
        """ Implement iter(self). """
        pass

    @staticmethod # known case of __new__
    def __new__(*args, **kwargs): # real signature unknown
        """ Create and return a new object.  See help(type) for accurate signature. """
        pass

    def __next__(self, *args, **kwargs): # real signature unknown
        """ Implement next(self). """
        pass

    def __reduce__(self, *args, **kwargs): # real signature unknown
        """ Return state information for pickling. """
        pass


zip()はzipオブジェクトを返します.オブジェクトのnext()メソッドはメタグループを返します.i番目の要素はi番目の反復可能なパラメータから来ます.パラメータシーケンスの最短反復が消費されるまで、異常停止反復を放出します.そうしないと、next()メソッドはメタグループに戻り続けます.
ポイントは、このzipオブジェクトが反復器であることです.反復器は前進するしかなく、後退することはできません.たとえばテスト1のコードは、forループが終了すると、反復器の内部ポインタが内部の最後のメタグループを指し、次にリスト生成式を実行すると、反復器は前進するしか後退できないので、ポインタはリセットされていませんが、反復器にはメタグループが戻ってこないので、空のlistが印刷されます.
なぜzipが戻るzipオブジェクトが反復器なのかについては、廖雪峰先生の接続を確認することができます:ジャンプ反復器をクリックします-廖雪峰
  • forループに直接作用するオブジェクトを総称して反復可能オブジェクトと呼ぶ:Iterable、すべてIterableタイプ/反復可能タイプ;
  • はnext()関数によって呼び出され、次の値を繰り返し返すオブジェクトを反復器と呼ぶことができる:Iteratorは、いずれもIteratorタイプであり、これらは不活性計算のシーケンスを表す.
  • 反復器(Iterator)は反復可能なオブジェクト(Iterable)ですが、反復可能なオブジェクトは反復器とは限りません.たとえば、list、dict、strなどの集合データ型はIterableですがIteratorではありませんが、iter()関数でIteratorオブジェクトを取得できます.