鱼C论坛

 找回密码
 立即注册
查看: 5445|回复: 13

函数没有返回值的问题?

[复制链接]
发表于 2016-7-23 18:59:38 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 shuofxz 于 2016-7-23 20:58 编辑

如下代码,是一个递归调用的函数。比如输入5的时候,test(5),在执行最后一次递归的时候temp=0,进入到else里面,执行的时候发现这行代码是执行了的 print("return前输出的语句"),但是却没有打印出100来,是return没有执行吗?
  1. def test(temp):
  2.     #默认输入一个大于零的整数
  3.     if temp:
  4.         print(temp)
  5.         print('A')
  6.         temp = temp // 2
  7.         test(temp)
  8.         print('B')
  9.     else:
  10.         print("return前输出的语句")
  11.         return 100
  12.         print("return后输出的语句")
复制代码

193234r0tqqcwsctmhg3dh.jpg


还有第二种情况,我把return语句写到了if判断的外面,递归的时候多次执行了这个函数,然而最后的输出却只打印了一个100,这是为什么?
  1. def test(temp):
  2.     #默认输入一个大于零的整数
  3.     if temp:
  4.         print(temp)
  5.         print('A')
  6.         temp = temp // 2
  7.         test(temp)
  8.         print('B')
  9.     else:
  10.         print("return前输出的语句")
  11.     return 100
  12.     print("return后输出的语句")
复制代码

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

使用道具 举报

发表于 2016-7-23 19:21:14 | 显示全部楼层
本帖最后由 SixPy 于 2016-7-23 19:34 编辑

递归很简单的
假设你的 temp = 3
共运行 3//2=1;1//2=0 ,3 次

那么,就把你的test() 函数复制3份
然后,分别改名为 test1 、test2 、test3
3个函数内容都一样,只是名字不同
test1 中的递归改为调用test2
test2 中的递归改为调用test3

最后,你用debug调试模式,单步执行,看看执行过程,就明白了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-23 19:32:54 | 显示全部楼层
SixPy 发表于 2016-7-23 19:21
递归很简单的
假设你的 temp = 6
共运行 6//2=3 次

恩,递归的过程我明白,
我想问的是:我在函数里面写了返回值,而且我单步调试的时候也确实发现执行到了return 100那一步,但是最后的输出却没有100
搜狗截图20160723193206.jpg
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 19:38:47 | 显示全部楼层
shuofxz 发表于 2016-7-23 19:32
恩,递归的过程我明白,
我想问的是:我在函数里面写了返回值,而且我单步调试的时候也确实发现执行到了 ...

呵呵~

return 只是返回,然而你没安排变量去接收啊~ 100被丢弃了~

pirnt 才是输出到终端~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-23 19:48:37 | 显示全部楼层
SixPy 发表于 2016-7-23 19:38
呵呵~

return 只是返回,然而你没安排变量去接收啊~ 100被丢弃了~

搜狗截图20160723194715.jpg
我觉得return的值应该直接输出的吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 19:53:25 | 显示全部楼层
shuofxz 发表于 2016-7-23 19:48
我觉得return的值应该直接输出的吧

那是你的错觉~
交互模式下,Python会安排一个默认变量 '_' 去接收返回值。

你可以试一下
val = _
print(val)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-23 20:12:15 | 显示全部楼层
SixPy 发表于 2016-7-23 19:53
那是你的错觉~
交互模式下,Python会安排一个默认变量 '_' 去接收返回值。

val = _
print(val)
这两句怎么用呀?直接运行会报错呀

还有我不觉得是我的错觉。。。你看我的第二个例子的输出
搜狗截图20160723201024.jpg
这里面return就有返回值,(但是只有一个100也是我不解的地方,我觉得每次递归执行这个函数都应该输出一个100,而不是只有一个,就像我题目里描述的那样)
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 20:34:53 | 显示全部楼层
shuofxz 发表于 2016-7-23 20:12
val = _
print(val)
这两句怎么用呀?直接运行会报错呀
  1. >>> def f():
  2.         return 5

  3. >>> f()
  4. 5
  5. >>> val=_
  6. >>> print(val)
  7. 5
  8. >>>
复制代码

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

使用道具 举报

 楼主| 发表于 2016-7-23 20:38:49 | 显示全部楼层

好神奇   学到了!
但是我还是不能理解,我在题目里面描述的,为什么第一种情况就没打印出100来,第二种情况只打印出一个100
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 21:15:03 | 显示全部楼层
shuofxz 发表于 2016-7-23 20:38
好神奇   学到了!
但是我还是不能理解,我在题目里面描述的,为什么第一种情况就没打印出100来,第二种 ...
  1. def test(temp):
  2.     #默认输入一个大于零的整数
  3.     if temp:
  4.         print(temp)
  5.         print('A')
  6.         temp = temp // 2
  7.         test(temp)
  8.         print('B')
  9.     else:
  10.         print("return前输出的语句")
  11.     return 100
  12.     print("return后输出的语句")
  13.    
  14. test(3)   
  15. input()
复制代码

添加一个input暂停一下
你不要用idle等交互界面来运行
而是直接双击py文件执行,看看有没有显示100

理由看6楼,还是你的错觉~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 21:28:13 | 显示全部楼层
简单的来说,第一种情况下,你的第一层递归函数没有执行return 100,而第二种情况下第一曾递归函数执行了return 100。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-23 21:46:46 | 显示全部楼层
哦哦,确实是。  非常感谢~  之前一直没注意到这个问题
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-23 21:49:11 | 显示全部楼层
YB_kun 发表于 2016-7-23 21:28
简单的来说,第一种情况下,你的第一层递归函数没有执行return 100,而第二种情况下第一曾递归函数执行了re ...

现象确实是这样,不过能说下问什么吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-23 22:13:30 | 显示全部楼层
YB_kun 发表于 2016-7-23 21:28
简单的来说,第一种情况下,你的第一层递归函数没有执行return 100,而第二种情况下第一曾递归函数执行了re ...

呃~~~~~~~~~
你的理解是错的~
你用调试模式单步执行,就知道了~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 21:21

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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