передача функции результатов в классе - PullRequest
0 голосов
/ 03 декабря 2018

в моем основном, все print() работает, кроме последнего !!если мы запустим этот код в конце, он повторится снова и начнет получать мои входные данные.и если вы знаете какие-либо другие способы передачи этих функций другому, пожалуйста, помогите мне.

Я думаю, это не очень понятно.

class Student:
    def getMarks(self):
        number_of_students = int(input("please enter the number of students : "))
        students = []
        while number_of_students != 0:
            name = input("please enter the name :")
            mark = input("please enter the mark :")
            x = [name,mark]
            students.append(x)
            number_of_students -= 1
        return students

    def getDict(self):
        dict = {}
        for item in Student.getMarks(self):
            dict[item[0]] = item[1]
        return dict

    def dictItems(self):
        return Student.getDict(self).items()

    def sortMarks(self):
        marks = [x for x in Student.getDict(self).values()]
        return sorted(marks)

    def getIntendMark(self):
        place = 0
        n = 1
        sort = Student.sortMarks(self)
        for item in sort:
            if sort[0] == sort[n]:
                n += 1
            else:
                place = n

        mark = sort[place]
        return mark

    def showAnswer(self):
        nomre = Student.getIntendMark(self)
        dict = Student.dictItems(self)

        for key,value in dict:
            if value == nomre:
                return f"answer:: name is {key} , mark is {nomre}"


if __name__ == "__main__":
    s = Student()
    # print(s.getMarks())
    # print(s.getDict())
    # print(s.sortMarks())
    # print(s.getIntendMark())
    print(s.showAnswer())

Ответы [ 3 ]

0 голосов
/ 03 декабря 2018

Итак, у вас есть 2 проблемы:

  1. Return в функции выходит из функции.Таким образом, помещение возврата в цикл for не будет работать, так как он будет выполняться только один раз, а затем выйдет из функции (и для цикла).

  2. Вы дважды вызываете getMarks() один разпо:

getIntendMark () -> sortMarks () -> getDict () -> getMarks ()

и другое время:

dictItems () -> getDict () -> getMarks ()

Чтобы исправить код, вам нужно будет внести некоторые серьезные изменения.Хорошее место для начала, вероятно, Объектно-ориентированное программирование на Python , чтобы лучше ознакомиться с тем, что вы на самом деле кодируете.

0 голосов
/ 03 декабря 2018
class Student:
    def getMarks(self):
        number_of_students = int(input("please enter the number of students : "))
        students = []
        while number_of_students!=0:
            name = input("please enter the name :")
            mark = input("please enter the mark :")
            x = [name,mark]
            students.append(x)
            number_of_students -= 1
        return students

    def getDict(self):
        dict = {}
        for item in self.getMarks():
            dict[item[0]] = item[1]
        return dict

    def getIntendMark(self):
    dict = self.getDict()
    place = 0
    n = 0 # if you had 1 student it was giving out of bound error
    sort = sorted([x for x in dict.values()])
    if len(sort)>1:  # I check the list length 
        n=1
    print(len(sort))
    for item in sort:
        if sort[0] == sort[n]:
            if n < len(sort):
                n += 1
        else:
            place = n

    mark = sort[place]
    return (mark, dict.items())

    def showAnswer(self):
        nomre,dict = self.getIntendMark()
        #dict = self.getDict().items() #you are calling getMarks() 2nd times

        for key,value in dict:
            if value == nomre:
                return f"answer:: name is {key} , mark is {nomre}"


if __name__ == "__main__":
    s = Student()
    # print(s.getMarks())
    # print(s.getDict())
    # print(s.sortMarks())
    # print(s.getIntendMark())
    print(s.showAnswer())

Я внес несколько изменений в ваш код и удалил ненужные методы.

Вывод:

(python37) C:\Users\Documents>py test.py
please enter the number of students : 1
please enter the name :e
please enter the mark :2
answer:: name is e , mark is 2
0 голосов
/ 03 декабря 2018

Вы звоните Student.dictItems в showAnswer().
В dictItems вы звоните getDict.
В getDict вы перебираете Student.getMarks, что ставит вас в начало.

Я бы опубликовал решенный код, но вся архитектура не так, как Python считает ориентацию на объекты.

Пожалуйста, прочтите это это до конца!Это поможет вам в правильном проектировании классов Python.

self, как следует из названия, является специальной переменной только для одного экземпляра учащегося.Вы должны создать функцию __init__(self).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...