Python除数代码报错:int与builtin_function_or_method无法比较及内置函数使用咨询
问题分析与解决方案
一、错误原因及修复
你遇到的not supported between instances of 'int' and 'builtin_function_or_method'错误,核心问题出在这行代码:
max_count=max
这里的max是Python的内置函数,不是你需要的数值变量。执行这行后,max_count从整数类型变成了函数对象,后续再执行if counter > max_count:时,就会出现整数与函数无法比较的错误。
修复后的完整代码
删掉elif块中错误的max_count=max即可,因为当counter == max_count时,不需要修改max_count的值,只需处理更大数字的更新逻辑:
def divisors(num): counter=1 for i in range(1,num): x = num%i if x==0: counter+=1 return counter max_count= 0 Number=0 for i in range(3): number = int(input('\nEnter the Number : ')) counter=divisors(number) if counter > max_count: max_count=counter Number=number elif counter==max_count: if number>Number: Number=number print('\n',Number,max_count)
另外补充:原divisors函数的range(1,num)会漏掉数字本身这个约数,若需要统计完整约数,建议改成range(1, num+1)。
二、用内置函数优化约数统计代码
以下几种方式可以用Python内置函数简化并优化你的约数统计逻辑:
方法1:用sum()结合生成器表达式
通过生成器表达式遍历所有可能的除数,用sum()直接统计符合条件的数量,代码更简洁:
def divisors(num): # 遍历1到num的所有数,能整除则计1,sum求和得到总约数个数 return sum(1 for i in range(1, num+1) if num % i == 0)
方法2:结合math.sqrt()优化效率(推荐)
利用约数成对出现的特性(如i和num/i),结合math.sqrt()减少循环次数,大幅提升大数处理效率:
import math def divisors(num): count = 0 sqrt_num = int(math.sqrt(num)) for i in range(1, sqrt_num + 1): if num % i == 0: # 平方数的平方根只算一次约数 if i == num // i: count += 1 else: count += 2 return count
方法3:用filter()筛选约数
通过filter()函数筛选出能整除目标数的元素,再用len()统计数量:
def divisors(num): # filter返回符合条件的迭代器,转成列表后用len统计长度 return len(list(filter(lambda x: num % x == 0, range(1, num+1))))
内容的提问来源于stack exchange,提问作者Mohammadreza Shahsavar
相关产品推荐
相关产品推荐

