函数作用域和匿名函数


一、匿名函数

- lambda # 关键字 和三目运算一样,做一些简单的函数定义,使代码更加简洁
    - 语法规则:
  lambda <参数>:表达式

  filter(lambda x: x>10, li)

  d = lambda a,b:a+b
  d(1,2)

    - 应用场景:

  1.简单函数:简单的函数可以不使用def定义一个函数,使用匿名函数即可
  2.函数调用:类似于filter、map等函数里面,可以使用匿名函数来处理
  3.提高开放效率:名函数的合理利用能够让那个代码更加简洁


二、函数作用域
    - 函数里面可以访问函数外面的变量
    - 定义在函数里面的变量,函数外面是不能访问的
    - 在函数里面可以访问最外面的(不可变)变量,但是不能对它修改,但可变类型(list set dict bytearray)就可以修改
    - 函数外面定义的变量和函数里面定义的变量重名时,他们不是一个变量。函数里面的变量不影响外面的变量

- global和nonlocal
    - global
  a = 1 # 全局变量

  def yu():
    global a # global 关键字 声明a是全局变量,声明后在函数内部就可以修改这个变量
    a = a+519
    print(a)
  yu()

    -nonlocal
  def yu():
  a = 1 # 局部变量 在嵌套函数的时候会使用
    def lo():
      nonlocal a # 声明这个a是局部变量
      a = a + 519
      print(a)
    lo()

  yu()

三、闭包

外部调用函数内层的函数:由于作用域的问题,外部不能调用内部的变量,因此需要闭包。

  def outside():

    print('外层函数')

    def inside():                #  函数里面嵌套函数

      print(‘内层函数’)

    return inside     # 返还的是内层的函数名,是个变量,通过 函数名后面加()实现这个内层函数的调用。

  a = outside()    #  这里a的值为 inside 的函数名

  a()    #   也可以是 outside()() 实现了直接调用内层函数。  
注意:

  1. 函数的名字就相当于一个变量

  2. 闭包可以得到外层函数的局部变量(通过return内层的函数名实现),是函数内部与外部沟通的桥梁。


四、递归和回调函数

- 递归:

  def sleep(a):

    if a == 5:

      return 1

    print('睡了+%s'%a)

    return sleep(a+1)+a

  print(sleep(0))   # 输出结果为11 :0+1+2+3+4+1 和 第一个print()的内容。

- 阶乘:把上例子的return中的 +a 变为*a,即可实现阶乘

    return sleep(a+1)*a

  print(sleep(1))   # 输出的数值结果变为24:1*2*3*4*1

递归的关键点:是通过返回函数调用来实现的,注意要加判断条件终止函数调用,否则就是死循环。

 

- 回调:

回调函数本身是一个函数,只是被传入另一个函数当中,供其调用。回调函数不一定会被调用,是否调用由被传入函数的内部逻辑决定。

def fun_a():
print('回调函数,快来调用我')

def fun_b(fun):
fun() # 之前可加判断条件,来实现是否启用回调函数。
print('我自己的功能')

fun_b(fun_a)


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM