【问题标题】:Whats wrong with this python return statement? [duplicate]这个 python return 语句有什么问题? [复制]
【发布时间】:2014-05-16 05:57:55
【问题描述】:

这段代码只是通过分治算法找到最大的数字。代码本身可以完美运行并找到大数并存储在 my_data[0] 中。它正确打印最大的数字。但是当我尝试返回它并存储在“val”变量中时,“无”被存储而不是最大的数字。为什么 return 语句只返回 'none' 而不是 my_data[0].. ??由于返回值不正确,我无法继续执行代码。谁能说这是什么毛病?提前谢谢..

def largest(my_data):
    if len(my_data) == 1:
        print my_data[0]
        return my_data[0]
    else:
        alist = []
        blist = []
        for i in range(0,len(my_data),2):
            if my_data[i] > my_data[i+1]:
                alist.append(my_data[i])
                blist.append(my_data[i+1])
            else:
               alist.append(my_data[i+1])
               blist.append(my_data[i])
        my_data = list(alist)
        largest(my_data)
my_data = [12,45,63,13,76,87,23,85,56,123,7856,132,786,124,756,25366468]
val = largest(my_data)
print val

【问题讨论】:

  • 这并不是真正的分治算法。分而治之将一个问题拆分为多个子问题;例如,对于这个问题,分而治之会将列表一分为二,找到每一半的最大值,然后返回更大的子最大值。
  • 你为什么要经历这一切呢?即使您不能只使用max(my_data),也可以更简单地遍历列表,跟踪您迄今为止看到的最大元素。

标签: python return


【解决方案1】:

当您编写递归代码时,您需要确保递归调用返回的值必须被传播回来。所以,

    largest(my_data)

必须像这样返回

    return largest(my_data)

还有,

my_data = list(alist)

如果您真的想将alist 转换为列表,则不需要此语句。因为它已经是一个列表。所以,你可以直接写

    return largest(alist)

只是好奇,您正在丢弃添加到blist 的值,那么为什么还要添加呢?

所以,如果你真的不需要blist,那么你的代码可以用列表理解来编写,像这样

return largest([my_data[i] if my_data[i] > my_data[i+1] else my_data[i+1]
                  for i in range(0,len(my_data),2)])

【讨论】:

  • 嘿嘿.. 谢谢知道了.. 现在返回正确.. 非常感谢.. 顺便说一句,这只是一个盯着代码.. 还有一些操作要在 blist 上完成:) :)
  • @thefourtheye 谢谢 :)
【解决方案2】:

如果您阅读您的代码,您会注意到else 子句中没有返回任何内容。如果你希望这是一个递归函数,通常的做法是从递归调用中返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 2016-05-26
    • 2019-01-31
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多