Python用户定义列表在while while循环中无法识别

时间:2018-03-14 21:27:22

标签: python

首先感谢我作为Python世界的相对新人。我正在处理一组简单的代码,并且一直绞尽脑汁去了解我的错误。我怀疑这是一个相对简单的事情,但到目前为止所有搜索都没有结果。如果在此之前已经涵盖了这一点请温柔,我已经找了几天!

我正在研究以下内容,在捕捉并纠正了一些问题后,我怀疑我是在最后一道障碍: -

def main():
    our_list = []
    ne = int(input('How many numbers do you wish to enter?  '))
    for i in range(0, (ne)): # set up loop to run user specified number of time
        number=int(input('Choose a number:-  '))
        our_list.append(number) # append to our_list
    print ('The list of numbers you have entered is ') 
    print (our_list) 
main()

while True:
    op = input ('For the mean type <1>, for the median type <2>, for the mode type <3>, to enter a new set of numbers type <4> or 5 to exit')
    import statistics
    if op == "1":
        mn = statistics.mean(our_list)
        print ("The mean of the values you have entered is:- ",mn)
    if op == "2":
        me = statistics.median(our_list)
        print ("The median of the values you have entered is:- ",me)
    if op == "3":
        mo = statistics.mode(our_list)
        print ("The mode of the values you have entered is:- ",mo)
    if op == "5":
        main()
    else:
        print("Goodbye")
        break`

由于某种原因,在while true循环中未识别附加的(our_list),导致统计计算无效。任何操纵者都会非常感激我在哪里错过了显而易见的事先感谢。

干杯 布赖恩

3 个答案:

答案 0 :(得分:1)

我不确定“未被识别”的确切含义,但our_listmain内的局部变量,因此不能在main内的任何地方使用}。

因此,如果您尝试在其他地方使用它,则应获得NameError

如果你的代码实际上有一个与我们在这里看不到的局部变量同名的全局变量,那么事情会更加混乱 - 你不会得到NameError,你会得到全局变量的值,这不是你想要的。

这里最好的解决方案是从函数返回值,然后让调用者使用返回的值。例如:

def main():
    our_list = []
    ne = int(input('How many numbers do you wish to enter?  '))
    for i in range(0, (ne)): # set up loop to run user specified number of time
        number=int(input('Choose a number:-  '))
        our_list.append(number) # append to our_list
    print ('The list of numbers you have entered is ') 
    print (our_list) 
    return our_list

the_list = main()

while True:
    op = input ('For the mean type <1>, for the median type <2>, for the mode type <3>, to enter a new set of numbers type <4> or 5 to exit')
    import statistics
    if op == "1":
        mn = statistics.mean(the_list)
        print ("The mean of the values you have entered is:- ",mn)
    if op == "2":
        me = statistics.median(the_list)
        print ("The median of the values you have entered is:- ",me)
    if op == "3":
        mo = statistics.mode(the_list)
        print ("The mode of the values you have entered is:- ",mo)
    if op == "5":
        the_list = main()
    else:
        print("Goodbye")
        break

还有其他选项 - 您可以传入main的空列表来填充,或者使用全局变量(或者更好的是,更强制的等价物,如类实例或闭包变量的属性)或者重构你的代码,这样每个需要访问our_list的人都在同一个函数中......但我认为这是你在这里做的最干净的方法。

顺便说一句,这不是相当最后一道障碍 - 但你非常接近:

  • 在任何均值,中位数或模式之后,它将击中“再见”并退出而不是回到循环中。你知道elif吗?
  • 您在菜单中混淆了'5''4'
  • 如果用户输入23并询问该模式,您的代码会将ValueError回溯转储到屏幕上;可能不是你想要的。您知道try / except吗?

这就是我注意到的,而且它们都是非常简单的事情,所以请提前恭喜。

答案 1 :(得分:0)

问题是our_list函数中定义了main(),并且在main()函数范围之外不可见。

由于您在一个块中执行所有操作,因此可以删除第1行和第6行,从main()函数中获取代码并将其置于与后面的代码相同的缩进级别。

答案 2 :(得分:0)

这似乎是因为你在main()函数中定义了our_list。您应该通过在main()函数之外创建它来将其定义为全局变量。

您还可以将while循环放在函数中,并将our_list作为参数传递给列表。