鱼C论坛

 找回密码
 立即注册
查看: 3034|回复: 8

不太懂return语句

[复制链接]
发表于 2019-11-20 11:49:35 | 显示全部楼层 |阅读模式

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

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

x
  1. def fun1():
  2.     x=5
  3.     def fun2():
  4.         nonlocal x
  5.         x+=x
  6.         return x
  7.     fun2()
  8.     return fun2()
  9. fun1()
  10.         
复制代码

问题1:请问这里为什么输出为20不是10,我的理解是return x把x等于10的值返还给fun2,当运行return fun2的时候,把fun2又运行一遍了,并把再次运行之后fun2等于20的值返还给fun1,不知道对不对。
问题2:请问如果我猜想的对的话,我能理解变量能被返回值,但是为什么fun2 fun1作为函数名也能够被return语句赋值,比如这里的return fun2语句是把fun2的函数值返还给函数名fun1吗,还是返还给fun1里面的x
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-11-20 11:56:36 | 显示全部楼层
单单纯纯的赋值,没了,前后运行两回,最终返回的是个地址,指向变量 x 的值的地址,
所谓的返回,形象点儿就是,原本调用函数的地方,整个这一次调用函数的位置,那一块儿就变成了这个函数的返回值。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-20 12:00:14 | 显示全部楼层
阴阳神万物主 发表于 2019-11-20 11:56
单单纯纯的赋值,没了,前后运行两回,最终返回的是个地址,指向变量 x 的值的地址,
所谓的返回,形象点 ...

为什么return fun2的语句会把fun2这个函数又调用一次呢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-20 12:13:49 | 显示全部楼层
AsceLu 发表于 2019-11-20 12:00
为什么return fun2的语句会把fun2这个函数又调用一次呢


如果那里单单只有函数名的话,那就是把函数给返回了,但是函数名后边贴着的是括号的话,那么就会被认为是调用该函数,这是规定,return 是最后才会去执行的,程序在读到 return 这种表示返回的关键字的时候,首先会检查右边的东西,按照一般的语句来,当 return 右边的执行完了,把得到的那个值返回到调用那个函数的位置。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-11-20 12:26:17 | 显示全部楼层
阴阳神万物主 发表于 2019-11-20 12:13
如果那里单单只有函数名的话,那就是把函数给返回了,但是函数名后边贴着的是括号的话,那么就会被认为 ...

我还是不太懂return语句是把返回值返回给谁,比如说这里一共有return x ,return fun2两个语句,能拜托你分别说一下值都返回给谁了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-20 13:35:37 | 显示全部楼层
AsceLu 发表于 2019-11-20 12:26
我还是不太懂return语句是把返回值返回给谁,比如说这里一共有return x ,return fun2两个语句,能拜托你 ...

不一定能返回给谁呢。
比如 07. 行 的调用,是 06. 的 return x 值没有给谁,只是改了 02. 行定义的 x 的值
08. 行的 return fun2() 在函数调用完了后,就变成了 return 20
09. 行的 fun1() 调用函数,得到的就是 08. 行的 20
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-20 16:57:35 | 显示全部楼层
本帖最后由 jackz007 于 2019-11-20 16:59 编辑
AsceLu 发表于 2019-11-20 12:26
我还是不太懂return语句是把返回值返回给谁,比如说这里一共有return x ,return fun2两个语句,能拜托你 ...

  1. def add(a , b):
  2.     return a + b

  3. def function1():
  4.     def function2():
  5.         print("Hi, I'm in function2() now")
  6.     return function2

  7. k = add(3 , 2)
  8. d = function1()
  9. d()
复制代码


        在本例中,函数 add() 的 return 语句把计算结果返回给了 k,k 的值就是 3 + 2 = 5,function1() 把内嵌函数 function2() 的调用地址返回给了 d,d() 就是对 function1() 的内嵌函数 function2() 的调用。
        所以,函数中的 return 语句有两个作用,第一个作用是终止函数调用,从函数中返回;第二个作用是把变量返回给调用者,谁调用就返回给谁。

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

使用道具 举报

发表于 2019-11-20 19:39:23 | 显示全部楼层
AsceLu 发表于 2019-11-20 12:26
我还是不太懂return语句是把返回值返回给谁,比如说这里一共有return x ,return fun2两个语句,能拜托你 ...

不一定返回给同一个函数或程序。 return x 是 fun2 函数的返回,当调用 fun2,x 就会返回到它调用的函数或程序中,例如这个例子中的 return fun2(),就是返回 fun2 函数的返回值 --> x。return fun2() 是将 fun2 的返回值 --> x 返回给调用 fun1 的函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-21 17:42:03 | 显示全部楼层
return能返回任何东西。只要你想让它返回。
执行到return这个函数就结束了。
fun()这是调用函数,调用一次就改变被申明为nonlocal 的x的值
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-20 22:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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