while True:
input = raw_input("enter input: ")
result = useInput(input)
def useInput(input):
if input == "exit":
break #return 0 / quit / etc.. i want to break the while loop from within this function
我知道我可以将“if logic”直接放在while循环中,但我希望它在函数中。有没有办法在循环中调用的函数中打破while循环?
答案 0 :(得分:2)
"if logic" directly in the while loop,
是最受欢迎的方式。答案 1 :(得分:2)
Python在生成器中有一个很酷的功能 - 这些允许您轻松生成可用于for
循环的迭代,这可以简化这种代码。
def input_until(message, func):
"""Take raw input from the user (asking with the given message), until
when func is applied it returns True."""
while True:
value = raw_input(message)
if func(value):
return
else:
yield value
for value in input_until("enter input: ", lambda x: x == "exit"):
...
for
循环将循环,直到迭代器停止,并且当用户输入"exit"
时,我们停止的迭代器停止。请注意,我稍微概括了一下,为简单起见,您可以将"exit"
的检查硬编码到生成器中,但如果您在一些地方需要类似的行为,则可能值得保持一般。
请注意,这也意味着您可以在list comprehension内使用它,这样也可以轻松构建结果列表。
编辑:或者,我们可以使用itertools
:
def call_repeatedly(func, *args, **kwargs):
while True:
yield func(*args, **kwargs)
for value in itertools.takewhile(lambda x: x != "exit",
call_repeatedly(raw_input, "enter input: ")):
...
答案 2 :(得分:1)
我通常这样做:
def getInput():
while True:
yield raw_input("enter input: ")
for input in getInput():
if input == 'exit':
break
result = useInput(input)
答案 3 :(得分:0)
您可以引发异常并在while
之外处理它......但这可能会导致代码混乱......
def useInput(in_):
if in_ == "exit":
raise RuntimeError
try:
while True:
input = raw_input("enter input: ")
result = useInput(input)
except RuntimeError:
pass
MUCH 更好地返回一个布尔标志,然后根据该标志的值中断或不中断。如果你担心你已经有了想要返回的东西,请不要担心 - python会很乐意让你的函数返回多个东西:
def func()
...
return something,flag
while True:
something,flag = func()
if flag:
break
答案 4 :(得分:0)
好吧,如果它只是美学可以阻止你把它放在while循环中,那么上面的任何一个都可以工作......不是尝试的粉丝/除了一个。只是知道将它放在自己的功能中不会有任何性能差异。这是我认为也符合您要求的那个:-)
# you have to define the function first if your while isn't in a function
def UseInput():
input = raw_input("enter input: ")
if input == "exit":
return False
elif input == "pass":
return True
# Do stuff
return True
while UseInput():
pass