鱼C论坛

 找回密码
 立即注册
查看: 2392|回复: 2

返回值问题

[复制链接]
发表于 2023-10-6 00:52:05 | 显示全部楼层 |阅读模式

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

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

x
from pythonds.basic import Stack
ub = Stack()
def jinzhizhuanhua(num, fundamention):
    dic = "0123456789ABCDEF"
    if num < fundamention:
        ub.push(dic[num])
        return ub
    else:
        ub.push(dic[num % fundamention])
        jinzhizhuanhua(int(num//fundamention),fundamention)


ub = jinzhizhuanhua(10, 2)
for i in range(ub.size()):
    print(ub.peek(), end="")

问一下为什么会有Nonetype 的错误:'NoneType' object has no attribute 'size',返回值不应该是Stack类型的吗

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-6 00:52:21 | 显示全部楼层
在函数 jinzhizhuanhua(num, fundamention) 中,当 num < fundamention 时,虽然将 num 转换成相应进制的结果压入了栈 ub 中,但没有显示地返回 ub。因此,当 num < fundamention 时,函数没有返回值,即返回 None。因此,当调用 jinzhizhuanhua(10, 2) 时,ub 并没有被赋值为 Stack 类型的对象,而是 None。因此,在调用 ub.size() 时,会出现 'NoneType' object has no attribute 'size' 的错误。

为了解决这个问题,可以在 num < fundamention 的情况下,显示地返回 ub,即 return ub。这样,当 num < fundamention 时,函数也会返回一个 Stack 类型的对象。修改后的代码如下所示:

  1. from pythonds.basic import Stack
  2. ub = Stack()
  3. def jinzhizhuanhua(num, fundamention):
  4.     dic = "0123456789ABCDEF"
  5.     if num < fundamention:
  6.         ub.push(dic[num])
  7.         return ub
  8.     else:
  9.         ub.push(dic[num % fundamention])
  10.         jinzhizhuanhua(int(num//fundamention),fundamention)
  11.         return ub

  12. ub = jinzhizhuanhua(10, 2)
  13. for i in range(ub.size()):
  14.     print(ub.pop(), end="")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-6 00:52:48 | 显示全部楼层
问题分析:
在函数jinzhizhuanhua中,当num小于fundamention时,执行ub.push(dic[num])return ub语句。但是在该情况下,函数没有显式地返回一个值,因此默认返回None。所以在调用jinzhizhuanhua函数后,ub的值为None,而不是期望的Stack类型。

解决方案:
在函数结束前,添加一个返回语句,返回最终的ub值。

修改后的代码如下:
  1. from pythonds.basic import Stack
  2. def jinzhizhuanhua(num, fundamention):
  3.     dic = "0123456789ABCDEF"
  4.     ub = Stack()  # 创建一个新的 Stack 对象
  5.     if num < fundamention:
  6.         ub.push(dic[num])
  7.         return ub
  8.     else:
  9.         ub.push(dic[num % fundamention])
  10.         return jinzhizhuanhua(int(num // fundamention), fundamention)
  11. ub = jinzhizhuanhua(10, 2)
  12. for i in range(ub.size()):
  13.     print(ub.peek(), end="")
复制代码

请注意:在递归调用 jinzhizhuanhua 函数时,需要将结果返回给调用者,即使用 return jinzhizhuanhua(...) 而不是仅仅调用 jinzhizhuanhua(...)

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-23 00:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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