попробуйте / кроме проблемы в Python - PullRequest
0 голосов
/ 30 мая 2020

Я запустил следующий код в качестве практической цели из одной из книг Python, и мне нужен результат, как показано в URL-адресе, приведенном ниже. Итак, когда я запускаю первое действие в вопросе (из книги - показано на фотографии), чтобы проверить, правильно ли он это сделал, оно работает, но когда он запустил второе действие, оно работает неправильно. В идеале я должен напечатать оператор except, если я ввожу какую-либо строку в ввод, запрашиваемый первым пользователем, но меня просят ввести ввод, запрашиваемый вторым пользователем, то есть скорость. Почему это так? А также, пожалуйста, скажите, желательно ли помещать полный код в раздел try или в идеале мы должны помещать только часть в оператор try, для которого мы уверены, что это не сработает, и он перейдет в блок except?

Когда я ввожу "сорок", мне не выдается сообщение об ошибке, которое есть в книге, что означает, что в код могут быть внесены некоторые изменения. Тем не менее, он работает нормально, когда я включаю все строки кода в try, а не только 2 строки, которые в настоящее время существуют, то есть (fh = float (sh) и fr = float (sr)). Как я могу исправить существующий написанный код, просто написав два оператора в пробной части?

Мы будем благодарны за вашу помощь.

Проблема: введите Часы: 40Ошибка, введите число c ввод

Изображение требуемого вывода приведено ниже: enter image description here

Далее это код:

sh = input("Enter hours:")
sr = input("Enter Rate:")
try:
    fh = float(sh)
    fr = float(sr)
except:
    print('Error, please enter numeric input')
    quit()
print(fh, fr)
if fh > 40:
    reg = fr  * fh
    otp = (fh - 40.0) * (fr * 0.5)
    xp = reg + otp
else:
    xp = fh * fr
print("Pay:",xp)

Ответы [ 6 ]

1 голос
/ 30 мая 2020

Я думаю, что самый простой способ - это:

while True:  #open a while loop
        try:  #ask your questions here
            sh = input("Enter hours:")
            fh = float(sh)
            sr = input("Enter Rate:")
            fr = float(sr)
        except ValueError:  #if a string is in input instead of a float do this
            print("input is not numeric")
        else:  # if user did all right do this and end the while loop
            print(fh, fr)
            if fh > 40:
                reg = fr  * fh
                otp = (fh - 40.0) * (fr * 0.5)
                xp = reg + otp
            else:
                xp = fh * fr
            print("Pay:",xp)
            break

редактировать:

def check_for_float(question):
    #define a function to check if it's float
    while True:
        #open a while loop
            try:
                #ask your questions here
                value = float(input(question))
                #return value
                return value
            except ValueError:
                #if a string is in input instead of a float give second chance
                print("input is not numeric, try again:")




#execute function and give argument question
#returned value will be your variable
fr = check_for_float("Enter Rate:")           
fh = check_for_float("Enter hours:")

#do your stuff with the returned variables
print(fh, fr)
if fh > 40:
    reg = fr  * fh
    otp = (fh - 40.0) * (fr * 0.5)
    xp = reg + otp
else:
    xp = fh * fr
print("Pay:",xp)

все в одном:

def calculate_userinput ():
    ## function in function
    #this means the function check_for_float isn't available outside of calculate
    def check_for_float(question):
        #define a function to check if it's float
        while True:
            #open a while loop
                try:
                    #ask your questions here
                    value = float(input(question))
                    #return value
                    return value
                except ValueError:
                    #if a string is in input instead of a float give second chance
                    print("input is not numeric, try again:")
    #execute function and give argument question
    #returned value will be your variable
    fr = check_for_float("Enter Rate:")           
    fh = check_for_float("Enter hours:")
    #do your stuff with the returned values
    print(fh, fr)
    if fh > 40:
        reg = fr  * fh
        otp = (fh - 40.0) * (fr * 0.5)
        xp = reg + otp
    else:
        xp = fh * fr
    print("Pay:",xp)

