第五章 python的函数(5):函数嵌套和匿名函数

在这一篇,我们来聊一下函数嵌套和匿名函数。

5.4.3 函数嵌套

函数嵌套:函数内定义的函数

作用:装饰器(以后学习)

  • 作用域:
    • python中,一个函数是一个作用域。(JAVA中代码块是作用域,比如if内部)
    • 作用域中查找数据的规则:优先在自己的作用域找,如果没有就在"父级作用域"找 -> 直到全局。全局没有就报错。
      ```python
      v = 10
      def func1():
      v = 9 # 函数内的变量和函数外的同名变量是完全独立的个体。
      print(v) # 打印 9
      def func2():
      v = 999 # 在自己的作用域创建一个变量,不会影响父作用域的同名变量。想影响可以用global,nonlocal
      print(v) # 打印自身函数中的变量v
      func2() # 打印 999
      print(v) # 打印 9

      func1()
      ```
    • 子作用域只能读取父作用域的同名变量的值,默认不能重新赋值(注意这里是'赋值'不是'修改')父作用域的变量(因为子作用域的同名变量是独立的新个体)。

      但是可以对可变类型的数据进行修改
      python list1 = [1,2,3] def func1(): list1.append(999) # list1 = 1 # 如果这里声明局部变量list1,python解释器就会把这个作用域中的list1.append(999)当做是对局部变量list1操作,会报错 func1() print(list1)

    • 用 global 关键字可以在子作用域中重新赋值全局变量。(不推荐使用,影响可读性)
      python name = 'global name' def func1(): name = 'nonlocal name' def inner(): global name # 全局变量 list1 name = 'new name' inner() print(name) func1() print(name)
    • 用 nonlocal 关键字,可以在子作用域中重新赋值父级作用域的变量。(不推荐使用,影响可读性)
      name = 'global name' def func1(): name = 'nonlocal name' def inner(): nonlocal name # func1()里的 name name = 'new name' inner() print(name) func1() print(name)

变量命名:全局变量用纯大写,局部变量用小写(程序猿的常识)

5.5 匿名函数(lambda)

匿名函数:顾名思义,就是没有名字的函数(lambda)

适用范围:最复杂的也就是写个三元运算(因为只能写一行)

匿名函数定义:

# def func1(x,y):
#    return x**y

c = lambda x,y:x**y  # 匿名函数定义。效果等同于func1,这里犹豫要调用,所以把匿名函数赋值给c

print(c(2,4))  # 调用c的时候需要加()
  • 匿名函数作用:
    • 减少不必要的函数命名
    • 匿名函数和其他函数搭配使用
    res = map(lambda x:x*2, [1,2,3,4,5])  # 将列表的值依次交给左边的函数运算res = map(lambda x:x*2, [1,2,3,4,5])
    print(res)  # 返回的是object,可以用for循环来输出,或者用list()转换成列表
    for i in res:
      print(i)
  • 匿名函数的三元运算:
res = map(lambda x:x**2 if x>4 else x**3, [1,2,3,4,5,6])
for i in res:  # 返回的是object,可以用for循环来输出,或者用list()转换成列表
    print(i)

以上就是这篇的内容。

上一篇:C++ Primer Plus读书笔记(九)内存模型和名称空间


下一篇:3.20---函数对象与闭包函数应用