基本功能帮助 - Python

时间:2013-10-17 17:12:13

标签: python function return

我对Python很陌生,我正忙着弄清楚这些讨厌的功能是如何工作的......我正在制作的程序应该是在三角形的区域内工作,但我可以'实际上是让它将局部变量返回给其他函数。任何帮助将不胜感激!

# Area of a triangle

base = 0
height = 0
area = 0

def inData():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base
    return height

def triangle(b,h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    inData()
    triangle(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area

3 个答案:

答案 0 :(得分:3)

执行return时,函数立即结束,返回值。因此,您的inData函数只会返回基数,而不是高度。此外,您似乎要求用户输入两次基数和高度 - 这是不必要的,因为您的inData函数已经这样做了

相反,你想通过做这样的事情同时返回两个值。 (注意 - 为了清楚起见,我重命名了一些功能)

# Area of a triangle

def get_user_input():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base, height

def triangle_area(b, h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    base, height = get_user_input()
    area = triangle_area(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area

答案 1 :(得分:3)

我在你的代码中看到了许多问题和误解;让我看看我是否可以从头开始并尝试传达正确的方法来为您完成这些功能。最后,我们将为您的代码提供一个可用的版本。 :)

注意:您不必在Python中提前声明函数 - 它本身就是这样做的!因此,顶部不需要base, height, area

功能

函数简而言之就是在bundle中运行的命令集。你知道这个。你错过的是参数和参数的概念 return vs print

参数与参数 当您定义一个功能时,您将在未来设置您希望它执行的操作以及您的通话和呼叫。就像数学中的任何函数f(x)一样,您需要一个方程式,它可以与您提供的任何输入一起使用。对于f(x)x是您的输入。

在编程中,这被称为参数。所以当你用Python写作时:

def Function(x):
    y = x*x
    return y

您已将x定义为参数。现在,Arguments是你放入函数的值,参数在哪里。在代数中,适用的想法是定义变量。知道这一点,当你真正使用该功能时:

Function(2)

你会回来4,因为你说run Function(x) where x = 2

这是 Arguments vs Parameters 的概念。这非常有用,因为您并不总是想要求用户在函数中输入。你的功能越直接,它就越少。例如,有时您希望使用相同的函数在后台进行数学运算。如果您希望该流程在后台自行运行,那么您就可以拥有raw_input(),是吗?

这是 Arguments vs Parameters 的真实值。

返回与打印

与未使用raw_input()相同,因为它过于直接,您希望避免使用print并使用return。我知道你在这里没有使用print,但是你误解了return的运作方式,我认为同样的教训适用。

这是一个例子:你有两个功能。

def Function1(x,y):
    z = x*y
    print z

def Function2(x,y):
    z = x*y
    return z

功能1 打印 z,这意味着无论您想要它做什么,它总是print z到控制台,即使您只想要它做数学。

同时,功能2 returns z,意味着它将z的值交给程序调用。值得注意的是,只要函数命中行return,它就会停止进一步运行该函数。除此之外没有理由进行编码,因为该函数不再运行,除非您有一个跳过return的更高级代码(例如,if语句)。

为什么return在概念上如此重要?

因为在原始代码中,您运行了inData()函数,之后,您不仅运行return两次,而且在if声明中,您不会甚至使用inData返回的内容,您只需告诉程序运行 inData()

当函数返回一个值时,你必须将它赋值给某个东西。例如,任何随机编程语言中的简单数学。代码:

 x = sqrt(4)
 print x

将输出2,因为在函数sqrt()的末尾,它会返回其答案。在此,我们将x指定为sqrt(4)提供return的变量。确实如此:

 sqrt(4)

还会将2打印到控制台,这是因为语言开发人员的傻瓜式打样,实际上语言假定您希望打印代码。你并没有告诉它这样做。

所以,当你运行代码行时:

inData()
triangle(base, height)

你基本上是在说:

run the function inData()
run the function triangle(base, height)

由于他们returns,你需要说:

set <variable1> equal to the return of inData()
set <variable2> equal to the return of triangle(base,height)

(这里有更多的简化,但我们马上就会接近它。)

return上的最后一件事。在编程中,编写它是没用的:

x = 1+1
return x

return 1+1完成同样的事情时。因此,无需定义三角形的area然后 return area。只需告诉函数return它计算area的代码行是什么!

我失去了你吗?还在我这儿?好!

简化您的代码

你的代码有一些结构性问题,虽然它可能会起作用,但会让那些看得太多的经验丰富的程序员感到困惑。虽然我们在这里,但为什么我们不知道我能不能理解为什么会有更好的做法。

在您的代码中,您已经(以摘要形式)编写了

variables defined that you don't need
def FunctionThatGathersData()
def FunctionThatDoesTheMath(x,y)
if (condition)
     FunctionThatGathersData()
     FunctionThatDoesTheMath(x,y)
     print out the results

这种结构会使具有更多经验的程序员感到困惑。他可能会问以下问题:

  • 什么?
  • 你为什么这样回事?
  • 为什么要定义变量?
  • 为什么不组合FunctionThatGathersDataFunctionThatDoesTheMath

上面已经解释了其中一些原因,但让我们回到最后两个问题。

为什么定义变量?:一方面,Python在执行期间处理变量。所以你永远不必提前定义它们,但你可以,其优点如下:

x = 0
def Function()
    x = 5
    y = 10

查看此代码,您可能想知道为什么定义了x。简单的答案是,Python会看到,你已经有一个x,因此,当您运行Function(),你想要的覆盖的它与函数内的工作。另一方面,y没有先前的定义,因此将创建一个新变量。

但是,在您的功能中,我们并不需要这些,因为您的答案以最佳形式不需要依赖于x以外的功能。

为什么能&#39;吨我们只是两个功能结合起来,用我们学到的参数,参数,返回 提示:我们?可以!

以下是您现在应该能够阅读和理解的新代码片段。清除你已经阅读过的内容,看看它是否有意义。在其中,您将:

  • 定义您的函数DoTheMathAndThenGiveMeTheValueBack
  • 决定是否__name__ == '__main__'
  • 提供您的值(将它们放入变量中)
  • 将这些变量作为参数传递给函数
  • 告诉程序根据函数返回打印baseheight然后area

守则

def CalculateTriangleArea(b,h):
    return b / 2 * h

if __name__ == '__main__':
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    area = CalculateTriangleArea(base,height)
    print "The area of a triangle of base", base, "and height", height, "will be", area

如果你没有grok这个,请评论并问我更多,因为我记得我正在努力解决这个问题并知道你有什么误解。


哦!我忘了提及你如何处理多个returns

如果您需要在函数中返回多个值,则可以通过arraytuple执行此操作。这只是您存储的值列表。您可以访问arraytuple中的任何项目,最后以index的形式添加[i],其中第一项位于[0] 。例如:

def Function():
    string1 = "nobody"
    string2 = "expects"
    string3 = "the"
    string4 = "spanish"
    string5 = "inquisition"
    return string1, string2, string3, string4, string5

print Function()[0]
print Function()[1]
print Function()[2]
print Function()[3]
print Function()[4]
print Function() #prints the whole tuple!

会得到你:

nobody
expects
the
spanish
inquisition
('nobody', 'expects', 'the', 'spanish', 'inquisition')

明白了吗? :)

要在python中进行更多实际操作,请尝试this惊人的Python教程。

答案 2 :(得分:0)

您的代码存在问题:

# Area of a triangle

base = 0                   # You don't need to initialize these values. Even if you want 
height = 0                 # to make these global you can simple assign inside the if 
area = 0                   # __name__ == '__main__' condition

def inData():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base            # return immediately stops the execution of the function
    return height          # and returns the value

def triangle(b,h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    inData()              # You are not assigning the returned value to any variable
    triangle(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area

正确的程序版本:

# Area of a triangle

def inData():
    base = float(raw_input("Base:"))
    height = float(raw_input("Height:"))
    return base, height

def triangle(b,h):
    area = b / 2 * h
    return area

if __name__ == '__main__':
    base, height = inData()
    area = triangle(base, height)
    print "The area of a triangle of base", base, "and height" , height, "will be", area