鱼C论坛

 找回密码
 立即注册
查看: 2062|回复: 14

[已解决]这样定义函数为什么是错的

[复制链接]
发表于 2023-5-18 14:10:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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'
最佳答案
2023-5-18 14:25:57
def abc(x, y):
        z = x * y
        return abc(A,B)   即便这里你传了参,那么就涉及到递归函数了,就需要设置递归终止条件,否则就会死循环的

>>> abc(5, 6)  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-18 14:11:36 | 显示全部楼层
这个函数定义是错误的,因为在函数的返回语句中,它调用了自身,但是没有传入任何参数,导致程序抛出了一个TypeError异常。正确的方式是在函数调用时传入参数,例如:abc(5, 6)。这样,函数就可以正确地执行并返回结果了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-18 14:22:23 | 显示全部楼层
def abc(x, y):
        z = x * y
        return abc()    难道这里就不需要传参吗

>>> abc(5, 6)  你只知道这里传参
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-18 14:25:57 | 显示全部楼层    本楼为最佳答案   
def abc(x, y):
        z = x * y
        return abc(A,B)   即便这里你传了参,那么就涉及到递归函数了,就需要设置递归终止条件,否则就会死循环的

>>> abc(5, 6)  
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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)
  [Previous line repeated 1021 more times]
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)
  [Previous line repeated 1021 more times]
RecursionError: maximum recursion depth exceeded
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-18 14:47:02 | 显示全部楼层
wp231957 发表于 2023-5-18 14:22
def abc(x, y):
        z = x * y
        return abc()    难道这里就不需要传参吗

请大神指点,我别搞糊涂了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

大神,那怎么才是对的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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)
  [Previous line repeated 1021 more times]
RecursionError: maximum recursion depth exceeded  看到这个信息了没,死循环,我在四楼说过了的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-18 15:00:21 | 显示全部楼层
wp231957 发表于 2023-5-18 14:58
首先你要干什么   才能知道什么是对的

>>> def abc(x, y):

2楼的大神不是说:

……正确的方式是在函数调用时传入参数,例如:abc(5, 6)。这样,函数就可以正确地执行并返回结果了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-18 15:06:53 | 显示全部楼层
lzb1001 发表于 2023-5-18 15:00
2楼的大神不是说:

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

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

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

首先我先声明一下闭包和递归没有半毛钱的关系,只是你最近一直纠结的问题都跟这两个有关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

他自己也陷死循环里出不来了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-5-18 15:28:36 | 显示全部楼层
越听越糊涂了啊我
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-18 15:58:10 | 显示全部楼层
lzb1001 发表于 2023-5-18 15:28
越听越糊涂了啊我

return 只能在函数中使用
return  可以返回立即数(比较常用)
return  可以返回函数地址(一般闭包中使用)
return   可以返回函数自己(递归中使用,比较常用)
return   可以返回空值  (比如 print函数)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-20 12:10:01 | 显示全部楼层
[b]这段代码中报错是因为函数 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。

亲测可以运行
[/b]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-25 20:09:10 | 显示全部楼层
因为最后一行
return abc()
没有参数x和y,所以报错
可以这样改:
def abc(x, y):
        z = x * y
        return z
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-23 01:37

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表