高阶排序功能 - 打印三次

时间:2015-12-02 14:03:32

标签: python

我想做一个高阶函数。代码没问题。 但我不太清楚它为什么输出3次相同的值。 假设如果用户输入1,它将打印第一行代码,依此类推。我一直得到相同的输出。

def double(x):
    return 2*x

def square(x):
    return x*x

def cube(x):
    return x*x*x

def getInput():
    while True:
        userInput = input("Enter the number you want to test")
        try:
            if (userInput <= 0):
                print ("Please enter a valid number")
        except ValueError:
                print("Please enter a valid number")
        else:
            return userInput
            break

def getInput2():
    while True:
        userInput2 = input("Choose your options\n 1 - double \n 2 - square \n 3 - cube")
        try:
            if (userInput2 <= 0):
                print ("Please enter a valid number")
        except ValueError:
                print("Please enter a valid number")
        else:
            return userInput2
            break

userInputNum = getInput();
userInputOption = getInput2();

def doTwice(func,x):

    if func(x== 1):
        return double(double(userInputNum))
    elif func(x== 2):
        return square(square(userInputNum))
    elif func(x== 3):
        return cube(cube(userInputNum))
    else:
        print ("Please enter only 1,2 or 3")

print doTwice(double,userInputOption)
print doTwice(square,userInputOption)
print doTwice(cube,userInputOption)
给出

输出(假设我的输入选项为1,并且要计算的数字I键为4):

16
16
16

输出我想要(假设我的输入选项为1,并且要计算的数字I键为4):

16
256
262144

2 个答案:

答案 0 :(得分:3)

以下是通话时发生的情况:doTwice(double, 4)

if double(4 == 1): 
   print "bla"

Python将评估4 == 1表达式,找到True值并将其传递给double()True * 2仍为True,因此第一行将始终进行评估,除非您输入1(我认为)。

您可能想要的代码更像是这样:

def doTwice(func,userInputNum):  
   return func(func(userInputNum)

def selectFunction(userChoice, userInputNum): 
    if userChoice == 1: 
       return doTwice(double, userInputNum)
    if userChoice == 2: 
       return doTwice(square, userInputNum)
    if userChoice == 3: 
       return doTwice(cube, userInputNum)
    else:
       print("Please enter only 1,2 or 3")

userInputNum = getInput()
userInputOption = getInput2()


print selectFunction(userInputOption)

答案 1 :(得分:0)

这是因为doTwice始终根据userInputOption选择功能。你可能想要的是:

def doTwice(func, x):
    return func(func(x))

如果您想使用userInputOption,您可以使用它,但您应该将其作为参数提供:

def doTwice(option, x):
    if option == 1:
        func = double
    elif option == 2:
        func = square
    elif option == 3:
        func = cube
    else:
        print("Bad option:{0}".format(option))
        return
    print("{0}".format(func(x)))

或者您可以使用dict

def doTwice(option, x):
    try:
        func = { 
           1 : double,
           2 : square,
           3 : cube,
        }[option]
        print("{0}".format(func(x)))
    except KeyError:
        print("Invalid option: {0}".format(option))