2015-03-07 5 views
0

Я просмотрел код и понял, в какой строке проблема, но для жизни меня не могу понять, что изменить, чтобы получить это, чтобы получить его работать.LPHW ex 41 - Объект «NoneType» не является итерабельным

Когда я запускаю код он выдает ошибку после прохождения через первый набор вопрос/ответ (quick link to th exercise) Ошибка является:

файл ex41.py строка 73, в вопрос, ответ = преобразования (фрагмент, фразу) typeerror: объект «NoneType» не является итерируемым.

Я проверил правописание, прошел код назад и вперед, по очереди по сравнению с кодом, который я копировал, но я не могу найти ошибку, чтобы вызвать это. Я понимаю, что по какой-то причине «конвертировать», которая определена в строке 34, почему-то не возвращает никаких данных ... но я не понимаю, почему. Является ли это 0 в диапазоне по строке 41? Я понятия не имею. Я попытался исправить это сам более чем на один день ... всякая помощь была бы весьма признательна.

def convert(snippet, phrase): 
    class_names = [w.capitalize() for w in 
        random.sample(WORDS, snippet.count("%%%"))] 
    other_names = random.sample(WORDS, snippet.count("***")) 
    results = [] 
    param_names = [] 

    for i in range(0, snippet.count("@@@")): 
     param_count = random.randint(1,3) 
     param_names.append(', '.join(random.sample(WORDS, param_count))) 

     for sentence in snippet, phrase: 
      result = sentence[:] 

      #fake class names 
      for word in class_names: 
       result = result.replace("%%%", word, 1) 

      #fake other names 
      for word in other_names: 
       result = result.replace("***", word, 1) 

      #fake parameter lists 
      for word in param_names: 
       result = result.replace("@@@", word, 1) 

      results.append(result) 

     return results 


#keep going until they hit ctrl-d 
try: 
    while True: 
     snippets = PHRASES.keys() 
     random.shuffle(snippets) 

     for snippet in snippets: 
      phrase = PHRASES[snippet] 
      question, answer = convert(snippet, phrase) 
      if PHRASE_FIRST: 
       question, answer = answer, question 

      print question 
      raw_input("> ") 
      print "ANSWER: %s\n\n" % answer 
except EOFError: 
    print "\nBye" 
+0

попытаться скопировать/вставить код с сайта LPTHW в простой блокнот. Попробуйте, если это сработает. А также, используете ли вы python 2? – ThePavolC

+0

да, я использую Python 2.7 –

ответ

1

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

def convert(snippet, phrase): 

    results = [] 

    for i in range(0, snippet.count("@@@")): 

     for sentence in snippet, phrase: 

      results.append(result) 

     return results 

И из этого вы должны увидеть проблему. Вы возвращаетесь resultsвнутриfor i петля. Это означает, что даже если вы вошли в цикл (скажем, потому что snippet.count("@@@") вернули 2 или что-то еще), вы сразу же вернетесь после выполнения вычислений i==0.

И если snippet.count("@@@") равно 0, вы никогда не должны return. Если функция Python заканчивается без выполнения явного return, она обрабатывается так, как если бы вы набрали return None - это то, что вы получаете, а что нет итерабельности.

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

+0

спасибо и * FACEPALM. * Я долго и упорно смотрел на это ранее сегодня, убедившись, что я был неправильно не прописан anything..i просто полностью пропустил эту проблему. Еще раз спасибо!! :) –

+0

ладно, я посмотрел на код, который я копировал, и у него есть возвращение в том же месте, что и я. Я переместил его из цикла for i и поставил его в соответствии с отступлением def convert, он вернул «нужно больше, чем 0 значение для распаковки». Я полностью переместил его в свою собственную строку, и он сказал «return out function», поэтому .. в то время как я лучше понимаю, что происходит - код все еще не работает. –

Смежные вопросы