2016-06-07 3 views
2

У меня есть эта функция ниже, что я где-то сделал что-то неправильно.Зацикливание функции

def quantityFunction(product): 
    valid = False 
    while True: 
     if product is not None: 
      quantity = input("Please enter the amount of this item you would like to purchase: ") 
      for i in quantity: 
       try: 
        int(i) 
        return int(quantity) 
        valid = True 
       except ValueError: 
        print("We didn't recognise that number. Please try again.") 
        #If I get here, I want to loop back to the start of this function 
        return True 

     return False 

пробежать, функция вызывается из основной части программы, как так: quantity = quantityFunction(product)

Возвращение Ложные в нижней части кода, чтобы сделать с тем, если продукт не является None, который необходимо после некоторого количества кода в другой функции, но пришлось использовать эту функцию.

Если пользователь вводит количество, это число, все работает нормально. Если это что-то еще, выводится сообщение об ошибке Value, и вы можете ввести другой вход. Если вы введете другое письмо и т. Д., Оно повторится снова, если вы введете номер, он примет его.

Однако он не возвращает номер, введенный после букв. Он просто возвращает 0.

Я подозреваю, что это связано с тем, как я повторяю код, то есть код должен возвращаться к началу функции, если он попадает в значение Ошибка.

Любые идеи?

+0

У вас есть оператор возврата за исключением блока. Просто распечатайте сообщение об ошибке, и оно должно работать нормально. – SilentMonk

+2

Почему вы определяете 'valid'? Он никогда не использовался. Почему цикл for? Почему бы не попробовать сразу преобразовать количество в int? – Ben

+0

Теперь я взял возврат из блока except, функция не работает, как я могу сделать так? @SilentMonk –

ответ

3

Вы сказали:

код должен зациклить начало функции, если она попадает в ОШИБКИ.

Тогда вы не должны использовать return заявления, в противном случае функция прекращается, возвращая True или False.

+0

Хорошо, я взял возвращение из за исключением блока. Теперь функция не работает, как я могу ее сделать? @heltonbiker –

+0

Я исправил ответ, у вас было два возвращения, одно для исключения, другое для регулярного потока. Удалить оба – heltonbiker

+0

Я думаю, что у вас было ложное представление о 'return' и looping. Каково ваше намерение с возвратом 'True' и' False'? – heltonbiker

1

Вы должны попробовать это ..

def quantityFunction(product): 
    valid = False 
    while True: 
     if product is not None: 
      quantity = raw_input("Please enter the amount of this item you would like to purchase: ") 

      if quantity.isdigit(): 
      return int(quantity) 
      valid = True 
      else: 
      print("We didn't recognise that number. Please try again.") 
      continue 

     return False 

quantity = quantityFunction("myproduct") 
3

Несколько вопрос:

1) return оператор возвращает управление вызывающей функции.

2) Вы перебираете вход, что неправильно.

3) valid=True не выполнен вообще.

def quantityFunction(product): 
    valid = False 
    while True: 
     if product is not None: 
      quantity = raw_input("Please enter the amount of this item you would like to purchase: ") 
      try: 
        return int(quantity) 
        #valid = True (since it is never run) 
      except ValueError: 
        print("We didn't recognise that number. Please try again.") 
        #If I get here, I want to loop back to the start of this function 
        #return True 
     return False 

quantityFunction("val") 

Примечание: Используйте raw_input() в случае Python 2.7 и input() в случае 3.x

1

Во-первых, давайте обратимся код. Проще говоря, вам нужна функция, которая будет зацикливаться до тех пор, пока пользователь не введет юридическое количество.

продукт не очень подходит для функции; проверьте его в вызывающей программе, а не здесь. Пусть функция имеет одну цель: введите действительное количество.

Давайте работать оттуда в стандартном рецепте для «петли до хорошего ввода». Очень просто, это выглядит так:

Get first input 
Until input is valid 
... print warning message and get a new value. 

В коде это выглядит так.

def get_quantity(): 
    quantity_str = input("Please enter the amount of this item you would like to purchase: ") 

    while not quantity_str.isdigit(): 
     print("We didn't recognise that number. Please try again.") 
     quantity_str = input("Please enter the amount of this item you would like to purchase: ") 

    return quantity 

Что касается кодирования практики ...

Разработка пошагово: написать несколько строк кода, чтобы добавить один функцию к тому, что у вас есть. Отлаживайте это. Получите его, прежде чем добавлять больше.

Узнайте свои особенности языка. В коде, который вы опубликовали, вы неправильно используете для, в, return и вызов функции.

Посмотрите, как решить простые проблемы. try/except - более сложная концепция для обработки, чем просто isdigit.

1

Попробуйте это (некоторые форматирование тоже включены, но функциональность должна быть одинаковой):

def determine_quantity(product): # descriptive function name 
    if not product: # avoiding nesting 
     return False 
    while True: 
     quantity = input("Please enter the amount of this item you would like to purchase: ") 
     try: 
      return int(quantity) # try to convert quantity straight away 
     except ValueError: 
      print("We didn't recognise that number. Please try again.") 
      # nothing here means we simply continue in the while loop 

В идеале, вы бы взять продукт из. Функция должна делать как можно меньше, и эта проверка лучше в другом месте.

def determine_quantity(): 
    while True: 
     quantity = input("Please enter the amount of this item you would like to purchase: ") 
     try: 
      return int(quantity) 
     except ValueError: 
      print("We didn't recognise that number. Please try again.") 
Смежные вопросы