2013-12-03 5 views
0

Не могли бы вы взглянуть на функцию chooseSampleKey и помочь мне понять, почему она не всегда возвращает значение? Он иногда возвращает значение, а в других случаях возвращает None, поэтому вам придется запускать его несколько раз. Проблема особенно в отрасли, которую я назвал проблемной ветвью. Мне кажется, что код всегда должен возвращать значение, но либо я ошибаюсь где-то, либо есть ошибка в Python.Почему функция не возвращает значение?

import random 

peeps = {1: [], 2: [], 3: ['A', 'B'], 4: ['C', 'D'], 5: ['E']} 

dictkeys = [1, 2, 4, 5] 

def chooseSampleKey(peeps, dictkeys): 
    if len(dictkeys) > 0: 
     sampleKey = random.sample(dictkeys, 1)[0] 
     print 'From chooseSampleKey, sampleKey = ', sampleKey 
     print "peeps in samplekey: ", len(peeps[sampleKey]) 

     if len(peeps[sampleKey]) > 0: 

      # **problem branch**: sampleKey is defined and has a value. 
      # the function comes here and prints the following statement 
      # with the value of samplekey. However, despite printing 
      # a value for sampleKey in following line, 
      # the print for the function itself prints None, i.e., no 
      # value is returned. 

      print "Returning samplekey {0}".format(sampleKey) 
      return sampleKey 

     else: 
      dictkeys.remove(sampleKey) 
      chooseSampleKey(peeps, dictkeys) 
    else: 
     return 0 


print chooseSampleKey(peepsTemp, [1, 2, 4, 5]) 

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

+4

Вы уверены, что проблема не в первом предложении 'else:', где нет инструкции 'return'? Если вы хотите рекурсию, вам нужно будет сделать 'return selectSampleKey (peeps, dictkeys)'. –

+0

Нам не нужно запускать код. Он находится прямо в коде в ветке, который не возвращает значение. –

+0

Я согласен, что в первом случае нет возврата. Но я не понимаю следующее: функция печатает, скажем, «Возврат образца 5», который говорит мне, что он достиг области проблемы. В этой ветви есть оператор return. , , поэтому, когда он находится в этой ветви, он должен вернуть значение. Но вместо этого он возвращает None. Почему он даже идет в другую часть? – Curious2learn

ответ

6

Вы не возвращает значение здесь:

else: 
     dictkeys.remove(sampleKey) 
     chooseSampleKey(peeps, dictkeys) 
     # here <----------- 
else: 
    return 0 

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

В противном случае Python вернет None, который является возвращаемым по умолчанию значением для всех функций (т. Е. Когда оператор возврата не был записан).

+0

Не могли бы вы видеть мой комментарий выше? Возврат None, даже когда код входит в «проблемную ветвь». Как только он войдет в эту ветвь, если он не вернется со значением sampleKey, так как в этой ветке есть возврат? – Curious2learn

+0

@ Curious2learn см. Выше, важно то, что вы возвращаете при первоначальном вызове 'selectSampleKey', а не то, что вы возвращаете при промежуточных вызовах функций. –

+0

Благодарим вас за это разъяснение. – Curious2learn

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