Python 打印双端队列
Python Printing a Deque
我有一个完整的 Deque 数组 class,如下所示:
from collections import deque
import ctypes
class dequeArray:
DEFAULT_CAPACITY = 10 #moderate capacity for all new queues
def __init__(self):
self.capacity = 5
capacity = self.capacity
self._data = self._make_array(self.capacity)
self._size = 0
self._front = 0
def __len__(self):
return self._size
def __getitem__(self, k): #Return element at index k
if not 0 <= k < self._size:
raise IndexError('invalid index')
return self._data[k]
def isEmpty(self):
if self._data == 0:
return False
else:
return True
def append(self, item): #add an element to the back of the queue
if self._size == self.capacity:
self._data.pop(0)
else:
avail = (self._front + self._size) % len(self._data)
self._data[avail] = item
self._size += 1
#def _resize(self, c):
#B = self._make_array(c)
#for k in range(self._size):
#B[k] = self._A[k]
#self._data = B
#self.capacity = capacity
def _make_array(self, c):
capacity = self.capacity
return (capacity * ctypes.py_object)()
def removeFirst(self):
if self._size == self.capacity:
self._data.pop(0)
else:
answer = self._data[self._front]
self._data[self._front] = None
self._front = (self._front + 1) % len(self._data)
self._size -= 1
print(answer)
def removeLast(self):
return self._data.popleft()
def __str__(self):
return str(self._data)
当我尝试在 main 中打印双端队列时,它会打印出类似这样的内容,
<bound method dequeArray.__str__ of <__main__.dequeArray object at 0x1053aec88>>
何时应该打印整个数组。我想我需要使用 str 函数,我尝试添加
def __str__(self):
return str(self._data)
那没能给我输出。我也试过
def __str__(self):
return str(d)
d 是双端队列数组,但我仍然没有取得任何成功。我怎样才能让它正确打印?
当我尝试 q = dequeArray(); print(q)
时得到的是 <__main__.py_object_Array_5 object at 0x006188A0>
,这是有道理的。如果你想要它 list-like
,使用类似这样的东西(print
隐含地使用 __str__
方法):
def __str__(self):
values = []
for i in range(5):
try:
values.append(self._data[i])
except ValueError: # since accessing ctypes array by index
# prior to assignment to this index raises
# the exception
values.append('NULL (never used)')
return repr(values)
此外,关于代码的几件事:
from collections import deque
这个导入从来都不是用户,应该被删除。
DEFAULT_CAPACITY = 10
从未使用过。考虑在 __init__
:
中使用它
def __init__(self, capacity=None):
self.capacity = capacity or self.DEFAULT_CAPACITY
__init__
中的这个变量从来都不是用户,应该被删除:
capacity = self.capacity
def _make_array(self, c):
capacity = self.capacity
return (capacity * ctypes.py_object)()
虽然这是一个有效的代码,但您做错了,除非您在作业中绝对需要这样做。 Ctypes 不应该这样使用,Python 是一种具有自动内存管理的语言。只需 return []
就可以了。是的,变量 c
从未使用过,应该从签名中删除。
if self._data == 0
在 isEmpty
中总是计算为 False
因为您将 ctypes
对象与零进行比较,而 ctypes
对象绝对不是零。
你应该调用数组中每个非NULL元素的str函数,可以用下面的str函数来完成:
def __str__(self):
contents = ", ".join(map(str, self._data[:self._size]))
return "dequeArray[{}]".format(contents)
我有一个完整的 Deque 数组 class,如下所示:
from collections import deque
import ctypes
class dequeArray:
DEFAULT_CAPACITY = 10 #moderate capacity for all new queues
def __init__(self):
self.capacity = 5
capacity = self.capacity
self._data = self._make_array(self.capacity)
self._size = 0
self._front = 0
def __len__(self):
return self._size
def __getitem__(self, k): #Return element at index k
if not 0 <= k < self._size:
raise IndexError('invalid index')
return self._data[k]
def isEmpty(self):
if self._data == 0:
return False
else:
return True
def append(self, item): #add an element to the back of the queue
if self._size == self.capacity:
self._data.pop(0)
else:
avail = (self._front + self._size) % len(self._data)
self._data[avail] = item
self._size += 1
#def _resize(self, c):
#B = self._make_array(c)
#for k in range(self._size):
#B[k] = self._A[k]
#self._data = B
#self.capacity = capacity
def _make_array(self, c):
capacity = self.capacity
return (capacity * ctypes.py_object)()
def removeFirst(self):
if self._size == self.capacity:
self._data.pop(0)
else:
answer = self._data[self._front]
self._data[self._front] = None
self._front = (self._front + 1) % len(self._data)
self._size -= 1
print(answer)
def removeLast(self):
return self._data.popleft()
def __str__(self):
return str(self._data)
当我尝试在 main 中打印双端队列时,它会打印出类似这样的内容,
<bound method dequeArray.__str__ of <__main__.dequeArray object at 0x1053aec88>>
何时应该打印整个数组。我想我需要使用 str 函数,我尝试添加
def __str__(self):
return str(self._data)
那没能给我输出。我也试过
def __str__(self):
return str(d)
d 是双端队列数组,但我仍然没有取得任何成功。我怎样才能让它正确打印?
当我尝试 q = dequeArray(); print(q)
时得到的是 <__main__.py_object_Array_5 object at 0x006188A0>
,这是有道理的。如果你想要它 list-like
,使用类似这样的东西(print
隐含地使用 __str__
方法):
def __str__(self):
values = []
for i in range(5):
try:
values.append(self._data[i])
except ValueError: # since accessing ctypes array by index
# prior to assignment to this index raises
# the exception
values.append('NULL (never used)')
return repr(values)
此外,关于代码的几件事:
from collections import deque
这个导入从来都不是用户,应该被删除。
DEFAULT_CAPACITY = 10
从未使用过。考虑在 __init__
:
def __init__(self, capacity=None):
self.capacity = capacity or self.DEFAULT_CAPACITY
__init__
中的这个变量从来都不是用户,应该被删除:
capacity = self.capacity
def _make_array(self, c):
capacity = self.capacity
return (capacity * ctypes.py_object)()
虽然这是一个有效的代码,但您做错了,除非您在作业中绝对需要这样做。 Ctypes 不应该这样使用,Python 是一种具有自动内存管理的语言。只需 return []
就可以了。是的,变量 c
从未使用过,应该从签名中删除。
if self._data == 0
在 isEmpty
中总是计算为 False
因为您将 ctypes
对象与零进行比较,而 ctypes
对象绝对不是零。
你应该调用数组中每个非NULL元素的str函数,可以用下面的str函数来完成:
def __str__(self):
contents = ", ".join(map(str, self._data[:self._size]))
return "dequeArray[{}]".format(contents)