gpt4 book ai didi

Python:按顺序执行步骤

转载 作者:太空宇宙 更新时间:2023-11-03 21:36:25 26 4
gpt4 key购买 nike

我正在尝试制作一个完全可切片的斐波那契序列,但我陷入了切片的步骤功能。这是我到目前为止的代码:

class Fib:
def __init__(self, start, end):
self.start = start
self.end = end
def _fib(self, index):
items = [0,1]
n = 2
while n <= index:
items.append(items[n-1]+items[n-2])
n += 1
return items
def __len__(self):
return self.end - self.start
def __reversed__(self):
items = self._fib(self.end)
return reversed(items)
def __count__(self, item):
items = self._fib(self.end)
return items.count(item)
def __getitem__(self, index):
if isinstance(index, slice):
return Fib(slice.start, slice.stop-1)
if index > len(self):
raise StopIteration
if index == 0:
return 0
if index == 1:
return 1
if index < 1:
return list(reversed(self._fib(self.end)))[abs(index)]
items = self._fib(index)
return items.pop()

它似乎适用于常规切片、反转和按负数索引。但是,当我尝试使用步骤时,例如 Fib(0, 100)[::2],我收到一个错误,我很难解释。

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "fibonacci.py", line 22, in __getitem__
return Fib(slice.start, slice.stop-1)
TypeError: unsupported operand type(s) for -: 'member_descriptor' and 'int'

编辑:我最终这样做了......

class Fib:
def __init__(self, start, end):
self.start = start
self.end = end
def _fib(self, index):
items = [0,1]
n = 2
while n <= index:
items.append(items[n-1]+items[n-2])
n += 1
return items
def __len__(self):
return self.end - self.start
def __reversed__(self):
items = self._fib(self.end)
return reversed(items)
def __count__(self, item):
items = self._fib(self.end)
return items.count(item)
def __getitem__(self, index):
if isinstance(index, slice):
_start, _stop, _step = (0, self.end, 1)
if index.start is not None:
_start = index.start
if index.stop is not None:
_stop = index.stop
if index.step is not None:
_step = index.step
abs_stop = _stop
abs_start = _start
if _stop < 0:
abs_stop = self.end + _stop
if _start < 0:
abs_start = self.end + _start
_n = max(abs_start, abs_stop) - 1
return self._fib(_n)[_start:_stop:_step]
if index > len(self):
raise StopIteration
if index == 0:
return 0
if index == 1:
return 1
if index < 1:
return list(reversed(self._fib(self.end)))[abs(index)]
items = self._fib(index)
return items.pop()

最佳答案

应该是return Fib(index.start,index.stop-1)。然后,由于切片具有 None(如果未提供),因此您应该通过将 index.start 替换为 0(如果它是 None)来解决此问题index.stop 以及序列的长度。

关于Python:按顺序执行步骤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53219097/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com