7.匿名函数、函数作用域、递归函数、闭包

      匿名函数       

filter(lambda x: x>10, li)

语法规则: lambda 参数 : 表达式

简单的函数,可以不用使用def定义一个函数,使用匿名函数即可

函数调用,类似于filter、map等函数里面,可以使用匿名函数来处理

提高开发效率,匿名函数的合理利用能够让那个代码更加简洁

print((lambda x,y:x+y)(11,22))

33
f = lambda x,y:x+y
print(f(11,22))

33
li = [1,3,34,2,4,6,86,4,4]
# def func(n):
#     if n>4:
#         return n
aa = filter(lambda n:n>4,li)
print(list(aa))

[34, 6, 86]

    函数作用域     

一、示例

外部不能访问函数内部变量:

def func():
    a = 222   #局部变量
    print('函数里边:',a)
    return a
func()
print('函数外面:',a)

函数里边: 222
Traceback (most recent call last):
  File "/home/pyvip/projects/home/pyvip/projects/基础班/复习.py", line 7, in <module>
    print('函数外面:',a)
NameError: name 'a' is not defined

函数里面不能修改函数外部变量:

a = 11        #全局变量
def func():
    # global a
    a += 1  #局部变量
    print('函数里边:',a)
    return a
func()
print('函数外面:',a)

  File "/home/pyvip/projects/home/pyvip/projects/基础班/复习.py", line 7, in <module>
    func()
  File "/home/pyvip/projects/home/pyvip/projects/基础班/复习.py", line 4, in func
    a += 1  #局部变量
UnboundLocalError: local variable 'a' referenced before assignment

函数内部能够访问函数外部变量:

a = 11        #全局变量
def func():
    # a = 222   #局部变量
    print('函数里边:',a)
    return a
func()
print('函数外面:',a)

函数里面和函数外部变量名相同:

a = 11        #全局变量
def func():
    a = 222   #局部变量
    print('函数里边:',a)
    return a
func()
print('函数外面:',a)

函数里边: 222
函数外面: 11

、global 和 nonlocal

1.global 

a = 11        #全局变量
def func():
    global a         #声明a是个全局变量
    a += 1  #局部变量
    print('函数里边:',a)
    return a
func()
print('函数外面:',a)

函数里边: 12
函数外面: 12

2.nonlocal

a = 11        #全局变量
def func():
    # global  a         #声明a是个全局变量
    a = 666  #局部变量
    print('外层函数func:',a)
    def fun1():
        nonlocal a                 #声明a的修改对外层函数有效
        a = 999
        print('内层函数fun1:,a)
    fun1()
func()
print('函数外面:',a)

外层函数func: 666
内层函数fun1: 999
函数外面: 11

     递归函数       

 递归中可以函数自身调用自身,但是使用时类似于条 件循环一样,要有递归的终止条件

使用递归时,常常可以让代码更加简洁 递归会占用比较多的内存,当递归次数比较多时,性能就会降低, 因此不建议多使用递归

def fun(n):
    if n==1:
        return n
    else:
        return n*fun(n-1)

a = fun(6)
print(a)


720

          闭包           

闭包是函数里面嵌套函数,外层函数返回里层函数,这种情况称之为闭包 闭包是概念,不是某种函数类型,和递归的概念类似,就是种特殊的函数调用 闭包可以得到外层函数的局部变量,是函数内部和函数外部沟通的桥梁,大多数时候和和装饰器一起使用

一、内嵌函数

def fun():

    def fun1():
        print('嵌套的内层函数')
    print('-----调用了fun-----')

    return fun1

result = fun()
print(result)

二、闭包

def fun1():
    a = 1
    def fun2():                                #1.函数里边嵌套一个函数
        print('=====fun2=======',a)            #2.外层函数返回的是内层函数的函数名
    return fun2                                #3.内层函数有引用外层函数的变量

a = fun1()
a()


=====fun2======= 1

 

posted @ 2018-07-11 09:22  浏阳河  阅读(201)  评论(0编辑  收藏  举报