Пока цикл работает один раз? - PullRequest
1 голос
/ 07 апреля 2019

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

Подсказка:

Если мы перечислим все натуральные числа ниже 10, кратные 3 или 5, мы получим 3, 5, 6 и 9. Сумма этих кратных23. Найдите сумму всех кратных 3 или 5 ниже 1000.

three = []
five = []

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1
        return three

def fiveList():
    n = 1
    while (n*5<1000):
        result = n*5
        five.append(result)
        n += 1
        return five

threeList()
fiveList()

print(three,five)

Это приведет к выводу [3] [5] на консоль.

Ответы [ 3 ]

3 голосов
/ 07 апреля 2019

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

multiples_of_five = range(5, 1001, step=5)
multiples_of_three = range(3, 1001, 3)

Поскольку стоп range равен эксклюзив , но мы хотим, чтобы все кратные от трех и пяти до 1000 включительно , мы должны вместо этого остановиться на 1001. Это упрощает my_func, которое Марчин изложил выше.

def list_multiples(n):
    result = []
    for i in range(n, 1001, n):
        result.append(i)
    return result

Хотя, если мы рассмотрим это более внимательно, вы увидите, что мы в основном просто приводим список и возвращаем. Давайте сделаем это напрямую.

def list_multiples(n):
    return list(range(n, 1001, n))

Оттуда мы можем найти кратные пять и кратные три

fives = list_multiples(5)
threes = list_multiples(3)

Приведение к set для удаления дубликатов (15 кратно 5 и 3, но не должно суммироваться дважды)

all_nums = set(fives + threes)

И суммируем результат

result = sum(all_nums)
3 голосов
/ 07 апреля 2019

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

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1
    return three

Также это return не имеет большого смысла, потому что вы возвращаете глобальные переменные.Нет смысла возвращать то, что уже доступно (я предлагаю вам прочитать о переменная область действия ), поэтому можно полностью избавиться от этих return s:

def threeList():
    n = 1
    while (n*3<1000):
        result = n*3
        three.append(result)
        n += 1

На самом деле, поскольку обе ваши функции отличаются очень мало, вы должны реорганизовать ваш код и иметь только одну функцию, принимающую множитель (поскольку это единственное отличие) и возвращающую заполненный список.На этот раз мы используем локальную переменную для создания списка результатов, поэтому на этот раз вам нужно return, иначе result список не будет доступен вне функции:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

, а затем заменить

threeList()
fiveList()

с

three = my_func(3)
five = my_func(5)

На самом деле, вы можете объединить это с print(), так как нет никакого другого использования для three и five, поэтому ваш окончательный код будет выглядеть такэто:

def my_func(multiplier):
    result = []
    n = 1
    while (n*multiplier < 1000):
        result.append(n*multiplier)
        n += 1
    return result

print(my_func(3), my_func(5))
0 голосов
/ 07 апреля 2019

Чтобы решить вашу проблему Pythonic, используйте sum() с выражением генератора вроде:

Код:

sum(i for i in range(1000) if i % 5 == 0 or i % 3 == 0)

Тестовый код:

max_num = 1000
print(sum(i for i in range(max_num) if i % 5 == 0 or i % 3 == 0))

Результаты:

233168
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...