• 小甲鱼Python第020讲函数:内嵌函数和闭包 | 课后测试题及参考答案


    测试题:

    0.如果希望在函数中修改全局变量的值,应该使用什么关键字?

      global关键字

    1 count = 5
    2 def Myfun():
    3     global count
    4     count =10
    5     print(count)
    6 Myfun()
    7 print(count)

    1.在嵌套函数中,如果希望在内部函数修改外部函数的局部变量,应该是用什么关键字?

      nonlocal关键字

    1 def Fun1():
    2     x = 5
    3     def Fun2():
    4         nonlocal x
    5         x *=x
    6         return  x
    7     return Fun2()
    8 print(Fun1())

    2.Python的函数可以嵌套,但是要注意访问的作用域问题,请问以下代码存在什么问题呢?

    1 def outside():
    2     print("I am outside!")
    3     def inside():
    4         print("I am inside!")
    5 inside()

       使用嵌套函数要注意一点就是作用域的问题,Inside()函数是内嵌在outside()函数中的,所以inside()只能outside()可以调用,在外边或者别的函数体里是无法对其进行调用的。  

    1 def outside():
    2     print("I am outside!")
    3     def inside():
    4         print("I am inside!")
    5     inside()
    6 outside()

    3.请问为什么代码A没有报错,但是代码B却报错了?应该如何修改?

    代码A:

    1 def outside():
    2     var = 5
    3     def inside():
    4         var = 3
    5         print(var )
    6     inside()
    7 outside()

    代码B:

    1 def outside():
    2     var = 5
    3     def inside():
    4         print(var )
    5         var = 3
    6     inside()
    7 outside()

       代码B中的outside()函数里有一个var变量,但是要注意的是,内嵌函数inside()也有一个同名的变量,Python为了保护变量的作用于,故将outside()的var变量屏蔽起来,因此此时是无法访问到外层的var变量。

    1 def outside():
    2     var = 5
    3     def inside():
    4         nonlocal  var
    5         print(var )
    6         var = 3
    7     inside()
    8 outside()

    4.请问如何访问FunIn()呢?

    1 def funOut():
    2     def funIn():
    3         print("宾果!恭喜成功访问到啦~")
    4     return funIn()

       运行funOut()

    5.请问如何访问FunIn()呢?

    1 def funOut():
    2     def funIn():
    3         print("宾果!恭喜成功访问到啦~")
    4     return funIn

       方法一:调用funout()()

      方法二:g = funout()

          运行g()

    6.以下是“闭包”的一个例子,请你目测下会打印什么内容?

     1 def funX():
     2     x=5
     3     def funY():
     4         nonlocal  x
     5         x+=1
     6         return x
     7     return funY
     8 a=funX()
     9 print(a())
    10 print(a())
    11 print(a())

       输出结果:

    6

    7

    8

    有些鱼油可能会比较疑惑,这……怎么跟全局变量一样了?局部变量x不是应该在每次调用的时候都重新初始化了吗?!

    其实大家仔细看看就明白了,当a = funX()的时候,只要a变量没有被重新赋值,funX()就没有被释放,也就是说局部变量x就没有被重新初始化。
    所以当全局变量不适用的时候,可以考虑使用闭包更稳定和安全,你还可以参考 -> 游戏中的角色移动:闭包在实际开发中的作用
  • 相关阅读:
    Spring--IOC
    神奇的小东西
    视图层发起请求的方式
    jdbc “贾琏欲执事”
    线程的五种状态
    java的<<左移,>>右移,>>>无符号右移
    直接插入排序(单链表排序)
    单链表相关知识以及指针引用相关知识
    将一个数n分解为若干个从小到大排列的质数的积 ,求质数因子
    最小二乘法
  • 原文地址:https://www.cnblogs.com/IT-NXXB/p/12969128.html
Copyright © 2020-2023  润新知