多迭代和單迭代
range()和zip()、map()、filter()稍有不同。range()支持多迭代、而后三者只支持單迭代。
何為單迭代、何為多迭代?多迭代的意思是同一個對象上可以有多個互不影響的獨立迭代器,各迭代器自己記住自己的迭代位置(狀態信息)。單迭代的意思是同一個對象上只能有一個迭代器,即使創建了多個迭代器,它們也是串聯起來互相影響的。
下面是range()的多迭代特性:
下面的zip、map、filter單迭代的特性:
之所以range()支持多迭代,而zip/map/filter都只支持單迭代,是因為:
- zip/map/filter返回的是自身的迭代器,它們的返回結果自身同時都實現了__iter__()和__next__()兩個方法,所以無論從它們的返回結果上產生多少個可迭代對象,操作的都是它們的對象自身,從而只支持單迭代
- range返回的不是自身迭代器,它的返回結果只實現了__iter__而沒有實現__next__,所以需要通過iter()來生成可迭代對象(迭代器)。無論使用iter()從該返回結果產生多少個可迭代對象,都是互相獨立的可迭代對象,從而支持多迭代
所以一般來說,不是自身迭代器的對象支持多個迭代器,而自身是自身迭代器的對象只支持單個迭代器。
常見的多迭代有range()和那些支持迭代的內置類型,比如字符串、列表、元組等。例如字符串的多迭代:
>>> S = "abc" >>> for x in S: ... for y in S: ... print(x + y, end=" ") aa ab ac ba bb bc ca cb cc
覺得文章還不錯的話不妨收藏起來慢慢看,有任何建議或看法歡迎大家在評論區分享討論!