鱼C论坛

 找回密码
 立即注册
查看: 891|回复: 4

[已解决]关于函数嵌套的问题

[复制链接]
发表于 2018-12-16 21:50:25 | 显示全部楼层 |阅读模式

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

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

x
第二十讲涉及了函数嵌套的问题,做完课后作业之后回过头来想了一些问题还是觉得不太明了,自己尝试着写了几个嵌套函数也没有成功运行,于是整理了以下问题来求助:


1. 作业中第三题的代码
def outside():
    var = 5
    def inside():
        nonlocal var
        print(var)
        var = 8
        
    inside()
outside()
下面的inside()和outside()是起什么作用?


2. 自己尝试着写了下,但都报错了,分别是为什么呢?
>>> a = 1
         
>>> def fun1():
         nonlocal a *= 2    #我想在fun1()中修改全局变量,但在等号上报错了
         def fun2():
                 a *= 2        #我这边想做的实验是,如果在fun2()中用nonlocal来声明a的话,那么它引用的a会是fun1()中的a还是全局变量的a,但还没进行到这一步
                 return a
         
SyntaxError: invalid syntax
>>> def fun1():
         global a *= 2   #同上
         def fun2():
                 a *= 2    #同上
                 return a
         
SyntaxError: invalid syntax
——————————————————————————————————————
>>> def fun1():
         def fun2():             #尝试着省略fun1()中其他的步骤,直接嵌套fun2(),这一次定义是成功了,但两次调用依然失败了
                 a = 3
                 return a

         
>>> fun1()
         
>>> fun1()()
         
Traceback (most recent call last):
  File "<pyshell#134>", line 1, in <module>
    fun1()()
TypeError: 'NoneType' object is not callable


3. 尝试给函数带上变量,还是报错了,以及注意到作业中的嵌套函数都是没有变量的,所以带变量的嵌套函数究竟应该怎么写呢?
>>> def fun1(x):
         x *= 2
         a = 2
         def fun2(y):
                 y = x * a

         
>>> fun1(3)
         
>>> fun1(3)(2)
         
Traceback (most recent call last):
  File "<pyshell#91>", line 1, in <module>
    fun1(3)(2)
TypeError: 'NoneType' object is not callable

>>> def fun1(x):
         x *= 2
         a = 2
         return x
         def fun2(y):
                 z = y * x * a
                 return z

         
>>> fun1(1)
         
2
>>> fun1(1)(1)
         
Traceback (most recent call last):
  File "<pyshell#103>", line 1, in <module>
    fun1(1)(1)
TypeError: 'int' object is not callable
最佳答案
2018-12-16 23:16:26
本帖最后由 Stubborn 于 2018-12-16 23:27 编辑
  1. def outside():
  2.     var = 5

  3.     def inside():
  4.         nonlocal var   #声明的是上一级函数中的局部变量
  5.         print(var)
  6.         var = 8

  7.     inside()#这里是调用函数

  8. outside()  #这里是调用函数  运行过程是  outside()  然后var=5 函数体不用看
  9.             #,再调用函数。 为什么打印结果是5 自己看 nonlocal
复制代码


nonlocal a *= 2    声明的应该是变量  不是赋值
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。

第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)
---------------------
原文:https://blog.csdn.net/xcyansun/article/details/79672634


  1. a = 1
  2. def fun(a):
  3.     def fun2():
  4.         nonlocal a
  5.         a *=2
  6.         print(a)
  7.     fun2()

  8. fun(a)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-12-16 23:16:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Stubborn 于 2018-12-16 23:27 编辑
  1. def outside():
  2.     var = 5

  3.     def inside():
  4.         nonlocal var   #声明的是上一级函数中的局部变量
  5.         print(var)
  6.         var = 8

  7.     inside()#这里是调用函数

  8. outside()  #这里是调用函数  运行过程是  outside()  然后var=5 函数体不用看
  9.             #,再调用函数。 为什么打印结果是5 自己看 nonlocal
复制代码


nonlocal a *= 2    声明的应该是变量  不是赋值
第一,两者的功能不同。global关键字修饰变量后标识该变量是全局变量,对该变量进行修改就是修改全局变量,而nonlocal关键字修饰变量后标识该变量是上一级函数中的局部变量,如果上一级函数中不存在该局部变量,nonlocal位置会发生错误(最上层的函数使用nonlocal修饰变量必定会报错)。

第二,两者使用的范围不同。global关键字可以用在任何地方,包括最上层函数中和嵌套函数中,即使之前未定义该变量,global修饰后也可以直接使用,而nonlocal关键字只能用于嵌套函数中,并且外层函数中定义了相应的局部变量,否则会发生错误(见第一)
---------------------
原文:https://blog.csdn.net/xcyansun/article/details/79672634


  1. a = 1
  2. def fun(a):
  3.     def fun2():
  4.         nonlocal a
  5.         a *=2
  6.         print(a)
  7.     fun2()

  8. fun(a)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2018-12-16 23:19:28 | 显示全部楼层
1. 作业中第三题的代码
  1. def outside():
  2.     var = 5
  3.     def inside():
  4.         nonlocal var
  5.         print(var)
  6.         var = 8
  7.         
  8.     inside()
复制代码

上面是一个整体, 意思是在函数 outside里面调用  inside()这个函数。最后面不写 inside() 就算你外面 运行outside() 里面的def inside()是不会执行的

然后调用 outside()
  1. outside()
复制代码

=====================================
nonlocal a #先声明
a *=2 #才能使用
======================================
def fun1():
         def fun2():           
                 a = 3
                 return a
        return fun2()# 每个函数都应返回值。这里直接返回fun2() 是说把fun2得到的值返回,也就是说 就是return a


理解这里,后面的自然理解
===============================================================


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

使用道具 举报

 楼主| 发表于 2018-12-17 12:26:03 | 显示全部楼层
Stubborn 发表于 2018-12-16 23:16
nonlocal a *= 2    声明的应该是变量  不是赋值
第一,两者的功能不同。global关键字修饰变量后标识 ...

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

使用道具 举报

 楼主| 发表于 2018-12-17 12:26:34 | 显示全部楼层
ba21 发表于 2018-12-16 23:19
1. 作业中第三题的代码

上面是一个整体, 意思是在函数 outside里面调用  inside()这个函数。最后面不写 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-19 17:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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