如何从模块中的输入设置变量

时间:2016-03-01 05:31:40

标签: module python-3.4

所以,我试图将主程序中的变量设置为模块中函数的整数输入。我无法解决如何做到这一点。

这是我的主要计划。菜单是我的模块的名称,因为我用它来显示菜单。 '菜单列表'是你说你想要菜单显示的地方。那部分工作正常。

import time, sys
from menu import *

menulist = ['Say hi', 'Say bye', 'Say yes', 'Say no', 'Exit']
choice = int(0)
menu(menulist)

choosing(menulist, choice)

print(choice) ##This is so I can see what it is
if choice == 1:
    print('Say hi')
elif choice == 2:
    print('Say bye')
elif choice == 3:
    print('Say yes')
elif choice == 4:
    print('Say no')
elif choice == 5:
    sys.exit()
else: ##This will print if choice doesn't equal what I want
    print('Error')

这是我的模块。

import time

def menu(menulist):
    print('Menu:')
    time.sleep(1)
    x = 0
    while x < len(menulist):
        y = x + 1
        printout = '     ' + str(y) + '. ' + menulist[x]
        print(printout)
        x = x + 1
        time.sleep(0.3)
    time.sleep(0.7)
    print('')


def choosing(menulist, choice):
    flag = True
    while flag:
        try:
            choice = int(input('Enter the number of your choice: '))
            time.sleep(0.8)
            if choice < 1 or choice > len(menulist):
                print('That wasn\'t an option sorry')
                time.sleep(1)
            else:
                flag = False
        except ValueError:
            print('That wasn\'t an option sorry')
            time.sleep(1)

菜单功能运行正常,选择功能几乎可以实现我想要的功能,但它不会设置选项&#39;当我从我的模块中调用它时,在我的主程序中输入。对不起,如果它显而易见,我对编程很陌生。感谢

1 个答案:

答案 0 :(得分:0)

您的模块不会将choice识别为全局变量。在def choosing(...)内,choice只是一个局部变量,可以为其分配输入值(转换为int)。
您确实将choice传递给choosing,但由于您之前已将choice设置为0,因此它是一个不可变的变量,而Python(幕后) )创建了本地副本。因此,对于所有问题,choicechoosing内的局部变量。

一旦你的程序离开函数choosing,变量及其值就会消失(出于所有实际目的)。

要解决这个问题,你不应该试图让choice全球化:一般来说,这是糟糕的设计(有很多例外,但仍然不是)。

相反,您只需从函数返回choice,然后在主程序中指定它。模块的相关部分:

def choosing(menulist):
    while True:
        try:
            choice = int(input('Enter the number of your choice: '))
            time.sleep(0.8)
            if choice < 1 or choice > len(menulist):
                print('That wasn\'t an option sorry')
                time.sleep(1)
            else:
                break
        except ValueError:
            print('That wasn\'t an option sorry')
            time.sleep(1)
    return choice

(我在这里做了一些改动:你可以简单地使用break语句来打破连续的while循环,而不是额外的flag变量。) 注意:不需要为选择分配初始值:该函数的结构使其始终必须通过行choice = int(...。那个,或者它存在于ValueError以外的例外。

主程序的相关部分:

import time, sys
from menu import *

menulist = ['Say hi', 'Say bye', 'Say yes', 'Say no', 'Exit']
menu(menulist)

choice = choosing(menulist)

与我的上述说明一起:不需要初始值choice

最后:在choice的调用和定义中查看choosing如何从函数中的参数中消失。

最后一点告诉我你可能来自不同的编程语言。在Python中,很少将参数传递给函数以使其更改。你只需返回它,因为这很简单,更清晰。在您有多个要更改的变量时,您可以返回一个元组:return a, b, c。或者是一个词典,或者你想要的任何东西(但是元组是多个返回值的起点)。