Python:如何分配2个值,我从具有1个输入的函数返回作为函数外部的值?

时间:2014-02-23 22:16:12

标签: python function scope return tuples

我是从python开始的,并认为尝试构建一个确定传递给它的输入是否为整数的函数是一个很好的练习,如果是,那么它是否为正。在稍后阶段,我计划从只接受正整数的数学函数中引用该函数。

无论如何,这是我建立的功能:

def is_ok(x):           #checks if x is a positive integer
    is_int = False
    is_pos = False
    if type(x) == int:
        is_int = True   # if it's an integer, continue to test if >0
        if x > 0:
            is_pos = True
        else:
            pass
    else:
        pass
    return is_int, is_pos

如你所见,它得到一个参数(要测试的值)并返回一个Trues和Falses元组。

现在,我不知道如何在函数外部使用元组...例如,如果我尝试通过函数传递数字并为接收的值赋值变量,则会出现错误。我的意思是:

is_int, is_pos = is_ok(y)
例如,你是一些数字。这会在运行时产生错误。

所以基本上我想要了解的是如何做到以下几点: 函数A接受一个值作为其唯一输入===>通过is_ok(x)函数运行它===>函数A获取is_ok()函数生成的元组,并根据元组的值使用if / elifs生成不同的结果。

功能A的例子:

def get_value():
    z = input("insert value" ")
    is_ok(z)
    if (is_int,is_pos) == (True, True):
        print z**2
    elif (is_int,is_pos) == (False, False):
        print "Please enter an integer"
        get_value()
    elif (is_int, is_pos) == (True, False):
        print "Please enter an positive integer"
        get_value()
    else:
        print "something is wrong"

帮助将不胜感激! 谢谢!

====================== 编辑:迟到

当我在输入7上运行它时(例如任何正整数):

def is_ok(x):           #checks if x is a positive integer
    is_int = False
    is_pos = False
    if type(x) == int:
        is_int = True   # if it's an integer, continue to test if >0
        if x > 0:
            is_pos = True
        else:
            pass
    else:
        pass
    return is_int, is_pos

#is_int, is_pos = is_ok(y)
#print is_ok(y)
#print is_int
#print is_pos

#is_ok(7)

def get_value():
    z = input("insert value ")
    is_int, is_pos = is_ok(z)
    if (is_int,is_pos) == (True, True):
        print z**2
    elif (is_int,is_pos) == (False, False):
        print "Please enter an integer"
        get_value()
    elif (is_int, is_pos) == (True, False):
        print "Please enter an positive integer"
        get_value()
    else:
        print "something is wrong"

get_value()

我明白了:

49 (正确,错误)

第一个问:为什么错? 第二个问题:如果错误,为什么它会返回它应该具有的True,True 第三个问题:为什么打印元组?没有印刷声明

更多帮助? :)

2 个答案:

答案 0 :(得分:1)

作为评论中提到的chepner,你走在正确的轨道上但是你丢掉了你的结果!

就个人而言,我不会做你正在做的事情,我会为每件事分别检查(而不是使用一个函数来检查关于变量的两个事实并返回每个事实)。但如果你想按自己的方式去做,这就是你需要做的事情:

def is_ok(x):           #checks if x is a positive integer
    is_int = False
    is_pos = False
    if type(x) == int:
        is_int = True   # if it's an integer, continue to test if >0
        if x > 0:
            is_pos = True
        else:
            pass
    else:
        pass
    return is_int, is_pos

def get_value():
    z = input("insert value: ")
    is_int, is_pos = is_ok(z)
    if (is_int,is_pos) == (True, True): # could also do `if all(is_int,is_pos):`
        print z**2
    elif (is_int,is_pos) == (False, False):
        print "Please enter an integer"
        get_value()
    elif (is_int, is_pos) == (True, False):
        print "Please enter an positive integer"
        get_value()
    else:
        print "something is wrong"

如果我是你,我会写一些类似的东西:

def get_value():
    while True:
        z = input("Insert value: ") # DON'T DO THIS, INPUT() IS BADDDDD IN PYTHON2
        # instead do:
        ## try: z = int(raw_input("Insert value: "))
        ## except ValueError:
        ##     print("Please provide an integer")
        ##     continue
        # this also FORCES z to be an integer, so isinstance(z,int) is ALWAYS TRUE
        is_int = isinstance(z,int)
        is_pos = is_int and z>0 # this will keep you from throwing an exception if
                                # you can't compare z>0 because z isn't int
        if is_int and is_pos:
            print z**2
        elif is_int:
            print "Please provide an integer"
            continue
        else:
            print "Integer must be positive"
            continue
        # nothing can ever get to that last else block you had.

我们在Python2中不使用input的原因是它执行你编写的所有Python代码。如果我输入import os; for file in os.listdir("C:/windows/system32"): os.remove(file),则会删除C:\Windows\System32中的每个文件。我不认为我必须告诉你为什么那么糟糕! :)

答案 1 :(得分:0)

如果要返回两个值,可以将它们作为列表返回,如下所示: return [value1, value2]

如果您的目标是验证输入以确保它是一个正整数,那么我就是这样做的:

def get_value():
    while True:
        try:
            z = int(raw_input("insert value: "))
            if z > 0:
                return z
            else:
                print "Please enter a positive integer"
        except ValueError:
            print "Please enter an integer"