Python 为什么这个函数与min一起工作,而不是没有min?

Python 为什么这个函数与min一起工作,而不是没有min?,python,recursion,min,Python,Recursion,Min,艾迪斯特是“演员”,“莱科” 二, 但是,如果我在没有min的情况下运行它 这是遗传近似匹配中使用的一种算法,用于确定匹配a和b需要多少编辑。我想如果我在没有min的情况下运行它,我将能够看到每个函数产生了多少编辑 编辑:我想我理解输出是一个元组,但我也有点困惑。 如果我去掉了另外两个函数,就可以像这样简化函数 TypeError: can only concatenate tuple (not "int") to tuple 为什么在这里添加delta没有任何问题 下面是另一个例子 def

艾迪斯特是“演员”,“莱科”

二,

但是,如果我在没有min的情况下运行它

这是遗传近似匹配中使用的一种算法,用于确定匹配a和b需要多少编辑。我想如果我在没有min的情况下运行它,我将能够看到每个函数产生了多少编辑

编辑:我想我理解输出是一个元组,但我也有点困惑。 如果我去掉了另外两个函数,就可以像这样简化函数

TypeError: can only concatenate tuple (not "int") to tuple
为什么在这里添加delta没有任何问题

下面是另一个例子

def edDistRecursive(a,b):
    #print(a, 'a')
    #print(b,'b')

    if len(a) == 0:
        return len(b)

    if len(b)==0:
        return len(a)



    delta = 1 if a[-1] != b[-1] else 0
    return edDistRecursive(a[:-1], b[:-1]) + delta 


edDistRecursive('actor','racto')  returns a value of  5.
即使是这样的输出为元组的东西,对其中一个元素的加法操作也没有问题

在我上面的函数中,值delta或+1被添加到一个元组中,这就是导致错误的原因,看起来,但int值并没有添加到整个元组中。事实上,元组的每个元素都由function+int组成。因此,当元组的一个元素本身是function+int时,我不知道如何添加到元组中

x、 y,z=y,而“actor”和“racto”似乎也会导致相同的错误


我认为通过给每个函数添加括号,edDistRecursivea[:-1],b[:-1]+delta,edDistRecursivea[:-1],b+1,edDistRecursivea,b[:-1]+1

Python可以将元组的每个元素都看作function+int,但我遇到了相同的错误


有没有一种方法可以获得每个函数的值,这是我最初的目标?

不清楚如果我在没有min means的情况下运行它会怎么样,确切地说,但是这里有一个明显的结论:表单的声明

def sum(x,y):
    x =3
    y =2

    return x+y, y


(sum(2,3))
return min(x, y, z)
返回x、y和z中最小的一个,但返回以下形式的语句

def sum(x,y):
    x =3
    y =2

    return x+y, y


(sum(2,3))
return min(x, y, z)
返回包含三个元素x、y、z的元组

有那么简单吗

思考 英语在这里不起作用;-看一个更简单的例子,它有着完全相同的问题:

return x, y, z
现在把min带走:


我只能建议你一行一行地工作,直到灯亮为止。你最初的问题应该变得非常清楚。

如果我在没有min means的情况下运行它,不清楚会发生什么,确切地说,但这里有一个明显的解释:形式声明

def sum(x,y):
    x =3
    y =2

    return x+y, y


(sum(2,3))
return min(x, y, z)
返回x、y和z中最小的一个,但返回以下形式的语句

def sum(x,y):
    x =3
    y =2

    return x+y, y


(sum(2,3))
return min(x, y, z)
返回包含三个元素x、y、z的元组

有那么简单吗

思考 英语在这里不起作用;-看一个更简单的例子,它有着完全相同的问题:

return x, y, z
现在把min带走:


我只能建议你一行一行地工作,直到灯亮为止。你原来的问题应该变得明了。

< P>如果你考虑在第二到最低发生什么,看到递归下面的编辑级别,递归调用,例如,EdDistReVixVIE[[:1 ] ],B[::1 ]将返回一组Its。当程序尝试将作为int的增量值连接到此元组时,将抛出错误。通过使用min,您可以保证返回类型始终相同,并且与您的实现兼容

编辑:让我们一步一步地看一个例子,这样我们可以更直接地查看正在发生的事情。对于这个例子,让我们不要使用min,这样我们就可以看到问题出现的地方

为了简化示例,假设我们从

>>> f(100)
Traceback (most recent call last):
  ...
TypeError: can only concatenate tuple (not "int") to tuple
在执行递归调用的某个时刻,即在每个return语句中执行第一个递归调用之后,我们将达到

edDistRecursive(['x','k','z'], ['y','e','d'])
这就是我所说的递归的最底层,但它实际上是倒数第二层,因为我们即将到达基本情况

所以a=['x']和b=['y']。我们现在进入函数并检查前两个ifs: *莉娜=0吗?不 *lenb==0吗?不 *计算delta=1
*返回edDistRecursivea[:-1],b[:-1]+delta, 埃迪斯特递归A[:-1],b+1, 埃迪斯特递归A,b[:-1]+1

