Возврат из функции дает None - PullRequest
0 голосов
/ 21 мая 2018
def prime_func():
    counter = 0
    composites = [2]
    primes = [3]
    for x in range(4, 50):
        for y in range(2, x):
            a = x/y
            if a - int(a) == 0:
                composites = composites + [x]
            else:
                primes = primes + [x]
                counter = counter + 1
                if counter == args[1]:
                    return counter, composites, primes
                else:
                    pass

prime_func()

counter1, composites1, primes1 = prime_func()

print(counter1)

К вашему сведению, это мой первый официальный скрипт на Python.В случае, если вам нужен контекст, он в конечном итоге вычислит x-е простое число, как только будет задан вход (я не включил этот бит, , не путайте с частью args).

При запуске этого кода я получаю сообщение об ошибке NoneType object is not iterable.Я посмотрел онлайн, и это сообщение в основном выдается, когда функция фактически ничего не возвращает.Может ли кто-нибудь помочь мне с этой структурой, чтобы она работала?

Первоначально counter, composites и primes были определены вне функции и даны как входные данные, но я изменил это, чтобы увидеть, если что-нибудьизменится.

Мне сказали, что такие переменные (глобальные?) не следует устанавливать внутри функции.

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Отсутствует break в паре мест.Кроме того, эта незавершенная работа на данном этапе не является поиском простых чисел, она просто найдет четные и нечетные числа из-за структуры циклов.

0 голосов
/ 21 мая 2018

Я предполагаю, что в данном диапазоне 0 .. 49 просто не хватает простых чисел, поэтому условие прерывания counter == args[1] никогда не применяется и функция возвращает None.

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

Для более эффективного алгоритма посмотрите: https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

def is_prime(a):
    for y in range(2, a):
        if a % y == 0:  # the modulo operation finds the remainder after division
            return False
    return True

# pass end condition into function, args[1] is a global variable
def prime_func(max_value, max_prime_count=10): 
    # you don't need a counter len(primes) do the same, also counter should start a 1
    primes = [3]

    for x in range(4, max_value):
        if is_prime(x):
            primes.append(x)
            if len(primes) == max_prime_count:
                break  # max prime count reached

    # calculates composites by set operation
    composites = set(range(2, max_value)) - set(primes)
    # also works if max_prime_count is not reached
    return sorted(composites), primes


composites, primes = prime_func(50, 10)

print(composites)
print(primes)
print(len(primes))
0 голосов
/ 21 мая 2018

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

, как в вашем коде, если код завершает цикл for и не перешел ни к одному изоператор возврата будет возвращен как None

...