Python 具有指定步长的迭代器类

Python 具有指定步长的迭代器类,python,python-3.x,Python,Python 3.x,我正在尝试编写迭代器类,该类允许我指定迭代器执行的步骤长度。但我被这个问题困住了 我的代码: class Reverse: def __init__(self, data, step): self.data = data self.index = len(data) self.step = step def __iter__(self): return self def __next__(self, step

我正在尝试编写迭代器类,该类允许我指定迭代器执行的步骤长度。但我被这个问题困住了

我的代码:

class Reverse:
    def __init__(self, data, step):
        self.data = data
        self.index = len(data)
        self.step = step
    def __iter__(self):
        return self
    def __next__(self, step):
        if self.index <= 0:
            raise StopIteration
        self.index = self.index - self.step
        return self.data[self.index]

rev = Reverse('Drapsicle', 2)
但是循环给我:=TypeError:next()缺少1个必需的位置参数:“步骤”`:

for char in rev:
    print(char)

您的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。您甚至没有使用
step
参数,而是(正确地)使用了
self.step
。只要去掉这个论点:

def __next__(self):
    if self.index <= 0:
        raise StopIteration
    self.index = self.index - self.step
    return self.data[self.index]
演示:

>>类反转:
...     定义初始化(自身、数据、步骤):
...         self.data=数据
...         self.index=len(数据)
...         self.step=step
...     定义(自我):
...         回归自我
...     定义下一个(自我):
...         下一个索引=self.index-self.step
...         如果下一个指数<0:
...             提出停止迭代
...         self.index=下一个索引
...         返回self.data[self.index]
... 
>>>rev=反向(“排水孔”,2)
>>>对于版本中的字符:
...     打印(字符)
... 
L
我
P
R

我意识到这不是对这个问题的直接回答,但如果你只是想完成工作,并且认为你需要自己去实现它;你没有

from itertools import islice

def reverse_step(iterable, step):
    # To behave like your code; starts with step-th item
    start = step - 1

    for item in islice(reversed(iterable), start, None, step)):
        yield item
要落实这一点:

>>> 'Drapsicle'[::-2]
'ecsaD'
作为您自己的迭代器:

class Reverse:
    def __init__(self, data, step):
        self.data = data
        self.index = len(data) - 1
        self.step = step
    def __iter__(self):
        return self
    def __next__(self):
        if self.index < 0:
            raise StopIteration
        value = self.data[self.index] 
        self.index -= self.step
        return value
注:

  • self.index
    len-1开始
  • \uuuu next\uuuu()
    不接受除
    self
  • 首先得到
    ,然后递减索引
更灵活的设计会将倒车分离(例如,将其委托给
reversed()
builtin)并使用
step!=1
(接受任意可逆的iterable和/或使用/实施扩展切片)例如,基于:


您似乎需要
下一步中的
步骤
参数,但不使用它,只使用
self.step
。是否要模拟:
“Drapsicle”[::-2]
?不,不太需要,无论如何,所需的输出是什么?你想要:
'.join(反向('Drapsicle',2))=='ecsaD'
还是其他什么?预期的输入是什么?它总是一根线吗?它可能是一个只包含
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
方法()的类型吗?它在用完之前返回
'e'
self.index=self.index-self.step
应该在
的上方,如果
@Cyphase:well-spoted;adjusted answer to compensate.OP可能需要一个@J.F.Sebastian:用于列表,但Cyphase的答案至少适用于支持
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。显然,如果您有一个列表,那么您可以直接使用扩展切片,而不需要自定义类。这个例子的要点是建议可能的结果(结果中应该包含哪些项目)。我认为OP想要:
islice(reversed('Drapsicle'),None,None,2)
@J.F.Sebastian,我不这么认为。问题表明,
'l'
是OP收到的第一个值,没有提到这是错误的,OP对Martijn返回的
l,i,p,r
的回答做出了肯定的回答。
from itertools import islice

def reverse_step(iterable, step):
    # To behave like your code; starts with step-th item
    start = step - 1

    for item in islice(reversed(iterable), start, None, step)):
        yield item
>>> 'Drapsicle'[::-2]
'ecsaD'
class Reverse:
    def __init__(self, data, step):
        self.data = data
        self.index = len(data) - 1
        self.step = step
    def __iter__(self):
        return self
    def __next__(self):
        if self.index < 0:
            raise StopIteration
        value = self.data[self.index] 
        self.index -= self.step
        return value
>>> list(Reverse('Drapsicle', 2))
['e', 'c', 's', 'a', 'D']
>>> list(islice(reversed('Drapsicle'), None, None, 2))
['e', 'c', 's', 'a', 'D']