鱼C论坛

 找回密码
 立即注册
查看: 1337|回复: 10

[已解决]python return相关问题

[复制链接]
发表于 2020-8-16 18:42:34 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 李万金 于 2020-8-16 18:43 编辑

我做leedcode上一道题,给定一个包括n个整数的数组nums;和 一个目标值target。找出nums中的三个整数,使得它们的和与targe最接近。返回这三个数的和。
在打代码的时候,发现如果没有下面标红的一段代码:return res,测试的时候没有结果,按ctrl + c 报错(已截图)
最后一行不是有一个返回吗,为什么还要再加一个return,有大佬知道吗
class Solution:
    def threeSumClosest(self, nums: List[int], target: int) -> int:
        n = len(nums)
        res = float('inf')
        if not nums: return 0
        if n < 3:return sum(nums)
        nums.sort()
        for i in range(n):
            L = i + 1
            R = n - 1

            while L < R:
                t = nums[i] + nums[L] + nums[R]
                if abs(t - target) < abs(res - target):
                    res = nums[i] + nums[L] + nums[R]
                if t < target:
                    L += 1
                elif t > target:
                    R -= 1
                else:
                    res = t
                    return res
        return res

最佳答案
2020-8-16 20:26:11
李万金 发表于 2020-8-16 20:16
class Solution:
    def threeSumClosest(self, nums, target):
        n = len(nums)


哦哦,确实是我理解错题意了,抱歉

你如果去掉 return ,对于你这里的测试代码,导致 while 第一次进入循环,前面的 if 和  elif 条件都不满足,直接只执行了 else

而对 L 、R 的值未进行改变,所以导致下次循环还是原先的 L 和 R 的值,陷入死循环

20200816183631.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-8-16 18:54:14 | 显示全部楼层
本帖最后由 Twilight6 于 2020-8-16 18:57 编辑

最后一行不是有一个返回吗,为什么还要再加一个return?


一个 return 在 while 循环内部,所以前提要符合 while 的循环条件才能进入循环

而且 while 循环中只有 else 设置了 return ,则只有当 else 上面的  if 和 elif 条件都不成立才会执行这个 return ,如果没有循环外的 return

那么执行代码时候,如果循环根本没有进入,或者循环过程中 if 和 elif 条件总有一个满足时退出 while 循环,就会导致你没有设置 reuturn ,返回 None 了

而且这个代码可以正常执行,有返回结果:
6.png

测试代码:
class Solution:
    def threeSumClosest(self, nums, target: int) -> int:
        n = len(nums)
        res = float('inf')
        if not nums: return 0
        if n < 3:return sum(nums)
        nums.sort()
        for i in range(n):
            L = i + 1
            R = n - 1

            while L < R:
                t = nums[i] + nums[L] + nums[R]
                if abs(t - target) < abs(res - target):
                    res = nums[i] + nums[L] + nums[R]
                if t < target:
                    L += 1
                elif t > target:
                    R -= 1
                else:
                    res = t
                    return res
        return res
test = Solution()
print(test.threeSumClosest([0,1,2],3))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-16 19:22:39 | 显示全部楼层
Twilight6 发表于 2020-8-16 18:54
一个 return 在 while 循环内部,所以前提要符合 while 的循环条件才能进入循环

而且 while 循环中 ...

我标红的是循环里面的return,没这个return无法执行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-16 19:34:41 | 显示全部楼层
李万金 发表于 2020-8-16 19:22
我标红的是循环里面的return,没这个return无法执行



这个不就是循环过程中 前面的 if 和 elif 不满足时候 提前返回结果啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-16 19:40:49 | 显示全部楼层
Twilight6 发表于 2020-8-16 19:34
这个不就是循环过程中 前面的 if 和 elif 不满足时候 提前返回结果啊


大佬,我是萌新。很多都不懂。我不明白的是既然循环里面执行了res = t,res有值,最后一行的return res,不把res返回了吗。倒数第二行的return res不应该可有可无吗?但在测试的时候不能没有。我很奇怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-16 19:48:24 | 显示全部楼层
李万金 发表于 2020-8-16 19:40
大佬,我是萌新。很多都不懂。我不明白的是既然循环里面执行了res = t,res有值,最后一行的return res ...


你 while 循环,是只有在  L 不小于 R 的时候才直接 return res

但是你在 while 循环过程中,如果 L 还是 小于 R 的,而且 if 和 elif 条件都不满足时候就提前返回 return res

而不是当你循环到 while 的 L<R 条件不满足时候才返回

具体你找测试时候的值,拿去调试看看就知道了,结果会不一致的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-16 20:12:40 | 显示全部楼层
Twilight6 发表于 2020-8-16 19:48
你 while 循环,是只有在  L 不小于 R 的时候才直接 return res

但是你在 while 循环过程中,如果 L ...

是代码不能运行,不是结果不一致。我的表达不清楚吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-16 20:13:14 | 显示全部楼层
李万金 发表于 2020-8-16 20:12
是代码不能运行,不是结果不一致。我的表达不清楚吗

结果不一致导致你力扣测试不过就会错误啊,代码是可以运行的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-8-16 20:16:30 | 显示全部楼层
Twilight6 发表于 2020-8-16 20:13
结果不一致导致你力扣测试不过就会错误啊,代码是可以运行的

class Solution:
    def threeSumClosest(self, nums, target):
        n = len(nums)
        res = float('inf')
        if not nums: return 0
        if n < 3:return sum(nums)
        nums.sort()
        for i in range(n):
            L = i + 1
            R = n - 1            
            while L < R:
                t = nums[i] + nums[L] + nums[R]
                if abs(t - target) < abs(res - target):
                    res = t
                if t < target:L += 1
                    
                elif t > target:
                    R -= 1
                else:
                    res = t
        return res
我在提问中说了没有倒数第二行,标红的代码,输入上面图中的实例不能运行。我奇怪的是这一点,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-8-16 20:26:11 | 显示全部楼层    本楼为最佳答案   
李万金 发表于 2020-8-16 20:16
class Solution:
    def threeSumClosest(self, nums, target):
        n = len(nums)


哦哦,确实是我理解错题意了,抱歉

你如果去掉 return ,对于你这里的测试代码,导致 while 第一次进入循环,前面的 if 和  elif 条件都不满足,直接只执行了 else

而对 L 、R 的值未进行改变,所以导致下次循环还是原先的 L 和 R 的值,陷入死循环

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

使用道具 举报

 楼主| 发表于 2020-8-16 20:29:10 | 显示全部楼层
Twilight6 发表于 2020-8-16 20:26
哦哦,确实是我理解错题意了,抱歉

你如果去掉 return ,对于你这里的测试代码,导致 while 第一次 ...

厉害,大佬一眼就看出来了,我想了半天
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-19 08:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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