Python递归尝试除外

Python递归尝试除外,python,pandas,recursion,try-except,Python,Pandas,Recursion,Try Except,我正在尝试使用递归的try-except函数来处理偶尔出现的错误。在pandas中,我们可以为数据帧创建分位数,但是,两个或多个分位数的边界可能重合,因此实际上没有边界。因此,pandas将抛出一个错误。为了避免这个问题,你可以降低分位数的数量,这就是我在这里要做的 将熊猫作为pd导入 量化,dict\u bins=递归的\u较低的\u标签(model\u quant=model\u quant, n_分位数=n_分位数, 反向=反向) def递归下标签(型号数量, n_分位数, 反向=假):

我正在尝试使用递归的
try-except
函数来处理偶尔出现的错误。在
pandas
中,我们可以为数据帧创建分位数,但是,两个或多个分位数的边界可能重合,因此实际上没有边界。因此,
pandas
将抛出一个错误。为了避免这个问题,你可以降低分位数的数量,这就是我在这里要做的

将熊猫作为pd导入
量化,dict\u bins=递归的\u较低的\u标签(model\u quant=model\u quant,
n_分位数=n_分位数,
反向=反向)
def递归下标签(型号数量,
n_分位数,
反向=假):
'''
递归地减少标签的数量,直到它起作用为止。
'''
如果n_分位数==0:#基本情况
return'错误:没有要使用的分位数。'
#不是很重要。。。
#我用它来使用普通或反向标签。
如果反向==假:
标签=范围(1,n_分位数+1)
elif reverse==真:
标签=范围(n_分位数,0,-1)
尝试:
qt,dc=pd.qcut(型号数量,
q=n_分位数,
标签=标签,
retbins=True)
返回qt,dc
除:
递归\u下\u标签(模型\u数量,
n_分位数=n_分位数-1,
反向=反向)
我得到的错误是(指向顶部的函数调用):

无法解压缩不可iterable的非类型对象

我怀疑这是我犯的两个错误之一:

  • 某个地方的范围界定存在问题。也许
    n_分位数
    ?从我没有经验的调试来看,这似乎不太可能
  • except
    语句中,在函数递归调用之前放置return有一个问题。我在这里尝试了很多组合,即使最后有一个额外的
    else
    ,但也没有效果
  • 顺便说一句,如果不是递归的,这是可行的

    编辑


    我的问题被标记为重复,此编辑旨在解决该评估。首先,它被标记为一个问题的副本,这个问题也被标记为这样的问题,这很奇怪,但并不那么相关。这些问题与我的问题不同的一个重要而有用的概念是,它们都有函数,虽然是递归的,但不一定总是返回某些东西,而我的函数总是返回某些东西,因此,使递归的返回看起来似乎是不必要的-这被证明是不正确的。

    您所要做的就是返回递归。通过一些轻微的重构:

    def recursive_lower_labels(model_quant,
                               n_quantiles,
                               reverse=False):
        """
         Recursively lowers the number of labels until it works.
        """
        if n_quantiles == 0:  # base case
            return 'Error: There are no Quantiles to be used.'
    
        # Not very important...
        # I'm using this to either use normal or reverse labels.
        if reverse:
            labels = range(n_quantiles, 0, -1)
        else:
            labels = range(1, n_quantiles + 1)
    
        try:
            return pd.qcut(model_quant,
                             q=n_quantiles,
                             labels=labels,
                             retbins=True)
    
        except:
            return recursive_lower_labels(model_quant,
                                          n_quantiles=n_quantiles - 1,
                                          reverse=reverse)
    

    为什么要测试==False或==0?也可以使用“not”表示正确,如果是,那么最明显的错误是:1。压痕不正确。2.将函数调用置于函数定义之前。除此之外,您的代码似乎可以处理我的数据。我知道当值为布尔值时,您不需要使用
    =
    ,但这样更容易阅读。不正确的缩进只是编辑文章时的一个小失误。在函数调用之前调用函数并不是我在代码中所做的,在这里阅读似乎更好。让代码实际运行并再现失败更好。我曾尝试过这一点,但它不起作用,我明天会再试一次,看看它是否有效。但我想知道为什么您需要在这里使用
    返回
    返回
    中的
    返回
    是否已经足够了?尽管不太了解返回的必要性,它还是完成了任务。非常感谢。@PhilippeFanaro,由于您使用递归,因此需要返回值-否则,尽管子层有返回值,控制函数调用实际上不会返回任何内容。在重复问题的递归(ha)之后,为了更好地解释为什么返回是必要的。在思考了一段时间后,我认为将其视为一个范围问题,而不是像“从函数末尾掉下来”这样的新概念更简单:如果我不放
    返回
    ,递归将返回值,但只返回主函数内部的值,而外部函数调用将不返回任何值。