1

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

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: ")
4

2 回答 2

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)
于 2013-04-19T22:03:22.703 回答
0

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

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

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

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

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

例如:

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

我希望我没有让您感到困惑,因为我的回答确实有点偏离了方向,只是想提供帮助,因为我自己是新手,并且在学习这些主题时发现这种类型的解释很有用

于 2013-04-19T22:25:36.577 回答