2016-03-01 56 views
0

因此,我試圖在我的主程序中將變量設置爲模塊中函數的整數輸入。我無法解決如何做到這一點。如何從模塊中的輸入設置變量

這是我的主要程序。菜單是我的模塊的名稱,因爲我用它來顯示菜單。 'menulist'是你說你想要菜單顯示的地方。那部分工作正常。

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) 

菜單功能工作正常,以及選擇功能,幾乎做什麼,我希望它,但它不會在我的主要程序中設置「選擇」時,我把它從我的模塊輸入。對不起,如果它是明顯的東西,我是編程新手。謝謝

回答

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。或者是一個字典,或者你喜歡的任何東西(但是元組是多個返回值的起點)。

+0

非常感謝。我是編程新手,所以我沒有真正理解這一切,但這確實更有意義。我在我周圍亂搞,但試圖讓它起作用,因此像初始化選擇一樣。再次感謝 –