繁体   English   中英

我两次调用函数时,Python打印三次,为什么会这样呢?

[英]Python printing thrice while I called the function twice, why is this so?

我是python的新手,我试图了解self是如何工作的。 当我来自JavaScript时,我认为它与此相似。 如果我错了,请纠正我。 同时,我编写了以下代码:

class Restaurant(object):
   bankrupt = False

   def open_branch(self):
        if not self.bankrupt:
            print("branch opened")

x = Restaurant()
y = Restaurant()
y.bankrupt = True

print(y.open_branch())

print(x.open_branch())

并得到输出:

None
branch opened
None

当我两次调用open_branch()时。 它不应打印三次。 我认为它应该打印,

branch opened   // for first call
None           // for 2nd call

您可以在此处粘贴代码,然后查看“请有人解释”。

最后的两个打印语句仅打印该方法的返回结果:

print(y.open_branch())
print(x.open_branch())

由于python在没有显式指定return语句的情况下默认情况下返回None ,并且您两次调用方法,因此可以看到两个None语句。

如果调用的方法,无需打印,你会看到一个单一的印刷信息。

y.open_branch()
x.open_branch()

您可以通过在方法中添加return语句并在外部进行打印来改进代码,就像现在所做的那样。 就像是

class Restaurant(object):
    bankrupt = False

    def open_branch(self):
         if not self.bankrupt:
             return "branch opened"
         return "branch closed"


x = Restaurant()
y = Restaurant() 

y.bankrupt = True

print(y.open_branch())
# output:'branch closed'

print(x.open_branch())
# output: 'branch opened'

好的,您有以下代码:

class Restaurant(object):
    bankrupt = False

    def open_branch(self):
        if not self.bankrupt:
            print("branch opened")

x = Restaurant()
y = Restaurant()

到这里为止,您有两个类型为“餐厅”的对象。

y.bankrupt = True

在这里,您更改了存储在变量y中的对象的属性bankrupt

print(y.open_branch())

这将输出

None

只要; 为什么? 首先,您要调用函数y.open_branch()但是此函数将不会输出任何内容,因为属性bankrupt为true,因此, if not self.bankrupt的值不为false,则不会执行print语句。 但是,函数open_branch()也没有返回任何内容(没有return true语句左右。因此print(y.open_branch())等于print(None) ,它将输出None

print(x.open_branch())

对于x,属性bankrupt为false,因此, if not self.bankrupt不是true,则将评估打印语句print("branch opened") 之后None会出于同样的原因是为什么输出None得到通过输出print(y.open_branch())

您正在执行的操作是在open_branch的返回值上调用print

因此,当您看到它显示None ,您会看到print(x.open_branch()print(y.open_branch()

当你看到branch opened ,这是内部的打印结果open_branch

尝试这个:

class Restaurant(object):
   bankrupt = False

   def open_branch(self):
        result = ""
        if self.bankrupt:
            result = "Restaurant is bankrupt"
        else:
            result = "Branch opened"
        return result

x = Restaurant()
y = Restaurant()
y.bankrupt = True

print(y.open_branch())
print(x.open_branch())

有一些事情在这里给您带来问题:

  • 您的open_branch函数不会返回任何内容,因此,当您调用print(self.open_branch(x))它将显示None ,这是Python中所有函数默认情况下在没有return语句的情况下return 您可以通过替换来解决此问题

     if not self.bankrupt: print("branch opened") 

     if not self.bankrupt: return "branch opened" 
  • 您要调用print三次,这就是为什么您要在控制台上print三行的原因(尽管如果您用上面详述的return语句替换函数中的print ,这将自行解决)。

  • 您应该在if子句下放置一个else语句,以便它将返回有用的内容(如果self.bankrupt == True ,则返回None ),并且可以判断分支是否已打开。 我建议类似的东西:

     if not self.bankrupt: return "branch opened" else: return "Restaurant is bankrupt, branch could not be opened" 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM