在python中在if内部编写def时遇到问题



我需要做

def x1(ap,dp,ph,e1,e2,e3,e4,e5,y):
if Delta(ap,dp,ph,e1,e2,e3,e4,e5,y) >= 0:
return 2*(b(ap,dp,ph,e1,e2,e3,e4,e5,y)**3) - 9*a*b(ap,dp,ph,e1,e2,e3,e4,e5,y)*c(ap,dp,ph,e1,e2,e3,e4,e5,y) + 27*(a**2)*d(ap,dp,ph,e1,e2,e3,e4,e5,y)
else:
return None
def y1(ap,dp,ph,e1,e2,e3,e4,e5,y):
if Delta(ap,dp,ph,e1,e2,e3,e4,e5,y) >= 0:
return 3*np.sqrt(3)*a*np.sqrt(Delta(ap,dp,ph,e1,e2,e3,e4,e5,y))
else:
return None

这造成了一个问题,输出:

return np.sqrt(x1(ap,dp,ph,e1,e2,e3,e4,e5,y)**2+y1(ap,dp,ph,e1,e2,e3,e4,e5,y)**2)
TypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'int'

所以我想把它写成

def Delta(ap,dp,ph,e1,e2,e3,e4,e5,y):
Delta = 18*a*b(ap,dp,ph,e1,e2,e3,e4,e5,y)*c(ap,dp,ph,e1,e2,e3,e4,e5,y)*d(ap,dp,ph,e1,e2,e3,e4,e5,y) - 4*(b(ap,dp,ph,e1,e2,e3,e4,e5,y)**3)*d(ap,dp,ph,e1,e2,e3,e4,e5,y) + (b(ap,dp,ph,e1,e2,e3,e4,e5,y)**2)*(c(ap,dp,ph,e1,e2,e3,e4,e5,y)**2) - 4*a*(c(ap,dp,ph,e1,e2,e3,e4,e5,y)**3) - 27*(a**2)*(d(ap,dp,ph,e1,e2,e3,e4,e5,y)**2)
if Delta(ap,dp,ph,e1,e2,e3,e4,e5,y) >= 0:
def x1(ap,dp,ph,e1,e2,e3,e4,e5,y):
return 2*(b(ap,dp,ph,e1,e2,e3,e4,e5,y)**3) - 9*a*b(ap,dp,ph,e1,e2,e3,e4,e5,y)*c(ap,dp,ph,e1,e2,e3,e4,e5,y) + 27*(a**2)*d(ap,dp,ph,e1,e2,e3,e4,e5,y)
def y1(ap,dp,ph,e1,e2,e3,e4,e5,y):
return 3*np.sqrt(3)*a*np.sqrt(Delta(ap,dp,ph,e1,e2,e3,e4,e5,y))
return x1, y1

