2012-02-28 4 views
1

Я пытаюсь написать скрипт, который принимает входные данные для ряда, а затем проверяетpython beginner: попробуйте две вещи перед исключением?

(а), что вход на самом деле это число, и (б), что число в вопросе меньше чем или равно 17.

Я пробовал различные инструкции «если» безрезультатно, и теперь я пытаюсь обернуть голову «заявлениями». Это моя лучшая попытка на сегодняшний день:

def listlength(): 
    print "How many things (up to 17) do you want in the list?" 
    global listlong 
    listlong = raw_input("> ") 
    try: 
     listlong = int(listlong) 
     listlong <= 17 
    except: 
     print "Gotta be a number less than 17, chumpy!" 
     listlength() 
    liststretcher() 

Он работает для первого элемента в попытке: если это не цифра, я должен снова запустить через функцию listlength. Но второй элемент (< = 17) полностью игнорируется.

Я также попытался

try: 
    listlong = int(listlong) and listlong <= 17 

... но это все еще дает мне только функциональную первый чек, и игнорирует второй полностью.

Я также получить тот же результат, если у меня есть две TRY заявления:

try: 
     listlong = int(listlong) 
    except: 
     print "Gotta be a number, chumpy!" 
     listlength() 
    try: 
     listlong <=17 
    except: 
     print "Gotta be less than 17!" 
     listlength() 
    liststretcher() 

Есть ли способ, чтобы попробовать: проверить две вещи, и требуют как пройти, прежде чем перейти в прошлом, за исключением? Или мне нужно сделать два разных оператора try: в одном определении, прежде чем переходить к команде liststretcher()?

В ответ на S.Lott ниже: мое намерение состояло в том, что «try: listlong < = 17» проверит, была ли переменная «listlong» короче или равна 17; если эта проверка не удалась, она переместилась бы к «except»; если он пройдет, он перейдет к liststretcher() ниже.

Чтение ответов на сегодняшний день, у меня есть около восьми вещей, чтобы следить за ...

+0

[Не используйте 'исключением:'] (http://docs.python.org/howto/doanddont.html#except) , скорее укажите конкретные исключения, которые вы хотите поймать. – delnan

+0

Что вы делали «listlong <= 17»? Пожалуйста, ** уточните ** вопрос, чтобы объяснить, что вы думаете, что делает заявление. Пожалуйста, ** укажите **, что должно делать это заявление. –

ответ

1

У вас есть большая часть ответа:

def isIntLessThanSeventeen(listlong): 
    try: 
     listlong = int(listlong) # throws exception if not an int 
     if listlong >= 17: 
      raise ValueError 
     return True 
    except: 
     return False 

print isIntLessThanSeventeen(16) # True 
print isIntLessThanSeventeen("abc") # False 
1

Вам нужно будет использовать, если заявление для проверки отношения, при необходимости, вручную создавая исключение.

0

Ну, чтобы исправить свое решение:

def listlength(): 
    print "How many things (up to 17) do you want in the list?" 
    global listlong 
    listlong = raw_input("> ") 
    try: 
     listlong = int(listlong) 
     listlong <= 17 
    except: 
     print "Gotta be a number less than 17, chumpy!" 
     listlength() 
     return 
    liststretcher() 

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

def listlength(): 
    print "How many things (up to 17) do you want in the list?" 
    global listlong 
    listlong = raw_input("> ") 
    value = None 
    while value is None or and value > 17: 
      try: 
       listlong = int(listlong) 
      except: 
       print "Gotta be a number less than 17, chumpy!" 
       value = None 
    listlong = value 
    liststretcher() 

Таким образом, функция не сам вызов и вызов для liststretcher произойдет только тогда, когда вход был действительным.

0
length = "" 
while not length.isdigit() or int(length) > 17: 
    length = raw_input("Enter the length (max 17): ") 
length = int(length) 
1

Что вам не хватает, и то, что С. Лотт пытается привести вас к, является то, что оператор listlong <= 17 не вызывает исключение. Это условное выражение, которое дает либо True, либо False, значение которого вы игнорируете.

Что вы хотите сказать, вероятно, это assert(listlong <= 17), что вызывает исключение AssertionError, если его условие False.

0

Нет причин, чтобы избежать рекурсии, это работает так:

def prompt_list_length(err=None): 
    if err: 
     print "ERROR: %s" % err 
    print "How many things (up to 17) do you want in the list?" 
    listlong = raw_input("> ") 
    try: 
     # See if the list can be converted to an integer, 
     # Python will raise an excepton of type 'ValueError' 
     # if it can't be converted. 
     listlong = int(listlong) 
    except ValueError: 
     # Couldn't be converted to an integer. 
     # Call the function recursively, include error message. 
     listlong = prompt_list_length("The value provided wasn't an integer") 
    except: 
     # Catch any exception that isn't a ValueError... shouldn't hit this. 
     # By simply telling it to 'raise', we're telling it to not handle 
     # the exception and pass it along. 
     raise 
    if listlong > 17: 
     # Again call it recursively. 
     listlong = prompt_list_length("Gotta be a number less than 17, chumpy!") 

    return listlong 

input = prompt_list_length() 
print "Final input value was: %d" % input 
Смежные вопросы