使用是/否输入循环(Python)

时间:2017-12-10 02:26:10

标签: python while-loop

我正在构建一个脚本来绘制平滑和绘图值。但是,我无法获得yes / no函数来控制while循环。

我将while条件设置为等于“N”并等待用户在退出之前说出他们喜欢绘图(输入Y)。

我收到的是“NameError:name'reply'未定义。”

import matplotlib.pyplot as plt
import numpy

while True:
    reply[0] = 'n'
    def yes_or_no(question):
        reply = str(input(question+' (y/n): ')).lower().strip()
        if reply[0] == 'y':
            return 1
        if reply[0] == 'n':
            return 0
        else:
            return yes_or_no("Please Enter (y/n) ")

# a bunch of math
# plots for the user

yes_or_no('Do you like the plot')
break
print("done")

当我调整回复[0]以回复程序挂起(见下文)

print("started")
while True:
    reply = 'n'
    def yes_or_no(question):
        reply = str(input(question+' (y/n): ')).lower().strip()
        if reply[0] == 'y':
            return 1
        if reply[0] == 'n':
            return 0
        else:
            return yes_or_no("Please Enter (y/n) ")

yes_or_no('Do you like the plot')
print("done")

5 个答案:

答案 0 :(得分:2)

尝试:

def yes_or_no(question):
    reply = str(input(question+' (y/n): ')).lower().strip()
    if reply[0] == 'y':
        return 1
    elif reply[0] == 'n':
        return 0
    else:
        return yes_or_no("Please Enter (y/n) ")

print("started")
while True:
    # DRAW PLOT HERE;
    print("See plot....")
    if(yes_or_no('Do you like the plot')):
        break
print("done")

为清晰起见,最好将功能定义与循环分开。此外,否则将在每个循环中读取浪费资源。

输出:

$ python ynquestion.py 
started
See plot....
Do you like the plot (y/n): n
See plot....
Do you like the plot (y/n): N 
See plot....
Do you like the plot (y/n): NO
See plot....
Do you like the plot (y/n): No
See plot....
Do you like the plot (y/n): no
See plot....
Do you like the plot (y/n): yes
done
$

答案 1 :(得分:1)

你一定要看一些关于"如何编码"的教程。一般来说。有几个"误解"。但是,这是一个更清洁的版本:

import matplotlib.pyplot as plt
import numpy

def bunch_of_math():
    ...

def plotting():
    ...

# move this into the loop in case you want to calc and plot
# new stuff every iteration
bunch_of_math()
plotting()

print("start")

while True:
    reply = str(input(question+' (y/n): ')).lower().strip()
    if reply == 'y':
        break
    elif reply == 'n':
        break
    else:
        print("please select (y/n) only")
        continue

print("done")

在循环中声明函数是不好的样式,特别是如果你不需要它。您的代码将在每次迭代时重新创建函数,如果您在每次迭代中以某种方式更改函数,则只需要该函数。

reply[0] = 'n'表示您要访问索引为reply的列表或数组(容器数据结构)0并在其中写入'n'。您尚未初始化此类容器。此外,您根本不需要容器,因为您不存储每个用户输入。您只关心用户的最新答案 - >变量就足够了。

if reply[0] == 'y':
    return 1
if reply[0] == 'n':
    return 0
else:
    return yes_or_no("Please Enter (y/n) ")

你有两个if条件接一个:Python会检查== 'y'然后再检查== 'n'。您需要使用elif来声明else-if条件,否则会浪费资源或遇到意外行为。此外,您永远不会使用返回值。 while循环只是以break语句退出,因为它是一个循环。因此,您的return陈述毫无意义。

答案 2 :(得分:1)

def yes_or_no(question):
    while True:
        answer = input(question + ' (y/n): ').lower().strip()
        if answer in ('y', 'yes', 'n', 'no'):
            return answer in ('y', 'yes')
        else:
            print('You must answer yes or no.')

yes_or_no('Do you like the plot?')

答案 3 :(得分:0)

你不能初始化数组的索引。

reply[0] = 'n'更改为reply = 'n'

答案 4 :(得分:0)

第一个错误 - 您从未定义reply,那么如何索引该字符串?

while True:
    reply[0] = 'n'  # What is reply??

break也在循环之外,它应该是一个SyntaxError。

第二个错误 - 您定义了一个循环,但从未更改循环本身中的值reply。另外,yes_or_no()在循环之外被调用(但它永远不会破坏循环,只有return来自函数。)

你对功能如何运作有一些误解。它们是单独的代码块,不打算嵌套在其他逻辑中。

def yes_or_no(question):
    while True:
        reply = input(question + ' (y/n): ')).lower().strip()
        if reply.startswith('y'):
            break 

print("started")
yes_or_no('Do you like the plot')
print("done")

或者,可能是一个更易阅读的版本

def yes_or_no(question):
    return input(question + ' (y/n): ')).lower().strip()

print("started")
question = 'Do you like the plot?'
like_plot = yes_or_no(question).startswith('y')
while not like_plot:
    like_plot = yes_or_no(question).startswith('y')
print("done")