现在Python将对第一个递归调用求值,因为它必须先求值,然后才能实际返回某些内容

第一个递归调用将是edDistRecursive[],[]。现在让我们看看会发生什么: *莉娜=0吗?是,已达到基本情况-返回lenb=0

现在我们回到一个层次,回到前面的return语句: 返回0+1,edDistRecursivea[:-1],b+1,edDistRecursivea,b[:-1]+1

edDistRecursivea[:-1],b将计算为edDistRecursivea[],['y']。 现在让我们检查一下呼叫: *莉娜=0吗?是,达到基本情况-返回lenb=1

再次返回到return语句: 返回0+1,1+1,edDistRecursivea,b[:-1]

edDistRecursivea,b[:-1]将计算为edDistRecursive['x'],[]。 这是在此级别进行评估的最后一次调用: *莉娜=0吗?不 *lenb==0吗?是-返回lena=1

再一次,让我们看看return语句,它现在可以实际返回: 返回1,2,1+1

好的,我们跳入的递归调用的结果是元组1,2,2。 当它返回到 调用它的edDistRecursive表示edDistRecursive['x','k'],['y','e'],此时会引发异常:

edDistRecursive(['x'], ['y'])

我强烈建议您绘制一个类似于此的示例,并检查所有递归步骤。在不使用MIN的情况下尝试它,然后用MIN尝试它,你应该注意到在某个级别返回的内容的差异。

