py小强

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

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

5.4.3 函数嵌套

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

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

  • 作用域:
    • python中,一个函数是一个作用域。(JAVA中代码块是作用域,比如if内部)

    • 作用域中查找数据的规则:优先在自己的作用域找,如果没有就在"父级作用域"找 -> 直到全局。全局没有就报错。

      v = 10
      def func1():
          v = 9  # 函数内的变量和函数外的同名变量是完全独立的个体。
          print(v)  # 打印 9
          def func2():
              v = 999  # 在自己的作用域创建一个变量,不会影响父作用域的同名变量。想影响可以用global,nonlocal
              print(v)  # 打印自身函数中的变量v
          func2()  # 打印 999
          print(v)  # 打印 9
          
      func1()
      
    • 子作用域只能读取父作用域的同名变量的值,默认不能重新赋值(注意这里是'赋值'不是'修改')父作用域的变量(因为子作用域的同名变量是独立的新个体)。

      但是可以对可变类型的数据进行修改

      list1 = [1,2,3]
      def func1():
          list1.append(999)
          # list1 = 1  # 如果这里声明局部变量list1,python解释器就会把这个作用域中的list1.append(999)当做是对局部变量list1操作,会报错
      func1()
      print(list1)
      
    • 用 global 关键字可以在子作用域中重新赋值全局变量。(不推荐使用,影响可读性)

      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)

以上就是这篇的内容。

posted on 2019-06-21 14:31  py小强  阅读(141)  评论(0)    收藏  举报