我想知道如果嵌套函数的返回值不是None
,如何使函数返回嵌套函数的返回值。
为了让我的代码工作,我可以在我的主函数中复制嵌套函数的代码,但这太重复了(DRY)。我调查了一些关于使用 from functool import partial
复制函数的问题,但这只允许您拥有另一个具有不同变量或文档字符串的函数。此外,我浏览了所有相关问题,但似乎都没有一段优雅的代码(简单地做到这一点)。
这里主要函数 ExtractOne
被提供了一个数字列表。通常(与我的代码相关)第 4 个元素是一个,因此使用 CheckIfOne
函数检查该元素。如果是这种情况,函数返回 1 并退出。如果不是这种情况,则代码继续检查馈送列表中的所有元素是否是一个元素,再次对每个元素使用 CheckIfOne
。如果元素是一个,ExtractOne
应该返回 1,从而打破 for
循环和函数。
这是有效的片段。它将 CheckIfOne
(嵌套函数)的返回值复制到变量 a
上,检查 a
是否不是 None
,如果是这种情况,则返回 a
。
示例 1:
def CheckIfOne(part):
if part == 1:
return 1
def ExtractOne(parts):
#4th element is generally 1
a = CheckIfOne(parts[3])
if a:
return a
#else scan through the list for 1
for part in parts:
a = CheckIfOne(part)
if a:
return a
>>> ps = [1,2,3,4,5]
>>> ExtractOne(ps)
1
>>>
这是我希望它看起来的样子,但当然这不是嵌套函数的工作方式,嵌套函数返回一个值,并且必须将其复制到一个变量上,如果它不是 None<,则检查该变量
然后返回,就像上面的代码片段一样。
示例 2:
def CheckIfOne(part):
if part == 1:
return 1
def ExtractOne(parts):
#4th element is generally 1
CheckIfOne(parts[3])
#else scan through the list for 1
for part in parts:
CheckIfOne(part)
>>> ps = [1,2,3,4,5]
>>> ExtractOne(ps)
>>>
然而,当我只是复制CheckIfOne
的代码时它确实有效,但这违反了DRY规则。
示例 3:
def ExtractOne(parts):
#4th element is generally 1
if parts[3] == 1:
return 1
#else scan through the list for 1
for part in parts:
if part == 1:
return 1
>>> ps = [1,2,3,4,5]
>>> ExtractOne(ps)
1
>>>
我希望有一个简单的 pythonic python 语法来将嵌套函数的代码复制到示例 3 中的主要代码段。
最佳答案
暂时忽略您的代码并不总是有返回值,命名约定本身并不是“pythonic”,并且有更简单的方法来降低复杂性,并假设您只是问一般的问题。
调用一个单独的方法并没有错,但是如果你只是想让自己有另一个顶级函数并且你将只使用你函数中的代码,你可以在函数内部定义函数,如下所示。
def ExtractOne(parts):
def CheckIfOne(part):
if part == 1:
return 1
#4th element is generally 1
a = CheckIfOne(parts[3])
if a:
return a
#else scan through the list for 1
for part in parts:
a = CheckIfOne(part)
if a:
return a
ps= [1,2,3,4,5]
print(ExtractOne(ps))
关于仅当表达式的值不是 None 时才返回表达式的 Python 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57637395/