#python #queue
#python #очередь
Вопрос:
Я хочу создать программу, в которой список добавляет и удаляет и элемент с использованием очереди, однако в моем коде были проблемы, которые необходимо исправить. Пожалуйста, помогите мне, спасибо.
class Queue:
def __init__(self):
self.items = ["Jene Dayao", "MJ Formaran", "Hans Matias", "Candy Santos", "Ian Domingo"]
def view(self):
print (self.items)
def enqueue(self, item):
item = input ("Name of the student: ")
self.items.insert(item)
def dequeue(self):
return self.items.pop()
print ("Student has finished photo taking!")
while True:
print ("School ID Picture Taking Queue")
print ("Select a function...")
print ("")
print ("1. See the student's active list")
print ("2. A student has finished picture taking")
print ("3. Add another student to the list")
option = int(input("Enter your choice: "))
if option == 1:
view ()
elif option == 2:
enqueue ()
elif option == 3:
dequeue ()
Комментарии:
1. У вас есть класс, но вы не создаете экземпляр указанного класса. Вы вызываете методы экземпляра, как если бы они были простыми функциями. Ваш метод постановки в очередь принимает элемент аргумента, но вы немедленно отбрасываете его, присваивая переменной возвращаемое значение входного вызова. Вы пытаетесь вызвать enqueue без аргументов, но метод определен так, чтобы ожидать его. Вы следуете руководству?
2. «однако в моем коде были проблемы, которые необходимо исправить». Как вы пытались использовать код? Что произошло, когда вы это сделали? Чем это отличается от того, что должно произойти?
Ответ №1:
Конечная реализация очереди в python
Есть несколько проблем с вашим кодом:
-
вы используете концепцию класса и не инициализируете объект класса. есть 2 способа заставить код работать:
- инициализировать объект класса
- используйте только функции и полностью отбросьте использование классов.
-
функция постановки в очередь принимает параметр, но вы его не передаете. вместо этого вы принимаете значение от пользователя в самой функции. вы не можете использовать оба способа. предпочтительным решением будет принимать входные данные вне функции.
-
параметры расположены в неправильном порядке
-
функция постановки в очередь использует функцию insert, которая принимает 2 аргумента. вместо этого можно использовать функцию добавления.
Я буду решать все проблемы
Следующий подход использует классы.
class Queue:
def __init__(self):
self.items = ["Jene Dayao", "MJ Formaran",
"Hans Matias", "Candy Santos", "Ian Domingo"]
def view(self):
print(self.items)
def enqueue(self, item):
self.items.append(item)
print("")
def dequeue(self):
print("Student has finished photo taking!")
return self.items.pop(0)
queue = Queue() # initializing an object of the class Queue
while True:
print("School ID Picture Taking Queue")
print("Select a function...")
print("")
print("1. See the student's active list")
print("2. Add another student to the list")
print("3. A student has finished picture taking")
option = int(input("Enter your choice: "))
if option == 1:
queue.view()
elif option == 2:
item = input("Name of the student: ") # taking the new students name
queue.enqueue(item)
elif option == 3:
queue.dequeue()
Ответ №2:
В следующий раз — попробуйте опубликовать ошибки, с которыми вы сталкиваетесь, вместо того, чтобы писать «в моем коде были проблемы, которые необходимо исправить», чтобы люди знали, как вам помочь.
Этот код имеет несколько проблем:
- Вы пытаетесь получить доступ к функциям, принадлежащим классу
Queue
, даже не инициализируя его. Это должно быть:
# Must be initialized outside the loop, otherwise you will re-create
# it every time, discarding your changes
queue = Queue()
while True:
...
option = int(input("Enter your choice: "))
if option == 1:
queue.view()
elif option == 2:
queue.enqueue()
elif option == 3:
queue.dequeue()
- В функции
enqueue
вы просите пользователя ввести имя учащегося, которого он хочет добавить. Это нормально, но проблема в том, что вы также ожидаете от функции получения элемента извне. Удалитеitem
из подписи функции, сохранив ее следующим образом:
def enqueue(self):
- Функция
input
используется для получения номера от пользователя. Чтобы получить astring
, который является типом, который должно иметь имя учащегося, используйтеraw_input
:
item = raw_input("Name of the student: ")
- Строка
self.items.insert(item)
не будет работать, так как функцияinsert
должна получить элемент, который вы хотите добавить, и его индекс в списке. Если вас не волнует индекс, просто используйте:
self.items.append(item)
- Вы ошибочно переключились между вариантами 2 и 3. Когда пользователь выбирает 3-й вариант, вы хотите позвонить
q.enqueue
, добавив ученика в список. Когда пользователь выбирает 2-й вариант, который вы хотите вызватьq.dequeue
, удалите ученика из списка:
q = Queue()
if option == 1:
q.view()
elif option == 2:
q.dequeue()
elif option == 3:
q.enqueue()
И последнее — рекомендуется ознакомиться с документацией функций, которые вы используете, перед их использованием. Иногда может показаться, что вы знаете, как вы предполагаете называть их, видя их имя, но, как вы видите, это не всегда так.
С наилучшими пожеланиями.
Комментарии:
1. Большое вам спасибо, я действительно ценю помощь. И извините за причинение вам неудобств, я здесь просто новичок.
2. Конечно. Обратите внимание на мое последнее редактирование ответа — вы должны инициализировать очередь вне цикла, чтобы не переопределять ее. Удачи!
3. Исправлено, большое вам спасибо. Я буду учиться на этом. Извините, что потратил ваше время.
4. Не забудьте принять ответ, нажав на галочку, чтобы люди знали, что это помогло вам. Конечно, только если это решило проблему.