【问题标题】:How to call a class in a function Python如何在函数 Python 中调用类
【发布时间】:2019-04-24 10:32:46
【问题描述】:

我是一个完全的业余爱好者,并试图弄清楚如何编写一个获取对象列表并返回所述对象名称列表的函数(基于它们是否通过 if 语句)。这是我在教程的帮助下编写的课程:

class Student:  
passmark=50  

def __init__(self,name,mark):  
    self.name=name  
    self.mark=mark  

def passes(self):  
    return self.mark > Student.passmark 

所以从现在开始我假设我列出了一个对象列表,比如:

students = []  

虽然这个列表只是一个全新的列表,这是必要的,但我如何将它链接到课程?从这一点上,我想找出哪些学生不及格,并将他们退回以及我感到困惑的地方:

def failed(list):  
    for student in Students:  
        if passmark > self.mark:  
            return list  

我能做的就这么多吗,对不起,我刚去上课,打电话给我让我很困惑。上面的代码根本没有引用这个类,我真的很困惑如何这样做。我没有语法错误或任何东西,我认为我的逻辑有致命缺陷。

【问题讨论】:

  • 看看 Handras 的回答。这是您需要了解的有关列表的内容。理解(也适用于字典和其他东西)只不过是 for-append 方法的语法糖。

标签: python list class


【解决方案1】:

您想从学生列表中取出所有学生。所以在 for 循环中使用它。此外,您在方法中正确封装了通过/失败标准的逻辑,因此请使用它。

这是我认为你想要的代码:

def failed(list_of_students):
   failed_students = []
   for student in list_of_students:  
       if not student.passes():  
           failed_students.append(student.name)  
   return failed_students

更高级的方法是使用列表推导:

def failed(list_of_students):
    return [student for student in list_of_students if not student.passes()]

它更pythonic,但对于具有C或Java背景的初学者来说更难理解。

【讨论】:

  • 谢谢!这是向新人解释列表的正确方式。理解留待以后。当然,除了你不能命名列表list ;)
  • 确实会出问题,所以我更正答案!
【解决方案2】:

您可以像这样使用列表推导:

def failed(list):
    return [student.name for student in students if not student.passes()]

【讨论】:

  • 这正是我所需要的,但你为什么要使用方括号来返回?是因为使用了列表吗?此功能还显示那些通过,对不及格的学生使用“如果不是”。
  • 啊,你说得对,我应该为没有通过的学生使用not。然后编辑.. 方括号是list comprehension 语法的一部分。
【解决方案3】:

试试这个代码。使用列表推导返回结果。这是一个非常强大的python工具。

class Student:  
    passmark = 50
    def __init__(self, name, mark):  
        self.name=name  
        self.mark=mark  

    def passes(self):  
        return self.mark > Student.passmark 

    def __repr__(self):
        return '{} {}'.format(self.name, self.mark)


def failed(students_list):  
    return [student for student in students_list if student.mark < Student.passmark]

【讨论】:

    【解决方案4】:

    给定一个像您定义的 Student 类:

    class Student:  
        passmark=50  
    
        def __init__(self,name,mark):  
            self.name=name  
            self.mark=mark  
    
        def passes(self):  
            return self.mark > Student.passmark 
    

    您可以使用以下方法实例化学生列表:

    students = [Student("John", 49), Student("Mary", 75)]
    

    您似乎也在尝试定义一个函数,该函数将返回所有失败学生的列表;你可以这样做:

    def failed(student_list):
        return [x for x in student_list if not x.passes()]
    

    【讨论】:

      【解决方案5】:
      mark_to_pass = 50
      
      #Approach one
      class Student:
          def __init__(self, student_name, student_mark):
              self.name = student_name
              self.mark = student_mark
              self.pass_mark = self.calculate_passing_mark(mark_to_pass)
      
          def calculate_passing_mark(self, mark_to_pass):
              if self.mark >= mark_to_pass:
                  return True
              return False
      
      if __name__ == '__main__':
          example_student = Student("Swanson", 75)
          print(example_student.pass_mark)
      

      使用这种方法,每次创建学生对象时,它都会告诉创建一个字段,告诉您学生已通过。使用学生对象列表等列表时,您需要将学生添加到列表中。示例

      students = []
      students.append(example_student)
      

      现在您可以通过以下方式查看您的学生列表

      for student in students:
         print(student.pass_mark) # or do some other logic passed on who passed or failed. Or even here you dont need to create pass_mark object you can just check if student.mark > pass_mark
      

      【讨论】:

        【解决方案6】:

        我假设 failed 不是 Student 类的成员函数。下面的代码应该适用于您正在尝试做的事情。

        class Student:
            passmark=50
            def __init__(self,name,mark):
                self.name=name
                self.mark=mark  
        
            def passes(self):  
                 return self.mark > Student.passmark
        
        students = [Student("tom",40),Student("joe",70)]
        
        def failed(listofStudents):
            listofStudentsThatFail = []
            for student in listofStudents:
                if not student.passes():
                    listofStudentsThatFail.append(student)
            return listofStudentsThatFail
        
        for s in failed(students):
            print s.name
        

        运行代码时的输出是: 汤姆

        【讨论】:

          猜你喜欢
          • 2023-01-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-01-23
          • 2020-10-19
          相关资源
          最近更新 更多