更改函数内的全局变量

时间:2013-04-19 21:59:29

标签: python variables global local

我是编程新手,我正在寻找一些关于该怎么做的建议。我正在尝试编写的程序需要用户输入几个数字。 我想使用一个函数来测试用户是否为输入的每个值输入一个数字。如果输入不是数字,我希望函数在输入数字之前不断询问数字。我想知道是否有更好的方法将值传递给全局变量,而不是将函数中的每个变量明确声明为全局变量。我不确定是否有更好的方法来做到这一点......

rowNum = None

def numTest(c, d):
    x = False
    while x is not True:    
        try:
            c = raw_input(d)   
            c = float(c)
            x = True
        except:
            print "The value you entered isn't a valid number, please try again."            
    global rowNum 
    rowNum = c

numTest(rowNum, "Enter number of rows: ")
print rowNum
# I want to use the numTest function on several variables...
# e.g.
# numTest(contourLevel, "Enter number of contour levels: ")
# numTest(cellSize, "Enter cell size: ")
# numTest(labelSize, "Enter label size: ")

2 个答案:

答案 0 :(得分:5)

只需使它成为一个函数,它返回一些东西而不是操纵全局,更容易维护!

def get_num(msg):
    while True:    
        try:
            return int(raw_input(msg)) # number of rows should be int
        except ValueError:
            print "The value you entered isn't a valid number, please try again."            

num_rows = get_num("Enter number of rows: ")
print num_rows

而不是你提到的numTest(cellSize, "Enter cell size: ")之类的东西, 你应该做cellSize = get_num("Enter cell size: ")。返回值是更好的做法。

您可以对intfloat这样的功能更加通用:

def get_num(msg, type_=int):
    while True:    
        try:
            return type_(raw_input(msg))
        except ValueError:
            print "The value you entered isn't a valid number, please try again."

现在你也可以:

x = get_num("test") # normal int
x = get_num("foo", float)

答案 1 :(得分:0)

我没有足够的代表所以我不能发表评论但是: @Schack, 将return视为一种内部打印语句(您无法看到返回的内容,但Python解释器可以读取并使用/存储/操作该值。) print语句显示屏幕上的输出(对于人类),虽然对程序计算/运行没有任何作用,并且return语句将输出发送到python解释器(对于程序),尽管屏幕上没有显示任何内容供人类阅读。

如果函数返回一个字符串,例如,您可以通过声明:将该输出存储为变量: variable1 = function1(args)

将存储函数1返回的任何字符串(基于args的输入)作为variable1。

这对于组织代码非常有用,并且意味着您不必使用全局变量。

需要注意的重要一点是,一旦函数返回一个值,就不会执行其他代码。

例如:

def example(a, b):
    for n in range(1, 30):
        if a**n == b**4:
            return
            break
    else:
        return False

break和else语句是多余的,因为在函数执行return语句之后,不会执行其他代码。写这个的更好方法是:

def example(a, b):
    for n in range(1, 30):
        if a**n == b**4:
            return n
    return False

我希望我根本没有把你弄糊涂,因为我的答案有点偏离,只是想帮助,因为我是新来的,并且在我学习这些主题时发现这种解释很有用