davidmou 发表于 2023-10-6 00:52:05

返回值问题

from pythonds.basic import Stack
ub = Stack()
def jinzhizhuanhua(num, fundamention):
    dic = "0123456789ABCDEF"
    if num < fundamention:
      ub.push(dic)
      return ub
    else:
      ub.push(dic)
      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类型的吗

isdkz 发表于 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 类型的对象。修改后的代码如下所示:

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

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

Mike_python小 发表于 2023-10-6 00:52:48

问题分析:
在函数jinzhizhuanhua中,当num小于fundamention时,执行ub.push(dic)和return ub语句。但是在该情况下,函数没有显式地返回一个值,因此默认返回None。所以在调用jinzhizhuanhua函数后,ub的值为None,而不是期望的Stack类型。

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

修改后的代码如下:


from pythonds.basic import Stack

def jinzhizhuanhua(num, fundamention):
    dic = "0123456789ABCDEF"
    ub = Stack()# 创建一个新的 Stack 对象
    if num < fundamention:
      ub.push(dic)
      return ub
    else:
      ub.push(dic)
      return jinzhizhuanhua(int(num // fundamention), fundamention)

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


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

球一个最佳答案谢谢啦!这对我非常重要!{:10_254:}{:10_254:}{:10_254:}
页: [1]
查看完整版本: 返回值问题