0

在学校,我们必须编写一个程序来使用毕达哥拉斯理论。我用 python 3 编写它,但是当我返回 cber 时,程序就结束了。另一方面,bber 工作正常。有人可以帮忙吗?已经谢谢了:)

编辑:感谢您帮助我,这不是函数 kiezen 的所有内容,用户可以选择两个数字,而 j 和 n 将决定它们在三角形中的哪些线,这也在函数 kiezen 中。这一切都在一个名为 cijfers 的函数中,我不知道这是否会有所不同。我使用 return 是因为如果他/她输入了无效的内容,我可以让用户再次选择数字。而且我忘记在发布之前删除 cber 中的 ifs。我会尽快改进我的程序。感谢您的所有反馈:)

 def bber():
   if (c >= a):
     print(str(a) + "^2 + b^2 = " + str(c) + "^2")
     print("b^2 = " + str(c) + "^2 - " + str(a) + "^2")
     print("b = V(" + str(c**2) + " - " + str(a**2) + ")")
     print("b = V" + str((c**2) - (a**2)) + " = " + str(math.sqrt((c**2) - (a**2))))
   if (a >= c):
     print("De rechthoekzijde kan niet langer zijn dan de schuine zijde.")
     cijfers()
 def cber():
   if (a >= b):
     print(str(a) + "^2 + " + str(b) + "^2 = c^2")
     print("c^2 = " + str(a) + "^2 + " + str(b) + "^2")
     print("c = V(" + str(a**2) + " + " + str(b**2) + ")")
     print("c = V" + str((a**2) + (b**2)) + " = " + str(math.sqrt((a**2) + (b**2))))
   if (b >= a):
     print(str(a) + "^2 + " + str(b) + "^2 = c^2")
     print("c^2 = " + str(a) + "^2 + " + str(b) + "^2")
     print("c = V(" + str(a**2) + " + " + str(b**2) + ")")
     print("c = V" + str((a**2) + (b**2)) + " = " + str(math.sqrt((a**2) + (b**2))))

 def kiezen():
   x = int(input("Wat is de lengte van de eerste zijde?"))
   xz = input("Is deze zijde een rechthoekzijde (J/N)?")

   print(" ")

   y = int(input("Wat is de lengte van de tweede zijde?"))
   yz = input("Is deze zijde een schuine zijde (J/N)?")

   print(" ")

 return kiezen()

 if xz == "j" or "J":
   if yz == "n" or "N":
      b = y
      a = x
      return cber()
   if yz == "j" or "J":
     c = y
     a = x
     return bber()
4

1 回答 1

0

有一些问题正在发生。

  1. 您需要导入模块

在您的代码中,您正在使用math.sqrt,因此所需的第一行是math在文件开头实际导入模块:

import math
  1. 您无法访问函数内的变量。要将它们传递给您的函数,您必须将它们指定为函数参数:

    定义 bber(a, c):

从积极的方面来说,你的函数bber在你的 statement 中报告了正确的答案if (c >= a)。但是,下面的条件语句if (a >= c)调用函数cijfers(),该函数实际上并不存在。在这种情况下,每次a大于或等于c时,程序都会打印 a NameError

  1. 该函数cber有效,但您实际上不需要if语句,因为无论b大于a还是a大于b ,您都会得到变量c。不过,您可能需要考虑检查其他类型的输入(如文本、负数、浮点数等)。

以下是简化cber函数的方法,还必须传入实际参数:

def cber(a, b):
        print(str(a) + "^2 + " + str(b) + "^2 = c^2")
        print("c^2 = " + str(a) + "^2 + " + str(b) + "^2")
        print("c = V(" + str(a**2) + " + " + str(b**2) + ")")
        print("c = V" + str((a**2) + (b**2)) + " = " + str(math.sqrt((a**2) + (b**2))))
  1. 该函数kiezen实际上并没有在您的代码中做任何事情。它已定义,但显然您不会在任何地方使用它。

  2. 函数内部定义的变量是该函数的局部变量,而函数外部定义的变量(即没有缩进)是全局变量。当您需要在函数内部使用全局变量时,您必须将其作为函数参数传递。有关此主题的更多信息,您可以阅读“范围”、“全局范围”和“本地范围”的概念。您还可以在此处的官方 Python 文档中找到示例。

现在,您可以看到如何使用全局定义的变量,我将使用您的不完整kiezen函数而不实际将其变为函数,因此代码直接在您的程序中执行。

  1. 这里的另一个问题是您return只能在函数内部使用关键字,因为这就是它的含义:返回函数的结果。

这意味着您必须更改代码return cber()return bber()删除return关键字。

  1. 您在问题末尾缺少一个空格input。当您键入答案时,它会出现在字符串中最后一个字符的旁边。

  2. 当您想要检查多个选项时(就像您对 所做的那样XZ == "j" or "J"),您可以使用一个列表和关键字in

以下是使您的程序最终运行所需的一些修改。注释出现在带有#符号的行上。

# To use a function provided by the math module, you have to import it first
import math


# You have to get "a" and "c" from somewhere, so you pass them as parameters
def bber(a, c):
    if (c >= a):
        print(str(a) + "^2 + b^2 = " + str(c) + "^2")
        print("b^2 = " + str(c) + "^2 - " + str(a) + "^2")
        print("b = V(" + str(c**2) + " - " + str(a**2) + ")")
        print("b = V" + str((c**2) - (a**2)) + " = " + str(math.sqrt((c**2) - (a**2))))

    if (a >= c):
        print("De rechthoekzijde kan niet langer zijn dan de schuine zijde.")


# Same scenario here: "a" and "b" must be defined somehow
# Note that the "if" statements were unnecessary
def cber(a, b):
        print(str(a) + "^2 + " + str(b) + "^2 = c^2")
        print("c^2 = " + str(a) + "^2 + " + str(b) + "^2")
        print("c = V(" + str(a**2) + " + " + str(b**2) + ")")
        print("c = V" + str((a**2) + (b**2)) + " = " + str(math.sqrt((a**2) + (b**2))))

# Note that a space has been added at the end of each string
# where you use "input".
X = int(input("Wat is de lengte van de eerste zijde? "))
XZ = input("Is deze zijde een rechthoekzijde (J/N)? ")

print(" ")

Y = int(input("Wat is de lengte van de tweede zijde? "))
YZ = input("Is deze zijde een schuine zijde (J/N)? ")

print(" ")

if XZ in ["j", "J"]:
    if YZ in ["n", "N"]:
        b = Y
        a = X

        # You have to remove the word "return", this is not a function
        cber(a, b)

    if YZ in ["j", "J"]:
        c = Y
        a = X

        # You have to remove the word "return", this is not a function
        bber(a, c)

正如我之前提到的,这并不完美,因为您需要管理错误。例如,如果您输入文本而不是数字,它将不起作用,但这是另一个讨论的主题。

return此外,出于本练习的目的,如果您的目标只是打印输出,您实际上并不“需要”在函数中使用关键字,但请记住,如果您需要重用函数的结果,您将不得不为它返回一个值。

该概念的一个简单示例如下:

def my_function():
    return 12

# my_variable will have a value of 12
my_variable = my_function()
于 2018-12-20T21:46:34.343 回答