但它也犯了一个定义错误。实际上,通过定义这样的函数,我必须使用x1((、y1((和atlast构造一些新函数,如U1((、U2((、U3(。。。。等。在范围(-10,10(内,找到满足最佳拟合的所有可能的变量集

您的定义错误似乎是由于不正确的缩进造成的。您将在定义它们的if语句之外返回x1和y1。

TypeErrorTypeError: unsupported operand type(s) for ** or pow(): 'NoneType' and 'int'意味着x1(...)y1(...)返回None,这在函数定义中是允许的。我建议将其更改为显式抛出错误,假设None不是理想的返回值。看看你的代码,Delta(…(似乎是负的,而它不应该是负的。

def x1(ap,dp,ph,e1,e2,e3,e4,e5,y):
"x1 is a function that does something"
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
a = 5 # keep `a` in local scope, or include it as a function argument 
# e.g., along with ap,dp,ph,e1,e2,e3,e4,e5,y
if Delta(**keywordargs) >= 0:
return 2*(b(**keywordargs)**3) - 9*a*b(**keywordargs)*c(**keywordargs) + 27*(a**2)*d(**keywordargs)
else:
raise ValueError(f"Delta should be non-negative, but instead was {Delta(**keywordargs)}")
def y1(ap,dp,ph,e1,e2,e3,e4,e5,y):
"y1 is a function that does something"
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
a = 5 # keep `a` in local scope, or include it as a function argument 
if Delta(**keywordargs) >= 0:
return 3*np.sqrt(3)*a*np.sqrt(Delta(**keywordargs))
else:
raise ValueError(f"Delta should be non-negative, but instead was {Delta(**keywordargs)}")

而且。。。

def Delta(ap,dp,ph,e1,e2,e3,e4,e5,y):
"Delta does some crazy stuff"
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
a = 5 # keep `a` in local scope, or include it as a function argument 
# Avoid defining variables with the same name as their function, to avoid confusion and accidental recursion...
delta_val = 18*a*b(**keywordargs)*c(**keywordargs)*d(**keywordargs) 
- 4*(b(**keywordargs)**3)*d(**keywordargs) 
+ (b(**keywordargs)**2)*(c(**keywordargs)**2) 
- 4*a*(c(**keywordargs)**3) 
- 27*(a**2)*(d(**keywordargs)**2)
if delta_val >= 0:
def x1(ap,dp,ph,e1,e2,e3,e4,e5,y):
return 2*(b(ap,dp,ph,e1,e2,e3,e4,e5,y)**3) - 9*a*b(ap,dp,ph,e1,e2,e3,e4,e5,y)*c(ap,dp,ph,e1,e2,e3,e4,e5,y) + 27*(a**2)*d(ap,dp,ph,e1,e2,e3,e4,e5,y)
def y1(ap,dp,ph,e1,e2,e3,e4,e5,y):
return 3*np.sqrt(3)*a*np.sqrt(Delta(ap,dp,ph,e1,e2,e3,e4,e5,y))
return x1(**keywordargs), y1(**keywordargs)
else:
raise ValueError(f"Delta should be non-negative, but instead was {delta_val}")

此外,什么是a?我希望它不是在整个应用程序中更改的可变全局变量。。。因为这会产生难以发现的错误。如果可以的话,我建议避免函数依赖于在函数(或包含函数的类(之外定义的变量。

此外,出于对所有神圣事物的热爱,请将函数名加长或大写,以帮助将其与所有单字母变量名区分开来。此外,考虑使用更具描述性的变量名,或包含注释。代码读起来比写起来多。你不想让调试变得更加困难。


编辑

在第二次查看代码后,如果您进一步简化事情,并将所有函数彼此分离,那会更好。

# Define your functions separately
def X1(ap,dp,ph,e1,e2,e3,e4,e5,y,a,a):
"""X1 is a function that does something
Input: ap,dp,ph,e1,e2,e3,e4,e5,y,a
Output: some crazy number
Dependencies: b(), c(), d()
"""
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y,a]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y,a".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
result = 2*(b(**keywordargs)**3) 
- 9*a*b(**keywordargs)*c(**keywordargs) 
+ 27*(a**2)*d(**keywordargs)
return result
def Y1(ap,dp,ph,e1,e2,e3,e4,e5,y,a):
"""Y1 is a function that does something
Input: ap,dp,ph,e1,e2,e3,e4,e5,y,a
Output: some crazy number
Dependencies: Delta(), b(), c(), d()
"""
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y,a]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y,a".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
if Delta(**keywordargs) >= 0:
return 3*np.sqrt(3)*a*np.sqrt(Delta(**keywordargs))
else:
raise ValueError(f"Delta should be non-negative, but instead was {Delta(**keywordargs)}")

def Delta(ap,dp,ph,e1,e2,e3,e4,e5,y,a):
"""Delta does some crazy stuff
Input: ap,dp,ph,e1,e2,e3,e4,e5,y,a
Output: some crazy number
Dependencies: b(), c(), d()
"""
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y,a]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y,a".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
# Avoid defining variables with the same name as their function, to avoid confusion and accidental recursion...
delta_val = 18*a*b(**keywordargs)*c(**keywordargs)*d(**keywordargs) 
- 4*(b(**keywordargs)**3)*d(**keywordargs) 
+ (b(**keywordargs)**2)*(c(**keywordargs)**2) 
- 4*a*(c(**keywordargs)**3) 
- 27*(a**2)*(d(**keywordargs)**2)
return delta_val
# Run your already defined functions
if (__name__ == "__main__"):
# ... give values to ap,dp,ph,e1,e2,e3,e4,e5,y,a
variables = [ap,dp,ph,e1,e2,e3,e4,e5,y,a]
varnames = "ap,dp,ph,e1,e2,e3,e4,e5,y,a".split(',')
keywordargs = {k:a for (k,a) in zip(varnames, variables)}
if Delta(**keywordargs) >= 0:
x1,y1 = X1(**keywordargs), Y1(**keywordargs)

基本上,您希望将程序的逻辑与各个函数定义分开。从不依赖外部全局变量或函数的更小、更简单的函数构建程序。

还要大写B((、C((、D((,或者给它们不同的名称。做一些事情来表明它们是函数而不是变量。

最新更新