我正在构建一个脚本来绘制平滑和绘图值。但是,我无法获得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")
答案 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")