'NoneType' 对象不可迭代 - 错误在哪里?

'NoneType' object is not iterable - where is an error?

我的目标是取一个三元组 (A, B, C),计算三个“邻居”,然后将每个邻居的最大值输出到列表中。

例如(sqrt(6), 4*sqrt(3), 9*sqrt(2))的邻居是

(sqrt(3)*sqrt(2), 3*sqrt(2), 4*sqrt(3))

(4*sqrt(3), 35*sqrt(3)*sqrt(2), 9*sqrt(2))

(sqrt(3)*sqrt(2), 9*sqrt(2), 14*sqrt(3))

所以值 14*sqrt(3), 36*sqrt(6), 4*sqrt(3) 将是输出。

当我尝试这个时:

A = 1*sqrt(6)
B = 4*sqrt(3)
C = 9*sqrt(2)


def nbhs_1(triple):
    X = triple[0]
    Y = triple[1]
    Z = triple[2]

    print((X.canonicalize_radical(), (X * Y - Z).canonicalize_radical(), Y.canonicalize_radical()))


def nbhs_2(triple):
    X = triple[0]
    Y = triple[1]
    Z = triple[2]  

    print((Y.canonicalize_radical(), (Y * Z - X).canonicalize_radical(), Z.canonicalize_radical()))


def nbhs_3(triple):
    X = triple[0]
    Y = triple[1]
    Z = triple[2]

    print((X.canonicalize_radical(), Z.canonicalize_radical(), (X * Z - Y).canonicalize_radical()))

result_1 = nbhs_1((A, B, C))
result_2 = nbhs_2((A, B, C))
result_3 = nbhs_3((A, B, C))

print(result_1)
print(result_2)
print(result_3)

l = [max(result_1), max(result_2), max(result_3)]

我得到'NoneType' object is not iterable.

问题是您没有调用函数 nbhs_1、nbhs_2 和 nbhs_3,而且函数没有返回任何值

from math import sqrt

A=1*sqrt(6)
B=4*sqrt(3)
C=9*sqrt(2)
triple = (A, B, C)

def nbhs_1(triple):
    X=triple[0]
    Y=triple[1]
    Z=triple[2]
    return (X.canonicalize_radical(),(X*Y-Z).canonicalize_radical(),Y.canonicalize_radical())
def nbhs_2(triple):
    X=triple[0]
    Y=triple[1]
    Z=triple[2]  
    return (Y.canonicalize_radical(),(Y*Z-X).canonicalize_radical(),Z.canonicalize_radical())         
def nbhs_3(triple):
    X=triple[0]
    Y=triple[1]
    Z=triple[2]
    return (X.canonicalize_radical(),Z.canonicalize_radical(),(X*Z-Y).canonicalize_radical())

l=[max(nbhs_1(triple)),max(nbhs_2(triple)),max(nbhs_3(triple))]

主要问题是您没有正确构建函数:

  1. 建议您在函数调用中公开参数。不要def nbhs_1(triple),而是def nbhs_1(X, Y, Z)。通过这种方式,您实际上可以拥有一个功能来满足您的需求(更易于维护)
  2. Return 你的结果。目前您正在打印函数调用的结果,但没有返回这些结果。
  3. 我也不确定 canonicalize_radical() 调用是否也正确完成。 Python 是面向对象的,通过编写 var.canonicalize_radical() 你可以推断出 var 本身应该知道这个函数(例如,这个函数是 var 的一部分),但这听起来是错误的。正确的调用可能是canonicalize_radical(var)

基本上,这应该更接近正确的解决方案:

A=1*sqrt(6)
B=4*sqrt(3)
C=9*sqrt(2)

def nbhs(X, Y, Z):
    out1 = canonicalize_radical(X)
    out2 = canonicalize_radical(X*Y-Z)
    out3 = canonicalize_radical(Y)
    return out1, out2, out3

l = [max(nbhs(A, B, C)), max(nbhs(B, A, C)), max(nbhs(C, B, A))]