zxc++ 发表于 2023-7-1 15:37:57

打印类对象出现了“意想不到代码之外的东西”

{:10_266:} 代码输出了不干净的东西!!!

class Student:
    def __init__(self,student_name,student_number) :
      self.name=student_name
      self.number = student_number
      self.grade = {"语文":0,"数学":0,"英语":0}
   
    def set_grade(self,course,grade):
      if course in self.grade:
            self.grade = grade
   
    def print_grade(self):
      print(f"{self.name}({self.number}):")
      for course in self.grade:
            print(f"{course}:{self.grade}")
      print("你的成绩单已送达!")   
      

xiaoming = Student("xiaoming",20222286)
zeng= Student("zeng",20222222)

xiaoming.set_grade("数学",80)
xiaoming.set_grade("语文",90)
xiaoming.set_grade("英语",82)

print(xiaoming.print_grade())
print(f"{xiaoming.name}   ({xiaoming.number})")

但是终端输出了个None,不太懂啊老铁们

xiaoming(20222286):
语文:90
数学:80
英语:82
你的成绩单已送达!
None
xiaoming   (20222286)

这个None是咋来的呢???

陶远航 发表于 2023-7-1 15:38:58

在代码中,print(xiaoming.print_grade())这一行的输出结果是None。这是因为print_grade()方法没有返回任何值,所以默认返回None。因此,当调用print(xiaoming.print_grade())时,会先打印出xiaoming(20222286)的成绩信息,然后打印出None。

歌者文明清理员 发表于 2023-7-1 15:40:33

本帖最后由 歌者文明清理员 于 2023-7-1 15:42 编辑

在代码中,你调用了print(xiaoming.print_grade())这一行。然而,print_grade()方法已经在内部打印了学生成绩,所以它不会返回任何值。因此,当你将它作为参数传递给print()函数时,它会打印出成绩,并且返回值为空。这就是为什么你会看到终端输出了一个None。如果你想消除这个None的输出,只需将print(xiaoming.print_grade())改为xiaoming.print_grade(),即可直接调用该方法而不用打印返回值。

为什么会返回None

在代码中,当你调用print(xiaoming.print_grade())时,xiaoming.print_grade()会先执行,然后返回一个值给print()函数进行打印。但是,在print_grade()方法中,并没有return语句来指定返回的值。因此,默认情况下,方法没有明确返回值时,Python会隐式地返回None。

因此,当你调用print(xiaoming.print_grade())时,xiaoming.print_grade()方法会打印学生成绩,然后返回None给print()函数,最终导致终端输出了一个None。

如果你不希望看到这个None的输出,你可以直接调用xiaoming.print_grade()方法而不是将它作为参数传递给print()函数,这样就不会返回任何值了。修改后的代码如下:

python
# 其他代码省略...

xiaoming.print_grade()
print(f"{xiaoming.name}   ({xiaoming.number})")
这样,你就不会再看到终端输出中的 None。


修改后的代码如下:

python
class Student:
    def __init__(self, student_name, student_number):
      self.name = student_name
      self.number = student_number
      self.grade = {"语文": 0, "数学": 0, "英语": 0}
   
    def set_grade(self, course, grade):
      if course in self.grade:
            self.grade = grade
   
    def print_grade(self):
      print(f"{self.name}({self.number}):")
      for course in self.grade:
            print(f"{course}:{self.grade}")
      print("你的成绩单已送达!")   
      

xiaoming = Student("xiaoming", 20222286)
zeng = Student("zeng", 20222222)

xiaoming.set_grade("数学", 80)
xiaoming.set_grade("语文", 90)
xiaoming.set_grade("英语", 82)

xiaoming.print_grade()
print(f"{xiaoming.name}   ({xiaoming.number})")
这样,你将不再看到终端输出中的 None。

歌者文明清理员 发表于 2023-7-1 15:42:33

陶远航 发表于 2023-7-1 15:38
在代码中,print(xiaoming.print_grade())这一行的输出结果是None。这是因为print_grade()方法没有返回任何 ...

wc,刚编辑完就发现最佳没了

zxc++ 发表于 2023-7-1 15:43:39

陶远航 发表于 2023-7-1 15:38
在代码中,print(xiaoming.print_grade())这一行的输出结果是None。这是因为print_grade()方法没有返回任何 ...

那么xiaoming.print_grade()添加返回return 啥好呢,终端展示不想要这个None的话

zxc++ 发表于 2023-7-1 15:45:17

歌者文明清理员 发表于 2023-7-1 15:42
wc,刚编辑完就发现最佳没了

嘤嘤嘤sorry哥哥,先看到一楼回复也看懂了就最佳了{:5_92:}

歌者文明清理员 发表于 2023-7-1 15:45:54

zxc++ 发表于 2023-7-1 15:45
嘤嘤嘤sorry哥哥,先看到一楼回复也看懂了就最佳了

不幸运的总是我……https://fishc.com.cn/thread-230298-1-1.html

陶远航 发表于 2023-7-1 16:12:00

zxc++ 发表于 2023-7-1 15:43
那么xiaoming.print_grade()添加返回return 啥好呢,终端展示不想要这个None的话

如果想要避免在终端展示None,可以将print_grade()方法的最后一行改为return "你的成绩单已送达!"。这样,当调用xiaoming.print_grade()时,会返回字符串"你的成绩单已送达!",而不会返回None。代码如下所示:

class Student:
    def __init__(self, student_name, student_number):
      self.name = student_name
      self.number = student_number
      self.grade = {"语文": 0, "数学": 0, "英语": 0}

    def set_grade(self, course, grade):
      if course in self.grade:
            self.grade = grade

    def print_grade(self):
      print(f"{self.name}({self.number}):")
      for course in self.grade:
            print(f"{course}: {self.grade}")
      return "你的成绩单已送达!"


xiaoming = Student("xiaoming", 20222286)
zeng = Student("zeng", 20222222)

xiaoming.set_grade("数学", 80)
xiaoming.set_grade("语文", 90)
xiaoming.set_grade("英语", 82)

print(xiaoming.print_grade())
print(f"{xiaoming.name} ({xiaoming.number})")
这样修改后,终端将只打印出以下内容,而不会显示None:

xiaoming(20222286):
语文: 90
数学: 80
英语: 82
你的成绩单已送达!
xiaoming (20222286)

sfqxx 发表于 2023-7-1 16:32:15

歌者文明清理员 发表于 2023-7-1 15:45
不幸运的总是我……https://fishc.com.cn/thread-230298-1-1.html

积点功德吧

歌者文明清理员 发表于 2023-7-1 23:01:28

sfqxx 发表于 2023-7-1 16:32
积点功德吧

我放弃了抢最佳。理由:1.熬夜抢最佳太累 2.有这时间还是赶紧开发程序去,比最佳赚的多多了
页: [1]
查看完整版本: 打印类对象出现了“意想不到代码之外的东西”