我如何创建一个函数,其中一个变量(退出)确定'while'循环是否运行,并且能够在另一个函数中更改它,以便第一个函数中的while循环停止
while exit == 0:
option = (raw_input("What would you like to do? "))
if option == exit:
exit()
def exit():
exit = 1
这只是我想要做的一个例子。
当我尝试运行它时,它不会离开while循环,这样做并不会结束程序。我怎样才能使while循环识别退出现在为1并离开循环? 很抱歉,如果问题不是很好,因为这是我第一次使用stackoverflow提问。
附加:我想知道如何在函数之间更改变量,因为我将在程序的某些部分执行此操作。另外,我将在退出之前保存数据,这就是为什么我在另一个函数中使用'exit'
答案 0 :(得分:3)
此处的问题是范围 - exit
是函数exit()
的本地问题,因此不会影响循环范围中的变量exit
。
更好的解决方案是:
exit = False
while not exit:
option = raw_input("What would you like to do?")
if option == "exit":
exit = True
或者简单地说:
while True:
option = raw_input("What would you like to do?")
if option == "exit":
break
请注意True
和False
相对于1
和0
的使用 - 这更像是pythonic,因为这里你的意思是真值,而不是整数。我也改为与字符串"exit"
进行比较,因为我认为这是你想要的,而不是将用户输入与exit
的值进行比较。
如果您的问题是想要拥有相同的范围,您可能希望将代码作为一个类的一部分。
class Doer: #Naturally, give it a real name based on it's purpose.
def __init__(self):
self.exit = False
while not self.exit:
option = raw_input("What would you like to do?")
if option == "exit":
self.exit()
def exit(self):
self.exit = True
这里exit
是一个实例变量(因此可以从self
访问),因此我们两次都引用相同的变量。
如果您的代码不是对更复杂问题的简化,那么这在很大程度上是过度的,因为最先解决方案之一会更合适。
答案 1 :(得分:1)
只需使用break
代替exit
来电,即可将exit
功能抛弃。
答案 2 :(得分:1)
首先你的变量和函数不应该有相同的名称,但这里有一些可能对你有用的东西:
status = True
while status:
option = (raw_input("What would you like to do? "))
if option == "exit":
break
elif option == "do_something":
status = do_something()
elif option == "do_something_and_exit":
status = do_something_and_exit()
else:
print "I don't understand"
def do_something():
#do something awesome
return True
def do_something():
#do someting awesome
return False
答案 3 :(得分:1)
这样的变量看起来像某个对象的状态。要使此对象充当函数,您可以使其可调用
class Ask(object):
def __call__(self):
self.exit = False
while not self.exit:
option = (raw_input("What would you like to do? "))
if option == 'exit':
break
def quit():
self.exit = True
ask = Ask()
>>> ask()
答案 4 :(得分:1)
从另一个函数更改变量的简单方法是返回该值,然后在本地分配它。在您的代码示例中,它看起来像这样:
while exit == 0:
option = (raw_input("What would you like to do? "))
if option == 'exit':
exit = set_exit()
def set_exit():
return 1
答案 5 :(得分:0)
似乎我对答案方来说有点晚了,但是这里是如何使用闭包和变异(以及古老的编程技巧)来做到这一点。
这将在python3中工作(在python2中你可以做同样的事情,但必须使用一个列表来保存你的变量)。
x = 1
def mutateX(new):
nonlocal x # you will have to use the 'global' keyword if this function is defined in the body of a module
x = new
print(x) # --> 1
mutateX(2)
print(x) # --> 2
这不是你在这种情况下应该做的事情(只使用break
),但它会回答你在问题标题中提出的问题。