返回嵌套函数返回值的Python语法?

返回嵌套函数返回值的Python语法?,python,function,nested,return,copy,Python,Function,Nested,Return,Copy,我有一个关于Python语法的小问题。我想知道如果嵌套函数的返回值不是None,如何使函数返回嵌套函数的返回值 为了使代码正常工作,我可以将嵌套函数的代码复制到主函数中,但这太重复(枯燥)。我研究了使用“from functool import partials”复制函数的一些问题,但这只允许您使用另一个具有不同变量或文档字符串的函数。此外,我浏览了所有相关的问题,似乎没有一个有优雅的代码(简单地做到这一点) 我认为最好只显示一些带有测试的代码(!!!)。所以这里的主要函数'ExtractOne

我有一个关于Python语法的小问题。我想知道如果嵌套函数的返回值不是None,如何使函数返回嵌套函数的返回值

为了使代码正常工作,我可以将嵌套函数的代码复制到主函数中,但这太重复(枯燥)。我研究了使用“from functool import partials”复制函数的一些问题,但这只允许您使用另一个具有不同变量或文档字符串的函数。此外,我浏览了所有相关的问题,似乎没有一个有优雅的代码(简单地做到这一点)

我认为最好只显示一些带有测试的代码(!!!)。所以这里的主要函数'ExtractOne'是一个数字列表。通常(与我的代码相关)第四个元素是一个元素,因此使用“CheckIfOne”函数检查该元素。如果是这种情况,则函数返回1并因此退出。如果不是这样,那么代码继续检查fed列表中的所有元素(如果它们是一个元素),再次对每个元素使用CheckIfOne。如果元素为1,“ExtractOne”应返回1,从而中断for循环和函数

这里是一个工作原理的片段。它将CheckIfOne(嵌套函数)的返回值复制到变量“a”上,检查“a”是否为None,如果是这种情况,则返回“a”:

#EXAMPLE 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,则检查该变量,然后返回,如上面的代码段所示

#EXAMPLE 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规则:

#EXAMPLE 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
>>>
我希望有一个简单的python语法,将嵌套函数的代码复制到主代码块上,如示例3所示


谢谢

您可以返回多个数字,但将所有返回的数字放入一个数组(或列表),然后在完成后返回它们

def foo(numbs):
输出=[]
...
output.append(数据)
...
返回输出

您可以返回多个数字,但将所有返回的数字放入一个数组(或列表),然后在完成后返回

def foo(numbs):
输出=[]
...
output.append(数据)
...
返回输出

暂时忽略您的代码并不总是有返回值,命名约定本身不是“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))

暂时忽略您的代码并不总是有返回值,命名约定本身不是“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))

我想知道我怎样才能浓缩:a=CheckIfOne(第[3]部分);如果a:返回1;变成一行。你可以使用三元运算符。a=(0,1)[parts[3]==1]或者您可以执行if(CheckIfOne(parts[3])==1):返回1非常感谢您的输入,但我想强调的是,这是一段测试代码,非常简单的示例。对于我的主代码(不是这个!),我基本上需要将嵌套函数(这里是CheckIfOne)的代码复制到主函数(这里是ExtractOne)中,如示例3所示。我想如果有像CheckIfOne这样的东西。复制代码(部分)就可以做到这一点。有了这个,我会有一个比“a=CheckIfOne(part)”;如果a:return a;”更好的一行,而且我会遵守干燥原则。也许试试lambda
checkIfOne=lambda numb:(None,1)[numb==1]
这将允许您稍后作为函数调用lambda,但语法要小得多。没有真正的理由使用短代码、大小!=效率我想知道我怎样才能浓缩:a=CheckIfOne(第[3]部分);如果a:返回1;变成一行。你可以使用三元运算符。a=(0,1)[parts[3]==1]或者您可以执行if(CheckIfOne(parts[3])==1):返回1非常感谢您的输入,但我想强调的是,这是一段测试代码,非常简单的示例。对于我的主代码(不是这个!),我基本上需要将嵌套函数(这里是CheckIfOne)的代码复制到主函数(这里是ExtractOne)中,如示例3所示。我想如果有像CheckIfOne这样的东西。复制代码(部分)就可以做到这一点。有了这个,我会有一个比“a=CheckIfOne(part)”;如果a:return a;”更好的一行,而且我会遵守干燥原则。也许试试lambda
checkIfOne=lambda numb:(None,1)[numb==1]
这将允许您稍后作为函数调用lambda,但语法要小得多。没有真正的理由使用短代码、大小!=效率命名约定并不是我非常关注的问题:代码的长度,包括太长的var或func名称。我想知道是否有一种方法可以将“a=CheckIfOne(part);if a:returna;”压缩成类似CheckIfOne的东西。\uuuuu copy\u code\uuuuuu(part),因此ExtractOne中的代码与示例3中的代码是等价的。您的评论似乎要求使用一个宏,而Python没有。Python将人的可读性放在首位,可以说,您所展示的内容(至少在上面的评论中)会遇到可读性问题。作为旁白(不是辩论的场所),但可读性也是t