Пока l oop не остановится - PullRequest
1 голос
/ 14 января 2020

Я немного новичок в python или кодировании в целом, и у меня возникла проблема с while-l oop. Я хочу отметить, что while-l oop работает только тогда, когда переменная "l oop" = True

loop = True #Makes the asking sequence work


def loop_again(): #Makes the program ask if you want to continue
    loop_again = str(input("Do you want to do this again? Yes or No: "))
    if loop_again == "Yes":
        loop = True
    elif loop_again == "No":
        loop = False
    else:
        print("Please answer yes or no: ")
        loop_again

Когда я пишу "Нет", когда программа спрашивает меня, хочу ли я сделайте это снова, он все еще зацикливает последовательность, даже если переменная "l oop" считается ложной, когда я набираю "Нет", что должно остановить l oop.

Полный код (пока l oop внизу кода):

#Solving for the area in a shape automatically

import math

loop = True #Makes the asking sequence work


def loop_again(): #Makes the program ask if you want to continue
    loop_again = str(input("Do you want to do this again? Yes or No: "))
    if loop_again == "Yes":
        loop = True
    elif loop_again == "No":
        loop = False
    else:
        print("Please answer yes or no: ")
        loop_again



def sqr_area(): #Asking sequence for the area of the square
    if choose == "Square":
        a = float(input("Input the length of the side here: "))
        print(a ** 2)
        loop_again()

def rec_area(): #Asking sequence for the area of the rectangle
    if choose == "Rectangle":
        a = float(input("Input the length of the long sides here: "))
        b = float(input("Input the length of the short sides here: "))
        print(a * b)
        loop_again()

def tri_area(): #Asking sequence for the area of the triangle
    a = float(input("Input the length of the side: "))
    b = float(input("Input the length of the height: "))
    print((a * b) / 2)
    loop_again()

def cir_area(): #Asking sequence for the area of the circle
    r = float(input("Length of the radius: "))
    print((r ** 2) * math.pi)
    loop_again()

while loop == True: #While loop, asking sequence
    choose = str(input("Input what shape that you want to figure out the area of here: "))
    if choose == "Square":
        sqr_area()
    elif choose == "Rectangle":
        rec_area()
    elif choose == "Triangle":
        tri_area()
    elif choose == "Circle":
        cir_area()
    else:
        print("Invalid shape, Input one of these shapes: Square, Rectangle, Triangle, Circle")
        choose

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Не используйте рекурсию, когда вы должны использовать al oop, а loop_again должен вернуть значение вместо глобальной настройки loop.

import math


# Returns true once the input is Yes or false once the input is No
def loop_again():
    while True:
        response = str(input("Do you want to do this again? Yes or No: "))
        if response == "Yes":
            return True
        elif response == "No":
            return False
        else:
            print("Please answer yes or no: ")

loop_again следует вызывать после , соответствующая функция *_area вернулась, а не внутри каждой функции. Функции не должны знать или заботиться о значении choose; они вызываются только тогда, когда они предназначены для вызова.

# Print the area of a square
def sqr_area():
    a = float(input("Input the length of the side here: "))
    print(a ** 2)


# Print the area of a rectangle
def rec_area():
    a = float(input("Input the length of the long sides here: "))
    b = float(input("Input the length of the short sides here: "))
    print(a * b)


# Print the area of a triangle
def tri_area():
    a = float(input("Input the length of the side: "))
    b = float(input("Input the length of the height: "))
    print((a * b) / 2)


# Print the area of a circle
def cir_area():
    r = float(input("Length of the radius: "))
    print((r ** 2) * math.pi)

Финальный l oop может работать бесконечно, пока loop_again не вернет True.

# Loop until the user chooses to not run again
while True:
    choose = input("Input what shape that you want to figure out the area of here: ")
    if choose == "Square":
        sqr_area()
    elif choose == "Rectangle":
        rec_area()
    elif choose == "Triangle":
        tri_area()
    elif choose == "Circle":
        cir_area()
    else:
        print("Invalid shape, Input one of these shapes: Square, Rectangle, Triangle, Circle")
        continue

    if loop_again():
        break
