python 如何解决此算法代码中的错误(TypeError:“无类型”)?

xdyibdwo  于 2023-03-28  发布在  Python
关注(0)|答案(3)|浏览(193)

我自己用Python理解和应用这个练习有困难。我得到了这个:
TypeError: '<' not supported between instances of 'int' and 'NoneType'
这是练习算法:
定义:如果一个整数等于它的所有约数之和,则称它为完美整数。例如:6和28是完美的,因为6 = 1+2+3(知道1,2和3是6小于6的约数)28= 1+2+4+7+14(知道1,2,4,7和14是28小于28的约数)
1.创建一个函数liste_divisors(),它接受一个整数N作为参数,并返回小于N(包括1)的除数列表。
1.使一个函数是完美的(),它接受一个(正)整数N作为参数,如果它是完美的,则返回“True”,否则返回“False”(使用第一个问题中的函数)
1.创建一个PerfectList()函数,该函数接受Limit参数,然后返回一个包含小于Limit的完全数的列表
我对最后一个问题有疑问
这是我到目前为止的尝试,但有错误,我如何才能纠正这些错误?

def liste_diviseur(N):
   t = []
   for i in range(1,N):
      if(N%i == 0):
         t.append(i)
   return t

def est_parfait(M):
   s = 0
   for i in liste_diviseur(M):
      s += i 
   if(s == M):
      return True
   else:
      return False

def liste_parfait(Limite):
   t = []
   lis = print(liste_diviseur(Limite))
   if(Limite<lis):
      t.append(Limite)
   return t
m = int(input('Giving an number :'))
print(liste_parfait(m))
c3frrgcw

c3frrgcw1#

您的错误似乎是在设置lis = print(liste_diviseur(Limite))时出现的。print()是一个void函数,它将返回null。删除print()应该可以解决您的问题

cpjpxq1n

cpjpxq1n2#

您需要创建一个范围,然后检查范围中的每个数字是否都是完美的。

def liste_diviseur(n):
   return [i for i in range(1,n//2+1) if n%i==0]

def est_parfait(n):
   return n == sum(liste_diviseur(n))
         

def liste_parfait(limite): 
   return [i for i in range(2, limite) if est_parfait(i)]
   

test = int(input('Giving an number: '))
print(liste_parfait(test))
# output for 8129
[6, 28, 496, 8128]
6vl6ewon

6vl6ewon3#

主要部分是生成除数。你可以找到一些提高效率的方法,例如here
对于大的数字,可以使用将n因式分解成它的因子(例如,参见我为另一个问题写的an answer),然后通过组合这些因子来生成所有的除数。
在这里,我们将为简单起见:

from math import isqrt

def divisors(n):
    m = isqrt(n)
    for i in range(1, m + 1):
        if n % i == 0:
            yield i
            j = n // i
            if i < j < n:
                yield n // i

示例:

>>> list(divisors(36))
[1, 2, 18, 3, 12, 4, 9, 6]

请注意,divisors()返回一个生成器,而不是list,并且除数是无序产生的(更准确地说:作为对in // i)。但这并不重要,看看一个数字是否完美:

def is_perfect(n):
    return sum(divisors(n)) == n

>>> is_perfect(5)
False

>>> is_perfect(6)
True

下面是一组完美数:

>>> [n for n in range(1, 10_000) if is_perfect(n)]
[6, 28, 496, 8128]

相关问题