我对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
python大神给出的解决方案
我在您的代码中看到很多问题和误解;让我看看我是否可以从头开始,并尝试传达为您完成这些功能的正确方法。最后,我们将提供您的代码的有效版本。 🙂
注意:您不必在Python中提前声明函数-它本身就是这样做的!因此,不需要顶部的base, height, area!
功能
简而言之,功能是捆绑在一起运行的命令集。你知道这个。不过,您缺少的是参数和参数以及return vs 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。
这是参数与参数的概念。这非常有用,因为您并不总是希望在功能内部要求用户输入。您的功能越直接,它所能做的就越少。例如,有时您想使用相同的函数在后台进行数学运算。如果您不希望raw_input()进程在后台独立运行,可以吗?
这是“参数与参数”的真实值。
退货还是打印
与不使用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 equal to the return of inData()
set 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和height,然后根据函数的返回值打印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。
如果需要在一个函数中返回多个值,可以通过array或tuple来返回。这只是您存储的值的列表。您可以通过以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的更多动手工作,请尝试grok出色的Python教程。
Python sqlite3数据库已锁定 - python
我在Windows上使用Python 3和sqlite3。我正在开发一个使用数据库存储联系人的小型应用程序。我注意到,如果应用程序被强制关闭(通过错误或通过任务管理器结束),则会收到sqlite3错误(sqlite3.OperationalError:数据库已锁定)。我想这是因为在应用程序关闭之前,我没有正确关闭数据库连接。我已经试过了: connectio…用大写字母拆分字符串,但忽略AAA Python Regex - python
我的正则表达式:vendor = "MyNameIsJoe. I'mWorkerInAAAinc." ven = re.split(r'(?<=[a-z])[A-Z]|[A-Z](?=[a-z])', vendor) 以大写字母分割字符串,例如:'我的名字是乔。 I'mWorkerInAAAinc”变成…字符串文字中的正斜杠表现异常 - python
为什么S1和S2在撇号位置方面表现不同?S1="1/282/03/10" S2="4/107/03/10" R1="".join({"N\'" ,S1,"\'" }) R2="".join({"N\'…Python:检查新文件是否在文件夹中[重复] - python
This question already has answers here: How do I watch a file for changes? (23个答案) 3年前关闭。 我是python的新手,但是我尝试创建一个自动化过程,其中我的代码将侦听目录中的新文件条目。例如,某人可以手动将zip文件复制到一个特定的文件夹中,并且我希望我的代码能够在文件完全…子条件的python条件覆盖 - python
我试图找到一个python代码覆盖率工具,该工具可以衡量语句中是否包含子表达式:例如,我想看看下面的示例是否涵盖了condition1 / condition2 / condtion3?if condition1 or condition2 or condition3: x = true_value python大神给出的解决方案 对此的唯一合理答案是:当前…