1 голос
/ 14 января 2020

В функции loop_again() вы должны добавить это в начале:

global loop

В противном случае переменная считается local и не будет влиять на other loop переменная, которая находится во внешней области видимости.

0 голосов
/ 14 января 2020

Это проблема переменной контекста. Переменная loop, имеющаяся в loop_again(), и переменная внутри l oop - разные. Каждая переменная внутри функции в python является локальной переменной, если только она не является аргументом или если вы используете global variable в основном и внутри функций.

Так что сделайте его глобальным или передайте и верните внутри функций

#Solving for the area in a shape automatically

import math
global loop 
loop = True #Makes the asking sequence work


def loop_again(): #Makes the program ask if you want to continue
    global loop 
    loop_again = str(input("Do you want to do this again? Yes or No: "))
    if loop_again == "Yes":
        loop = True
    elif loop_again == "No":
        loop = False
    else:
        print("Please answer yes or no: ")
        loop_again



def sqr_area(): #Asking sequence for the area of the square
    if choose == "Square":
        a = float(input("Input the length of the side here: "))
        print(a ** 2)
        loop_again()

def rec_area(): #Asking sequence for the area of the rectangle
    if choose == "Rectangle":
        a = float(input("Input the length of the long sides here: "))
        b = float(input("Input the length of the short sides here: "))
        print(a * b)
        loop_again()

def tri_area(): #Asking sequence for the area of the triangle
    a = float(input("Input the length of the side: "))
    b = float(input("Input the length of the height: "))
    print((a * b) / 2)
    loop_again()

def cir_area(): #Asking sequence for the area of the circle
    r = float(input("Length of the radius: "))
    print((r ** 2) * math.pi)
    loop_again()

while loop == True: #While loop, asking sequence
    global loop 
    choose = str(input("Input what shape that you want to figure out the area of here: "))
    if choose == "Square":
        sqr_area()
    elif choose == "Rectangle":
        rec_area()
    elif choose == "Triangle":
        tri_area()
    elif choose == "Circle":
        cir_area()
    else:
        print("Invalid shape, Input one of these shapes: Square, Rectangle, Triangle, Circle")
        choose

в каждой функции нужно сказать, что l oop является глобальной, в противном случае python вы интерпретируете ее как локальную переменную.

другая путь это:

import math
loop = True #Makes the asking sequence work


def loop_again(loop ): #Makes the program ask if you want to continue
    loop_again = str(input("Do you want to do this again? Yes or No: "))
    if loop_again == "Yes":
        loop = True
    elif loop_again == "No":
        loop = False
    else:
        print("Please answer yes or no: ")
        loop_again
    return loop



def sqr_area(loop): #Asking sequence for the area of the square
    if choose == "Square":
        a = float(input("Input the length of the side here: "))
        print(a ** 2)
        loop = loop_again()
    return loop

def rec_area(loop): #Asking sequence for the area of the rectangle
    if choose == "Rectangle":
        a = float(input("Input the length of the long sides here: "))
        b = float(input("Input the length of the short sides here: "))
        print(a * b)
        loop = loop_again(loop)
    return loop


def tri_area(loop): #Asking sequence for the area of the triangle
    a = float(input("Input the length of the side: "))
    b = float(input("Input the length of the height: "))
    print((a * b) / 2)
    loop = loop_again()

def cir_area(loop): #Asking sequence for the area of the circle
    r = float(input("Length of the radius: "))
    print((r ** 2) * math.pi)
    loop = loop_again()

while loop == True: #While loop, asking sequence
    choose = str(input("Input what shape that you want to figure out the area of here: "))
    if choose == "Square":
        loop = sqr_area(loop )
    elif choose == "Rectangle":
        loop = rec_area(loop )
    elif choose == "Triangle":
        loop = tri_area(loop )
    elif choose == "Circle":
        loop = cir_area(loop )
    else:
        print("Invalid shape, Input one of these shapes: Square, Rectangle, Triangle, Circle")
        choose```
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...