zoukankan      html  css  js  c++  java
  • 【python】迭代器与可迭代对象

    【可迭代对象】

    可以直接作用在for循环的对象,拥有__iter__方法,该方法返回一个迭代器(甚至可以只返回一个含__next__方法的对象)

    使用 isinstance(obj, Iterable)判断是否为可迭代对象

    【迭代器】

    在可迭代对象基础上额外拥有__next__方法。

    (事实上,一个迭代器并不需要有__iter__方法,只是出于多态的需要,__iter__方法原则上应该返回自身,详细参见 https://www.zhihu.com/question/44015086)

    使用 isinstance(obj, Iterator)判断是否为迭代器

    迭代器是lazy的,是一个数据流,只有在请求下一个数据的时候才会计算,甚至可以是个无限大的数据流。如果数据没有了,就返回StopIteration

    可以使用 iter(obj)将一个可迭代对象转化为一个迭代器

    【原理】

    for循环,for i in obj。里面的obj是iterable。

    调用iter(obj)得到一个迭代器(甚至不非要是迭代器,只要实现了__next__方法)然后不断调用next方法。

    iter函数首先检查obj是否有__iter__方法,如有,则返回obj.__iter__(),如没有,检查是否有__getitem__方法,如果有该方法返回一个下标迭代器。

    for i in iterable or for i in iterator??

    如果想重头遍历,就要用for i in iterable(注意这个iterable的__iter__方法不能返回自己哦),返回一个新东西。如果想接着遍历,就要用for i in iterator。

  • 相关阅读:
    Lintcode: Wood Cut
    Lintcode: Update Bits
    Lintcode: Route Between Two Nodes in Graph
    Lintcode: Flip Bits
    Leetcode: Maximum Size Subarray Sum Equals k
    Lintcode: Subarray Sum Closest
    Lintcode: Remove Node in Binary Search Tree
    Lintcode: Majority Number III
    Leetcode: Range Sum Query
    Leetcode: Create Maximum Number
  • 原文地址:https://www.cnblogs.com/yesuuu/p/15798288.html
Copyright © 2011-2022 走看看