机器学习与数据挖掘Python札记呆鸟的Python数据分析

Python札记21_嵌套函数

2019-06-29  本文已影响6人  皮皮大

在上一篇 Python札记20_递归、传递 文章中重点介绍了递归函数中的斐波那契数列的实现,以及函数当做参数进行传递的知识。函数不仅可以当做对象进行传递,还能在函数里面嵌套另一个函数,称之为函数嵌套

通过一个例子来进行理解,嵌套函数的使用:

def foo():   # foo()函数中内嵌了bar函数
    def bar():
        print("bar() is running")
    print("foo() is running")

foo()  # 运行结果显示bar没有被调用和执行

结果

foo() is running

如果想让bar()执行,进行如下操作:

def foo():   # foo()函数中内嵌了bar函数
    def bar():
        print("bar() is running")
    bar()  # 调用bar函数:只有当bar被调用,才会执行bar函数的代码块
    print("foo() is running")
foo()

结果:

bar() is running
foo() is running
image.png

函数bar是在foo里面进行定义的,它的作用域只在foo函数范围之内;如果把bar函数放在外面执行,调用则会报错:

同时bar的变量也会受到far函数的约束:

def foo():
   a = 1
   def bar():
       a = a + 1
       print("bar()a=", a)
   bar()
   print("foo()a=", a)
foo()`

运行报错:

UnboundLocalError                         Traceback (most recent call last)
<ipython-input-23-0c4c07078810> in <module>
      6     bar()
      7     print("foo()a=", a)
----> 8 foo()

<ipython-input-23-0c4c07078810> in foo()
      4         a = a + 1
      5         print("bar()a=", a)
----> 6     bar()
      7     print("foo()a=", a)
      8 foo()

<ipython-input-23-0c4c07078810> in bar()
      2     a = 1
      3     def bar():
----> 4         a = a + 1
      5         print("bar()a=", a)
      6     bar()

UnboundLocalError: local variable 'a' referenced before assignment

使用nonlocal关键字来解决:

def foo():
    a = 1
    def bar():
        nonlocal a    # 指定a不是bar内部的局部变量。
        a = a + 1
        print("bar()a=", a)
    bar()
    print("foo()a=", a)
foo()
image.png

注意a值的变化

def foo():
    a = 1
    def bar():
        a = 1   # a是bar函数的局部变量
        a = a + 1
        print("bar()a=", a)
    bar()
    print("foo()a=", a)
foo()
image.png
def foo():
    a = 1
    def bar(a):    # 给bar传递参数
        a = a + 1
        print("bar()a=", a)
    bar(a)
    print("foo()a=", a)
foo()
image.png

嵌套函数的实际使用:计算重力的函数

def weight(g):
    def cal_mg(m):
        return m * g
    return cal_mg   # weight函数的返回值是cal_mg函数执行的结果

w = weight(9.8)   # 参数g = 9.8
mg = w(5)  # 参数m = 5
mg

理解:

上一篇 下一篇

猜你喜欢

热点阅读