Можно ли вернуть True в течение цикла? - PullRequest
0 голосов
/ 09 июня 2019

В этом коде я беру два числа в списке и проверяю, добавляет ли он значение K. Единственная проблема заключается в том, что я не могу вернуть True.

, но если я использую печатьФункция вместо возврата работает.Есть ли какое-то ограничение, что я не могу использовать возвращаемый тип для цикла или условий?

def funcSum():
    NumList = []

    Number = int(input("Please enter the total number of list elements: "))
    for i in range(1, Number + 1):
        value = int(input("Please enter the value of %d element : " %i))
        NumList.append(value)

    k = int(input("Enter the value of K: "))

    for i in range (Number):
        for j in range(i + 1, Number):
            if NumList[i] + NumList[j] == k:
                return True
                break
funcSum()

Я хочу вернуть значение True, если два числа складываются в K или оно возвращает False.

Ответы [ 3 ]

1 голос
/ 09 июня 2019

Как уже говорили другие, нет ничего плохого в том, чтобы возвращать True так, как вы это делаете.Сдается мне, что вы просто скучаете, возвращая False, если вы никогда не найдете совпадения.Я думаю, вы просто хотите это:

def funcSum():
    NumList = []

    Number = int(input("Please enter the total number of list elements: "))
    for i in range(1, Number + 1):
        value = int(input("Please enter the value of %d element : " %i))
        NumList.append(value)

    k = int(input("Enter the value of K: "))

    for i in range (Number):
        for j in range(i + 1, Number):
            if NumList[i] + NumList[j] == k:
                return True

    return False

funcSum()

Я достал break, что у вас там было.Эта строка была недостижимым кодом и, следовательно, ненужной.

Ваш код может работать как есть в зависимости от того, что вы делаете с возвращаемым значением.Мое добавление приводит к тому, что возвращается «False», а не «None» в том случае, если вы никогда не подходите и возвращаете «True».Во многих случаях проверка на «ложность» будет успешной со значением либо False, либо None, так что вы все равно можете быть в порядке.Но добавление явного возврата очень рекомендуется в любом случае ... оно гарантирует, что ваша функция всегда будет возвращать логическое значение (True или False).

0 голосов
/ 09 июня 2019

Не рекомендуется прерывать цикл for - или, по крайней мере, я стараюсь этого избегать.Поэтому я думаю, что один более ясный способ сделать это - использовать некоторые существующие инструменты (itertools.combinations, any), чтобы избежать написания всего алгоритма - но, как подчеркивали другие пользователи, совершенно нормально использовать breakв вашем for цикле.

import itertools

def func_sum2(num_list, k):
  """Return true if at least the sum of one combination of 2 elements in the list is equal to k.

  Use 
    - `itertools.combinations` to get the list of all combinations of 2 elements in the list
    - `any` to return true when at least one of the elements is Truth

  """
  return any(comb[0] + comb[1] == k 
         for comb in itertools.combinations(num_list, 2))

# Some tests
assert func_sum2([1,2], 3) == True
assert func_sum2([1,2], 4) == False
assert func_sum2([1,2,3], 5) == True

Примечание

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

def func_sum(num_list, k):
    answer = False

    for i in range (len(num_list)):
      for j in range(i + 1, len(num_list)):
        if num_list[i] + num_list[j] == k:
          answer = True
          break
    return answer

# Some tests
assert func_sum([1,2], 3) == True
assert func_sum([1,2], 4) == False
assert func_sum([1,2,3], 4) == True
0 голосов
/ 09 июня 2019

, если вы хотите использовать свой оригинальный код:

def funcSum():
    NumList = []

    Number = int(input("Please enter the total number of list elements: "))
    for i in range(1, Number + 1):
        value = int(input("Please enter the value of %d element : " %i))
        NumList.append(value)

    k = int(input("Enter the value of K: "))
    equal = False
    for i in range (Number):
        for j in range(i + 1, Number):
            if NumList[i] + NumList[j] == k:
                equal = True
                break
        if equal:
            break
    return equal

но вы также можете сделать это с последним битом:

    equal = False
    for i in list(NumList):
        for u in list(NumList):
            if i == u:
                equal = True
                break
        if equal :
            break

надеюсь, это поможет:)

...