lzb1001 发表于 2023-5-18 14:10:59

这样定义函数为什么是错的

def abc(x, y):
        z = x * y
        return abc()

>>> abc(5, 6)
Traceback (most recent call last):
File "<pyshell#251>", line 1, in <module>
    abc(5, 6)
File "<pyshell#250>", line 3, in abc
    return abc()
TypeError: abc() missing 2 required positional arguments: 'x' and 'y'

isdkz 发表于 2023-5-18 14:11:36

这个函数定义是错误的,因为在函数的返回语句中,它调用了自身,但是没有传入任何参数,导致程序抛出了一个TypeError异常。正确的方式是在函数调用时传入参数,例如:abc(5, 6)。这样,函数就可以正确地执行并返回结果了。

wp231957 发表于 2023-5-18 14:22:23

def abc(x, y):
      z = x * y
      return abc()    难道这里就不需要传参吗

>>> abc(5, 6)你只知道这里传参

wp231957 发表于 2023-5-18 14:25:57

def abc(x, y):
      z = x * y
      return abc(A,B)   即便这里你传了参,那么就涉及到递归函数了,就需要设置递归终止条件,否则就会死循环的

>>> abc(5, 6)

lzb1001 发表于 2023-5-18 14:44:52

本帖最后由 lzb1001 于 2023-5-18 14:50 编辑

isdkz 发表于 2023-5-18 14:11
这个函数定义是错误的,因为在函数的返回语句中,它调用了自身,但是没有传入任何参数,导致程序抛出了一个 ...

没看懂呢,我上面不是:

>>> abc(5, 6)
Traceback (most recent call last):
File "<pyshell#251>", line 1, in <module>
    abc(5, 6)
File "<pyshell#250>", line 3, in abc
    return abc()
TypeError: abc() missing 2 required positional arguments: 'x' and 'y'


还是要下面这样?不过下面这样也不行啊

>>> def abc(x, y):
        z = x * y
        return abc(5, 6)

>>> abc(5, 6)
Traceback (most recent call last):
File "<pyshell#254>", line 1, in <module>
    abc(5, 6)
File "<pyshell#253>", line 3, in abc
    return abc(5, 6)
File "<pyshell#253>", line 3, in abc
    return abc(5, 6)
File "<pyshell#253>", line 3, in abc
    return abc(5, 6)

RecursionError: maximum recursion depth exceeded
>>> abc()
Traceback (most recent call last):
File "<pyshell#255>", line 1, in <module>
    abc()
TypeError: abc() missing 2 required positional arguments: 'x' and 'y'
>>> abc
<function abc at 0x000001AC8D8E04C8>
>>> abc()
Traceback (most recent call last):
File "<pyshell#262>", line 1, in <module>
    abc()
TypeError: abc() missing 2 required positional arguments: 'x' and 'y'
>>> abc(x, y)
Traceback (most recent call last):
File "<pyshell#263>", line 1, in <module>
    abc(x, y)
NameError: name 'x' is not defined
>>> abc(5, 6)
Traceback (most recent call last):
File "<pyshell#264>", line 1, in <module>
    abc(5, 6)
File "<pyshell#260>", line 3, in abc
    return abc(5, 6)
File "<pyshell#260>", line 3, in abc
    return abc(5, 6)
File "<pyshell#260>", line 3, in abc
    return abc(5, 6)

RecursionError: maximum recursion depth exceeded

lzb1001 发表于 2023-5-18 14:47:02

wp231957 发表于 2023-5-18 14:22
def abc(x, y):
      z = x * y
      return abc()    难道这里就不需要传参吗


请大神指点,我别搞糊涂了

lzb1001 发表于 2023-5-18 14:47:49

wp231957 发表于 2023-5-18 14:25
def abc(x, y):
      z = x * y
      return abc(A,B)   即便这里你传了参,那么就涉及到递归函数 ...

大神,那怎么才是对的

wp231957 发表于 2023-5-18 14:58:43

lzb1001 发表于 2023-5-18 14:47
大神,那怎么才是对的

首先你要干什么   才能知道什么是对的

>>> def abc(x, y):
      z = x * y
      return abc(5, 6)

>>> abc(5, 6)
Traceback (most recent call last):
File "<pyshell#254>", line 1, in <module>
    abc(5, 6)
File "<pyshell#253>", line 3, in abc
    return abc(5, 6)
File "<pyshell#253>", line 3, in abc
    return abc(5, 6)
File "<pyshell#253>", line 3, in abc
    return abc(5, 6)

RecursionError: maximum recursion depth exceeded看到这个信息了没,死循环,我在四楼说过了的

lzb1001 发表于 2023-5-18 15:00:21

wp231957 发表于 2023-5-18 14:58
首先你要干什么   才能知道什么是对的

>>> def abc(x, y):


2楼的大神不是说:

……正确的方式是在函数调用时传入参数,例如:abc(5, 6)。这样,函数就可以正确地执行并返回结果了。

isdkz 发表于 2023-5-18 15:06:53

lzb1001 发表于 2023-5-18 15:00
2楼的大神不是说:

……正确的方式是在函数调用时传入参数,例如:abc(5, 6)。这样,函数就可以正确地 ...

但是这跟你引发别的错误不冲突,你的递归变量的值一直没有改变肯定会超出递归的深度的

你先去好好理解一下闭包和递归的概念再回来纠结这个吧

首先我先声明一下闭包和递归没有半毛钱的关系,只是你最近一直纠结的问题都跟这两个有关系

isdkz 发表于 2023-5-18 15:08:45

wp231957 发表于 2023-5-18 14:25
def abc(x, y):
      z = x * y
      return abc(A,B)   即便这里你传了参,那么就涉及到递归函数 ...

他自己也陷死循环里出不来了{:10_250:}

lzb1001 发表于 2023-5-18 15:28:36

越听越糊涂了啊我

wp231957 发表于 2023-5-18 15:58:10

lzb1001 发表于 2023-5-18 15:28
越听越糊涂了啊我

return 只能在函数中使用
return可以返回立即数(比较常用)
return可以返回函数地址(一般闭包中使用)
return   可以返回函数自己(递归中使用,比较常用)
return   可以返回空值(比如 print函数)

sfqxx 发表于 2023-5-20 12:10:01

这段代码中报错是因为函数 abc() 调用了自己,并且没有传入必要的参数,导致递归过程中出现了缺少参数的错误。

具体来说,在 abc() 函数内部,它调用了 abc() 自身,并且没有传入任何参数,这意味着在递归过程中,每次调用 abc() 都会缺少必要的两个参数,从而导致 TypeError 错误。因此,您需要在 return abc() 语句中传入适当的参数,以便递归过程可以正常进行。

您可以尝试将代码修改如下:
def abc(x, y):
    z = x * y
    return abc(x-1, y-1) if x > 1 and y > 1 else z

print(abc(5, 6))
在这里,我们利用了递归来计算 x 和 y 的乘积,直到其中一个参数小于等于 1 时停止递归。对于每次递归,我们使用 x-1 和 y-1 作为新的参数传入,以便逐步逼近停止条件。最终,我们返回计算得到的乘积 z。

亲测可以运行

Lynn_oyl 发表于 2023-5-25 20:09:10

因为最后一行return abc()没有参数x和y,所以报错
可以这样改:
def abc(x, y):
      z = x * y
      return z
页: [1]
查看完整版本: 这样定义函数为什么是错的