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']