Функция не отображается, когда ее предполагается
В школе мы должны написать программу, чтобы использовать теорию Пифагора. Я пишу это на Python 3, но когда я возвращаюсь cber, программа просто заканчивается. bber с другой стороны работает нормально. Может кто-нибудь, пожалуйста, помогите? Спасибо уже:)
Редактировать: Спасибо за помощь, это не все с функцией kiezen, пользователь может выбрать два числа, и j и n должны решить, какие линии они находятся в треугольнике, то есть в функции kiezen тоже. Это все в одной функции под названием Cijfers, я не знаю, если это имеет значение. Я использовал return, потому что таким образом я мог позволить пользователю снова выбирать числа, если он вводил что-то недопустимое. И я забыл удалить ifs в cber перед публикацией. Я постараюсь улучшить свою программу в ближайшее время. Спасибо за все ваши отзывы:)
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()
1 ответ
Есть несколько проблем.
- Вам необходимо импортировать модули.
В вашем коде вы используете math.sqrt
поэтому первая строка, необходимая для фактического импорта math
Модуль в начале вашего файла:
import math
Вы не получаете доступ к своим переменным внутри ваших функций. Чтобы передать их в вашу функцию, вы должны указать их как параметры функции:
def bber (a, c):
С положительной стороны, ваша функция bber
сообщает правильный ответ внутри вашего заявления if (c >= a)
, Тем не менее, следующее условное утверждение, if (a >= c)
вызывает функцию cijfers()
, который на самом деле не существует. В этом случае, каждый раз, когда а больше или равно с, программа выведет NameError
,
- Функция
cber
работает, но на самом деле вам не нужно иметьif
заявления, потому что вы получите переменную c независимо от того, если b больше, чем а или если а больше, чем b. Вы можете рассмотреть возможность проверки других типов ввода (таких как текст, отрицательные числа, числа с плавающей точкой и т. Д.).
Вот как вы могли бы упростить 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))))
Функция
kiezen
на самом деле ничего не делает в вашем коде. Это определено, но вы нигде не используете его, по-видимому.Переменные, определенные внутри функций, являются локальными для этой функции, в то время как переменные, определенные вне функции (то есть без отступа), являются глобальными переменными. Когда вам нужно использовать глобальную переменную внутри функции, вы должны передать ее в качестве параметра функции. Для получения дополнительной информации по этой теме вы можете прочитать о понятиях "область", "глобальная область" и "локальная область". Вы также можете найти примеры в официальной документации Python, здесь.
На данный момент, чтобы вы могли видеть, как использовать переменные, которые определены глобально, я буду использовать ваши неполные kiezen
функция, фактически не превращая ее в функцию, поэтому код выполняется непосредственно в вашей программе.
- Еще одна проблема заключается в том, что вы можете использовать ключевое слово
return
только внутри функции, потому что это то, для чего она предназначена: возвращать результат функции.
Это означает, что вы должны изменить свой код return cber()
а также return bber()
удалив ключевое слово return.
Вам не хватает места в конце ваших вопросов с
input
, Когда вы наберете свой ответ, он появится рядом с последним символом в вашей строке.Когда вы хотите проверить несколько вариантов (как вы сделали с
XZ == "j" or "J"
), вы можете использовать список и ключевое слово в.
Вот некоторые изменения, необходимые для того, чтобы ваша программа работала в конце. Комментарии присутствуют в строках с символом #.
# 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()