< P>如果你考虑在第二到最低发生什么,查看递归下面的编辑级别,递归调用,例如,EdDistReCurviVA[[:1 ],B[::1 ]将返回一组Its。当程序尝试将作为int的增量值连接到此元组时,将抛出错误。通过使用min,您可以保证返回类型始终相同,并且与您的实现兼容

编辑:让我们一步一步地看一个例子,这样我们可以更直接地查看正在发生的事情。对于这个例子,让我们不要使用min,这样我们就可以看到问题出现的地方

为了简化示例,假设我们从

>>> f(100)
Traceback (most recent call last):
  ...
TypeError: can only concatenate tuple (not "int") to tuple
在执行递归调用的某个时刻,即在每个return语句中执行第一个递归调用之后,我们将达到

edDistRecursive(['x','k','z'], ['y','e','d'])
这就是我所说的递归的最底层,但它实际上是倒数第二层,因为我们即将到达基本情况

所以a=['x']和b=['y']。我们现在进入函数并检查前两个ifs: *莉娜=0吗?不 *lenb==0吗?不 *计算delta=1
*返回edDistRecursivea[:-1],b[:-1]+delta, 埃迪斯特递归A[:-1],b+1, 埃迪斯特递归A,b[:-1]+1

现在Python将对第一个递归调用求值,因为它必须先求值,然后才能实际返回某些内容

第一个递归调用将是edDistRecursive[],[]。现在让我们看看会发生什么: *莉娜=0吗?是,已达到基本情况-返回lenb=0

现在我们回到一个层次,回到前面的return语句: 返回0+1,edDistRecursivea[:-1],b+1,edDistRecursivea,b[:-1]+1

edDistRecursivea[:-1],b将计算为edDistRecursivea[],['y']。 现在让我们检查一下呼叫: *莉娜=0吗?是,达到基本情况-返回lenb=1

再次返回到return语句: 返回0+1,1+1,edDistRecursivea,b[:-1]

edDistRecursivea,b[:-1]将计算为edDistRecursive['x'],[]。 这是在此级别进行评估的最后一次调用: *莉娜=0吗?不 *lenb==0吗?是-返回lena=1

再一次,让我们看看return语句,它现在可以实际返回: 返回1,2,1+1

好的,我们跳入的递归调用的结果是元组1,2,2。 当它返回到调用它的edDistRecursive时,比如说edDistRecursive['x','k'],['y','e'],这时会引发异常:

edDistRecursive(['x'], ['y'])

我强烈建议您绘制一个类似于此的示例,并检查所有递归步骤。在不使用min的情况下进行尝试,然后使用min进行尝试-您应该注意到在某些级别返回的内容有所不同。

问题出现在以下部分:


EDDISTRUSIVEA[:-1],b[:-1]+delta


记住delta是一个数字。您只能在数字中添加一个数字。但是,如果之前对edDistRecursivea[:-1],b[:-1]的调用返回一个元组,比如说1,2,3,那么您正在尝试执行以下计算:

1,2,3+三角洲


这是一个错误

问题出现在以下部分:


EDDISTRUSIVEA[:-1],b[:-1]+delta


记住delta是一个数字。您只能在数字中添加一个数字。但是,如果之前对edDistRecursivea[:-1],b[:-1]的调用返回一个元组,比如说1,2,3,那么您正在尝试执行以下计算:

1,2,3+三角洲


这是一个错误

min是一个函数,parens中的逗号分隔列表是该函数的参数。它将返回其中一个INT。如果没有min,则parens中的逗号分隔列表是一个元组,您无法向元组中添加。min是一个函数,而parens中的逗号分隔列表是该函数的参数。它将返回其中一个INT。如果没有min,parens中以逗号分隔的列表就是一个元组,您无法向元组中添加一个。edDistRecursivea[:-1],b[:-1]本身工作正常。edDistRecursivea[:-1],b[:-1]+delta本身似乎工作正常。而且它不会返回整数元组。它返回一个值。但是如果您删除对min的调用,那么在达到两个基本情况之一之后,第一次将发生。您从递归调用中得到一个结果,它将返回三个值的元组。这就是您遇到错误的时候。通过对min的调用,该方法实际上将返回一个值——否则将作为元组返回的三个值中的最小值。edDistRecursivea[:-1],b[:-1]是唯一的一个输出。并且只返回一个值。除非您讨论的是所有三个递归输出。edDistRecursivea[:-1],b[:-1]单独工作很好。edDistRecursivea[:-1],b[:-1]+de
lta本身似乎工作得很好,而且它不会返回整数元组。它返回一个值。但是如果您删除对min的调用,那么在达到两个基本情况之一之后,第一次将发生。您从递归调用中得到一个结果,它将返回三个值的元组。这就是您遇到错误的时候。通过对min的调用,该方法实际上将返回一个值——否则将作为元组返回的三个值中的最小值。edDistRecursivea[:-1],b[:-1]是唯一的一个输出。并且只返回一个值。除非您讨论的是所有三个递归输出,否则具有多个值的函数是否总是以元组的形式返回?通常,我可以将三个值分配给三个变量,但这也会导致错误。谢谢。我不知道多值函数是什么意思。返回x或返回x返回任何x。返回x,或者返回x,返回一个包含单个元素x的元组。返回x,y或返回x,y返回包含两个元素的元组。等等。构成元组的是逗号,而不是括号。看来你的心理模型比事实更复杂,所以要简化它-嗨,提姆。谢谢你的回复。即使我的输出是一个元组,我的“+delta”操作也会应用于元组的一个元素。为什么这能起作用,而不是我上面的功能?def sumx,y:x=3y=2返回x+1,ySorry,但此时我不知道你在问什么。返回x+1,y返回2元组x+1,y,在给定x=3和y=2的情况下,它只是4,2。如果继续,例如,执行42+sum3,2,那么您将得到一个错误,因为int 42不能添加到元组4,2.42+sum3,2会导致一个错误,因为输出是4,2,对吗?edDistRecursivea[:-1],b[:-1]+delta在删除其他2个递归函数时不会导致错误?我的成绩是5分。输出似乎总是None或int。现在当我返回所有三个函数时,我假设你说的是,当输出是元组时?edDistRecursivea[:-1]、b[:-1]+delta、edDistRecursivea[:-1]、b+1、edDistRecursivea、b[:-1]+1如果是,则不会对整个元组执行我的操作。具有多个值的函数是否始终作为元组返回?通常,我可以将三个值分配给三个变量,但这也会导致错误。谢谢。我不知道多值函数是什么意思。返回x或返回x返回任何x。返回x,或者返回x,返回一个包含单个元素x的元组。返回x,y或返回x,y返回包含两个元素的元组。等等。构成元组的是逗号,而不是括号。看来你的心理模型比事实更复杂,所以要简化它-嗨,提姆。谢谢你的回复。即使我的输出是一个元组,我的“+delta”操作也会应用于元组的一个元素。为什么这能起作用,而不是我上面的功能?def sumx,y:x=3y=2返回x+1,ySorry,但此时我不知道你在问什么。返回x+1,y返回2元组x+1,y,在给定x=3和y=2的情况下,它只是4,2。如果继续,例如,执行42+sum3,2,那么您将得到一个错误,因为int 42不能添加到元组4,2.42+sum3,2会导致一个错误,因为输出是4,2,对吗?edDistRecursivea[:-1],b[:-1]+delta在删除其他2个递归函数时不会导致错误?我的成绩是5分。输出似乎总是None或int。现在当我返回所有三个函数时,我假设你说的是,当输出是元组时?edDistRecursivea[:-1],b[:-1]+delta,edDistRecursivea[:-1],b+1,edDistRecursivea,b[:-1]+1如果是这样,那么我的操作不会对整个元组进行。edDistRecursivea[:-1],b[:-1]本身在递归结束时只返回一个整数。但是,如果增量被添加,它将返回值5。因此递归必须发生5次。如何将增量添加到没有值的递归函数中?递归函数总是返回值。lena或lenb或edDistRecursivea[:-1],b[:-1]+delta,每一个都恰好是一个数字。edDistRecursivea[:-1],b[:-1]本身在递归结束时只返回一个整数。但是,如果增量被添加,它将返回值5。因此递归必须发生5次。如何将增量添加到没有值的递归函数中?递归函数总是返回值。lena或lenb或edDistRecursivea[:-1],b[:-1]+delta,每一个都恰好是一个数字。