我想做一个高阶函数。代码没问题。 但我不太清楚它为什么输出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
答案 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))