2015-11-09 3 views
0

У меня есть целый Deque класс Array, который выглядит следующим образом:Python Распечатка Deque

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) 

и когда я пытаюсь напечатать Deque в основном он печатает что-то вроде этого,

<bound method dequeArray.__str__ of <__main__.dequeArray object at 0x1053aec88>> 

, когда он должен печатать весь массив. Я думаю, мне нужно использовать функцию ул и я попытался добавить

def __str__(self): 
    return str(self._data) 

и что не дал мне выход. Я также пробовал только

def __str__(self): 
    return str(d) 

d, являющийся массивом deque, но я до сих пор не добился успеха. Как мне это сделать, чтобы заставить его правильно печатать?

+0

Вы, вероятно, пытающегося 'печать вещь .__ str__' вместо' вещь .__ str __() '(или просто' str (вещь) '). – jonrsharpe

+0

, пожалуйста, прочитайте [this] (http://stackoverflow.com/help/mcve) и укажите определение 'class' – Pynchia

+0

@Pynchia. Я добавил остальную часть класса, я не думал, что это будет полезно, поскольку я просто пытаясь выяснить, как правильно распечатать deque –

ответ

3

вы должны вызвать функцию ул каждого элемента массива, который не NULL, можно сделать с помощью следующей функции: ул

def __str__(self): 
    contents = ", ".join(map(str, self._data[:self._size])) 
    return "dequeArray[{}]".format(contents) 
+0

'self._data [: self._size]' будет вызывать исключение, если вы попытаетесь использовать его в неинициализированном массиве 'ctypes'. – Vovanrock2002

+0

Я не уверен, что вы пытаетесь сказать, приведенный выше код не вызывает исключения, даже если в массив не добавлены никакие элементы. – acgull

+0

Принимая во внимание то, как OP создает свою «self._data» и притворяется, что мы вызываем '__str__' сразу после создания объекта,' self._data [: self._size] 'можно свести к' (5 * ctypes.py_object)() [: 5] ', который выдает« ValueError »хотя бы на Python 3.5 – Vovanrock2002

0

Что я получаю, когда пытаюсь 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 объект, безусловно, не равна нулю.

+0

Спасибо, что я буду принимать во внимание. –

Смежные вопросы