Как я могу использовать результаты в функциях в цикле? - PullRequest
0 голосов
/ 30 октября 2019

Я хочу определить две функции, одну внутри другой, и зациклить ее, пока она не достигнет значения, которое я ищу. Однако значения в функции не доступны извне функции, поэтому коды не работают должным образом. Могу ли я получить помощь с этим? Есть ли способ добиться этого?

def count_div(number):
    counter = 0
    for ite in range(1,number+1):
        if number % ite == 0:
            counter += 1
        else:
            continue
    else:
        #print(number, counter)
        return counter

def sum_of(order):
    num = 0
    for a in range(order+1):
        num = num + a  
    count_div(num)

#sum_of(7)

for o1 in range(100):
    if sum_of(o1) == 20:
        print(o1)
        break
    else:
        continue
else:
    print('can\'t reach') 

есть моя работа, но цикл for sum_of func. не дать полезный результат для сравнения .. Спасибо.

Ответы [ 2 ]

0 голосов
/ 30 октября 2019

Ваша sum_of функция не возвращает ничего, поэтому ваше условие if никогда не будет работать. Добавьте возврат в последнюю строку в функции sum_of:

return count_div(num)

Также у вас есть множество ненужных операторов else:, которые вы должны удалить, вот пример:

def count_div(number):
    counter = 0
    for ite in range(1,number+1):
        if number % ite == 0:
            counter += 1

    #print(number, counter)
    return counter

def sum_of(order):
    num = 0
    for a in range(order+1):
        num = num + a  
    return count_div(num)

#sum_of(7)

for o1 in range(100):
    if sum_of(o1) == 20:
        print(o1)
        break
else:
    print('can\'t reach') 
0 голосов
/ 30 октября 2019

Вам необходимо вернуть результат вызванной функции.

def sum_of(order):
    num = 0
    for a in range(order+1):
        num = num + a
    return count_div(num)

Когда в функции нет явного оператора возврата, python автоматически возвращает None. Поэтому строка if sum_of(o1) == 20: сравнивала None с 20 на каждой итерации.

Только для справки для функции count_div вы можете использовать sum для более питонического подхода:

sum(not number%(n+1) for n in range(number)

И sum_of это просто сложение всех натуральных чисел из 1-n. Это также можно сделать, используя это уравнение n*(n+1)//2 ради эффективности по сравнению с методом зацикливания, что делает sum_of в значительной степени неуместным.

def count_div(num):
    return sum(not num%(n+1) for n in range(num*(num+1)//2))

Тогда для вашего последнего цикла:

for o1 in range(100):
    if count_div(o1) == 20:
        print(o1)
        break
...