calculate_userinput()

функции для использования разных вещей

def check_for_float(question):
    #define a function to check if it's float
    while True:
        #open a while loop
            try:
                #ask your questions here
                value = float(input(question))
                #return value
                return value
            except ValueError:
                #if a string is in input instead of a float give second chance
                print("input is not numeric, try again:")

def calculate():
    fr = check_for_float("Enter Rate:")           
    fh = check_for_float("Enter hours:")
    print(fh, fr)
    if fh > 40:
        reg = fr  * fh
        otp = (fh - 40.0) * (fr * 0.5)
        xp = reg + otp
    else:
        xp = fh * fr
    print("Pay:",xp)
calculate()

программирование похоже на инженерию, сначала вам нужно знать, что вы хотите создать, а затем как вы этого добьетесь в лучшем виде путь. Какую структуру вы хотите, есть ли подсистемы, что им нужно делать, наблюдать за ними и т. Д.

1 голос
/ 30 мая 2020

В идеале вы помещаете как можно меньше кода в try -блок и стараетесь не повторять код, это упрощает отладку / поиск ошибок в программах.
Более pythoni c версия «допрос» будет выглядеть так:

# define a dictionary to save the user input
userInput = {
    'hours': None,
    'rate': None
}

# The input lines are identical so you can just 'exchange' the question.
# Dynamically ask for user input and quit immedialy in case of non-float
for question in userInput.keys():
    try:
        userInput[question] = float(input(f"Enter {question}:"))
    except:
        print('Error, please enter numeric input')
        quit()

# continue with the original code
fh, fr = userInput['hours'], userInput['rate']
if fh > 40:
    reg = fr  * fh
    otp = (fh - 40.0) * (fr * 0.5)
    xp = reg + otp
else:
    xp = fh * fr
print("Pay:", xp)
0 голосов
/ 30 мая 2020

Проблема с вашим кодом заключается в том, что вы сначала берете обе переменные sh и sr в качестве входных. Таким образом, даже если вы не введете числовое значение c, оно не выдаст ошибку, потому что переменные sh и sr не заботятся о том, числовое это значение c или нет. После получения обоих значений выполняется блок try.

Итак, если вы хотите получать сообщение об ошибке, как только пользователь вводит любой алфавитный c ввод, выполните следующие изменения код. Вы можете прокомментировать любые сомнения. Также отметьте ответ, если он правильный.

try:
    fh = float(input('Enter hours:'))
    fr = float(input('Enter Rate:'))
except:
    print('Error, please enter numeric input')
    quit()
print(fh, fr)
if fh > 40:
    reg = fr  * fh
    otp = (fh - 40.0) * (fr * 0.5)
    xp = reg + otp
else:
    xp = fh * fr
print("Pay:",xp)

Результат для тестового примера forty будет

Enter hours:Forty
Error, please enter numeric input
0 голосов
/ 30 мая 2020

Эта программа python не может преобразовать строку в число, поэтому выдает ошибку. Итак, yoy следует использовать numeri c вместо строки

0 голосов
/ 30 мая 2020

Вы должны поставить проверку, является ли введенный ввод числом после каждого оператора ввода.

try:
    sh = input("Enter hours:")
    fh = float(sh)
    sr = input("Enter Rate:")
    fr = float(sr)
except:
    print('Error, please enter numeric input')

В вашем примере вы получаете оба ввода, а затем проверяете их оба. Что касается вашего вопроса, то я лично предпочел бы поместить в оператор try только код, который выдает ошибку, как это сделали вы.

0 голосов
/ 30 мая 2020

Обновленный ответ:

import sys
sh = input("Enter hours:")
try:
    fh = float(sh)
except:
    print(f"{sh} is not numeric")
    sys.exit(0)
sr = input("Enter Rate:")
try:
    fr = float(sr)
except:
    print(f"{sr} is not numeric")
    sys.exit(0)

вывод jupyter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...