Python:为什么在while循环中调用的函数会返回与单独调用时不同的函数?

时间:2017-01-09 23:01:57

标签: python

我有第一个功能,移动(x,y,u,v),用于在棋盘游戏中将棋子从坐标(x,y)移动到(u,v)。

some_Class():
    def move(self, x, y, u, v):

        self.x = x
        self.y = y
        self.u = u
        self.v = v

        if (conditions for possible move...):
            return(some_function(self.x, self.y, self.u, self.v)) ## applies the move

        else:
            return("Move impossible. Try again.")

当移动可能时,该功能移动棋盘上的棋子,当无法移动时,它会返回一个字符串,表示"移动不可能"。

我有很多测试要做,所以为了简化我的生活,我做了一个seconde功能:

def play()
    a = input()
    b = []
    for i in a:
        b.append(i)
    return(move(b[0], b[1], b[2], b[3]))

我把它放在一个无限循环中,所以我可以在移动后继续尝试移动。

while True:
    play()

整个过程都运转正常,根据游戏规则移动棋子,一切都很好,但是当不可能移动时我不会得到“不可能移动”#34;消息。

如果我单独调用play()(在while循环之外,例如在shell中),并尝试一个不可能的移动,我会收到消息。

我非常确定这是非常基本的,但我无法在任何地方找到答案,我需要这些消息,因为我使用它们来查找代码中的错误。

如果不清楚,我会添加一个例子。让我们说从(0,0)到(1,1)的移动是不可能的。

案例1,play()没有循环:

>>>play()
0011
'Move impossible. Try again.'

案例2,在循环中播放():

while True:
    play()

0011

0011

...

此动作未播放(该片段保留在原位),但我没有收到该消息。那是为什么?

编辑:问题解决了。

print(play())

没有工作,但我所要做的只是

return(print("Impossible move"))

而不是

return("Impossible move")

谢谢大家的帮助:)

2 个答案:

答案 0 :(得分:4)

您的函数返回字符串。当你从解释器中调用它时,它会自动打印,因为它是你正在运行的语句的结果,但是如果它在while循环中,你需要显式打印才能显示它。返回字符串 ,但您没有使用返回值执行任何操作。

试试这个:

while True:
    print(play())

顺便说一句,这是以与有效结果相同的方式返回错误可能成为问题的原因之一。最好在移动无效时引发异常,然后使用try/except来处理错误情况。

例如:

# (in move):
if valid_move(...):
    return(do_move(...))
else:
    raise ValueError("Move impossible, try again")

# (in play):
try:
    move(...)
except ValueError as err:
    print(err)

答案 1 :(得分:3)

在交互式提示符下运行play()时,Python会打印表达式的值(返回值)。

在循环内部,这不一定会发生。您不对表达式执行任何操作,因此该值将被丢弃。 (使用基础Python REPL,它实际上会在循环中打印出裸值;但是,例如,IPython不会。)

因此,如果您想查看结果,请使用print(play())