Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 返回自我在iter方法中有什么用?_Python_Python 2.7 - Fatal编程技术网

Python 返回自我在iter方法中有什么用?

Python 返回自我在iter方法中有什么用?,python,python-2.7,Python,Python 2.7,只是想知道上面的代码通常做什么,为什么需要它 我浏览了很多代码教程和代码块,得到了很多答案,但没有任何适当的说明,只要简单的解释就好了。编辑:对于2.7而不是3 这是我的理解 在下面的示例代码中,我们可以说类测试是一个iterable对象,因为我们使用\uuuuuIter\uuuuuu实现了它。方法返回一个迭代器。迭代器使用next方法来确定迭代中的下一个值。如果我从下面的类中删除next方法,代码将失败 iterable=可以在…上迭代的对象,使用\uuuuu iter\uuuuu 迭代器=定

只是想知道上面的代码通常做什么,为什么需要它


我浏览了很多代码教程和代码块,得到了很多答案,但没有任何适当的说明,只要简单的解释就好了。

编辑:对于2.7而不是3

这是我的理解

在下面的示例代码中,我们可以说类测试是一个iterable对象,因为我们使用
\uuuuuIter\uuuuuu
实现了它。方法
返回一个迭代器。迭代器使用next方法来确定迭代中的下一个值。如果我从下面的类中删除
next
方法,代码将失败

iterable=可以在…上迭代的对象,使用
\uuuuu iter\uuuuu

迭代器=定义如何迭代的对象…从字面上看,下一个值是什么。这是通过
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

因此,您询问的代码片段实际上接受类对象(self是参数)并返回一个迭代器,这使得类对象可迭代。因此,在下面的示例中,我们实际上可以迭代类对象myObj

def __iter__(self):
    return self 
类测试:
定义初始化(self,a,b):
self.a=a
self.b=b
定义(自我):
回归自我
def next(自我):

如果self.a有点混乱。简言之,定义_uiter__;返回self实际上是将迭代器对象快速转换为iterable,以便您可以在for循环中使用它

回想一下,迭代器是具有下一个方法的对象,用于在执行迭代的过程中返回下一项。调用下一个方法后,迭代器的状态将更改

回想一下,iterable是一个带有_iter___方法的对象,其目的是返回一个新的迭代器来执行迭代

为了区分这些概念,让我们以迭代器OneToFourIterator和iterable OneToFourIterable为例

class Testing:
    def __init__(self,a,b):
        self.a = a
        self.b = b
    def __iter__ (self):
        return self
    def next(self):
        if self.a <= self.b:
            self.a += 1
            return self.a-1
        else:
            raise StopIteration

myObj = Testing(1,5)           
for i in myObj:
    print i
要使用for循环执行迭代,必须给它一个iterable,如下所示

class OneToFourIterator:
  def __init__(self):
    self.state = 0
  def next(self):
    self.state += 1
    if self.state > 4:
      raise StopIteration
    return self.state

class OneToFourIterable:
  def __init__(self):
    pass
  def __iter__(self):
    return OneToFourIterator()
如果在for循环中使用迭代器,它将给出一个错误。要使用迭代器进行迭代,可以执行以下操作

for i in OneToFourIterable():
  print i
最后,我认为人们为什么定义“iter”来返回self的答案是,不必像上面那样编写两个类,您可以快速地将迭代器转换为iterable,以便在for循环中使用它:

iterator = OneToFourIterator()
while True:
  try:
    current = iterator.next()
    print current
  except StopIteration:
    break

这也让我有点困惑:) 好的,让我们看看python中的for循环:

class OneToFourIteratorAndIterable:
  def __init__(self):
    self.state = 0
  def next(self):
    self.state += 1
    if self.state > 4:
      raise StopIteration
    return self.state
    pass
  def __iter__(self):
    return self

for i in OneToFourIteratorAndIterable():
  print i
在这个代码段中,for循环将隐式调用一个.iter(),它应该是一个迭代器。此外,在python中,如果需要迭代器,该类必须实现“iterator”接口,这意味着它应该同时具有u iter_uuuu和u next_uu,并且u iter_u的效果是返回一个迭代器

然而,python中还有另一个称为iterable的概念,它是一个可以创建迭代器的工厂

好的,现在我们想要的是可以iter或者iterable,所以他们的iter方法必须返回一个迭代器

对于iterable,它应该返回一个迭代器(可能是另一个类实现了‘迭代器’接口),对于迭代器,是的,它本身就是一个迭代器,所以只需返回它自己

以下代码段是从Fluent Python复制的:

for i in a:
    print i
你可以做:

import reprlib

RE_WORD = re.compile('\w+')


class Sentence:
    def __init__(self, text):
        self.text = text
        self.words = RE_WORD.findall(text)

    def __repr__(self):
        return 'Sentence(%s)' % reprlib.repr(self.text)

    def __iter__(self):
        return SentenceIterator(self.words)


class SentenceIterator:
    def __init__(self, words):
        self.words = words
        self.index = 0

    def __next__(self):
        try:
            word = self.words[self.index]
        except IndexError:
            raise StopIteration()
        self.index += 1
        return word

    def __iter__(self):
        return self
s = Sentence('"The time has come," the Walrus said,')
以及:

如果在迭代器中删除_iter__,则只能使用:

   for i in s:
       print(s)

因为当您从iterable代码部分删除iterator类中可能重复的@vaultah ya its时,iter(s)不再是迭代器,所以我在许多其他方法中看到了这一部分,所以我只想知道为什么我们通常使用这部分代码您的意思是什么?你读了链接页面上的答案了吗?“The
\uuuu iter\uuuuu
返回迭代器对象,并在循环开始时隐式调用”是您问题的答案。是的,我读过它,和其他人一样,它没有清除logicFluent Python,第14章→ 嗯,你确定这句话:如果你在迭代器中删除iter,for循环仍然有效吗?我的当然不。。。否则,上面的答案很好。@user7865286是的,您可以在迭代器中删除iter,在上面的代码段中,SentenceIterator是迭代器,您可以删除它并运行“for i in s:print s”。
   for i in s:
       print(s)
 for i in s:
     print(s)