我在您的代码中看到了许多问题和误解;让我看看我是否可以从头开始并尝试传达为您执行这些功能的正确方法。最后,我们将拥有您的代码的工作版本。:)
注意:您不必在 Python 中提前声明函数——它自己会这样做!所以不需要base, height, area
在顶部!
功能
简而言之,函数是一组在包中运行的命令。你知道这个。您错过的是参数和参数的概念以及return 与 print。
参数与参数
当你定义一个函数时,你是在设置你希望它在未来做什么,并且听从你的吩咐。就像f(x)
数学中的任何函数一样,您需要一个可以处理您提供的任何输入的方程。对于f(x)
,x
是您的输入。
在编程中,这被称为参数。因此,当您使用 Python 编写代码时:
def Function(x):
y = x*x
return y
您已定义x
为参数。现在,参数是您放入函数的值,参数所在的位置。在代数中,适用的想法是定义一个变量。知道这一点,当您实际使用该功能时:
Function(2)
你会得到 4,因为你说run Function(x) where x = 2
.
这是Arguments 与 Parameters的概念。它非常有用,因为您并不总是希望在 function中要求用户输入。你的功能越直接,它所能做的就越少。例如,有时您想使用相同的函数在后台进行数学运算。raw_input()
如果您希望该过程在后台自行运行,您就不能很好,对吗?
这是Arguments 与 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
到控制台,即使你想让它只做数学运算。
同时, Function 2 ,这意味着它在调用程序时将returns z
的值交还给程序。z
还值得注意的是,一旦函数到达 line return
,它就会停止进一步运行该函数。没有理由在此之外编写代码,因为该函数不再运行,除非您跳过了更高级的代码return
(例如,一条if
语句)。
为什么在return
概念上如此重要?
因为在您的原始代码中,您运行了函数inData()
,然后,您不仅运行return
了两次,而且在您的if
语句中,您甚至不使用inData
返回的内容,您只是告诉程序运行 inData()
。
当一个函数返回一个值时,你必须将它分配给某个东西。以任何随机编程语言中的简单数学为例。编码:
x = sqrt(4)
print x
将输出2
,因为在函数结束时sqrt()
,它会返回它的答案。在这里,我们指定了一个x
变量,它sqrt(4)
给出了一个return
to。虽然这是真的:
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
这种结构会使经验丰富的程序员感到困惑。他可能会问以下问题:
- 什么?
- 你为什么要这样退货?
- 为什么要定义变量?
- 你为什么不结合
FunctionThatGathersData
和FunctionThatDoesTheMath
?
其中一些原因已经在上面进行了阐述,但让我们回到最后两个问题。
为什么要定义变量?:一方面,Python 在执行期间处理变量。所以你永远不必提前定义它们,但你可以,这样做的好处如下:
x = 0
def Function()
x = 5
y = 10
看这段代码,你可能想知道为什么x
要定义。简单的答案是 Python 会看到你已经有了一个x
,因此,当你运行 时Function()
,你想用函数内部的工作覆盖它。y
另一方面,没有先前的定义,因此将创建一个新变量。
但是,在您的函数中,我们不需要任何这些,因为您的答案以其最佳形式不需要依赖于x
函数外部。
为什么我们不能将这两个函数结合在一起,使用我们所学到的参数、参数和返回?(提示:我们可以!)
这是您现在应该能够阅读和理解的新代码片段。暂时把你读过的东西清空一下,看看它是否有意义。在其中,您将:
- 定义你的功能
DoTheMathAndThenGiveMeTheValueBack
- 决定是否
__name__ == '__main__'
- 提供您的值(将它们放入变量中)
- 将这些变量作为参数传递给函数
- 告诉程序打印
base
andheight
然后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
如果您对此不了解,请发表评论并询问我更多信息,因为我记得为此苦苦挣扎并且知道您有什么误解。
哦!我忘了告诉你如何处理多个returns
.
如果您需要在函数中返回多个值,您可以通过 anarray
或 a来实现tuple
。这只是您存储的值的列表。您可以访问 an 中的任何项目,array
或者tuple
通过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 中的实践工作,请尝试这个惊人的 Python 教程。