Python基础——匿名函数和闭包函数

一.匿名函数:

   在定义函数的时候,不想给函数起一个名字。这个时候就可以用lambda来定义一个匿名函数

   语法:

   变量名= lambda 参数:表达式(block)

   参数:可选,通常以逗号分隔的变量表达式形式,也就是位置参数

   表达式:不能包含循环、return,可以包含if...else...,返回值就是该表达式的结果。

  注意:

   -表达式中不能包含 循环,return

   -可以包含 if...else...语句.

   -表达式计算的结果直接返回

1.创建一个匿名函数:

func = lambda :3<2

ret = func()

print(ret)

输出结果:False

 

2.创建一个带参数的匿名函数:

func = lambda x,y:x+y

ret = func(1,2)

print(ret)

输出结果:3

 

3.小练习:求两个数的最大值

func = lambda x,y:x if x>y else y

# 注意if 和else 没有 : 不能换行,if判断体写在判断条件前面。

ret = func(100,200)  # 传入实参

print(ret)

输出结果:200

4.使用max()求出字典的最大值:

# 一般函数:

dic = {'k1':20,'k2':100,'k3':50}

def func_dic(key):
    return dic[key]

ret = max(dic,key=func_dic)

print(ret)

输出结果:k2

匿名函数:

dic = {'k1':20,'k2':100,'k3':50}

ret = max(dic,key=lambda x:dic[x])

print(ret)

输出结果:k2

5.现有两个元组(('a'),('b')),(('c'),('d')),请使用匿名函数生成列表[{'a':'c'},{'b':'d'}]

tup1=(('a'),('b'))
tup2=(('c'),('d'))
ret = zip(tup1,tup2)  # 用zip()来得出tuple类型的元素


ret1 = list(map(lambda tup:{tup[0]:tup[1]},ret))   # 利用索引

print(ret1)

输出结果:[{'a': 'c'}, {'b': 'd'}]

二.闭包函数:

1.定义:

     内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

# 函数内部定义的函数称为内部函数

2.创建闭包函数:

ef say_hello(name):

    def inner():
        print('hello:',name)

    return inner
ret = say_hello('zs')

ret()      # 前面用声明声明变量 承接返回的值, 
           # 调用内部函数时就用该变量名调用,因为返回承接的都是
           #  函数的地址

输出结果:hello:zs

3.判断闭包函数:

判断闭包函数的方法__closure__

输出的__closure__是一个cell对象表示是闭包函数输出的是None 表示不是闭包函数。

ef say_hello(name):

    def inner():
        print('hello:',name)

    print(inner.__closure__)   # 判断闭包函数

    return inner
ret = say_hello('zs')

ret()      # 前面用声明声明变量 承接返回的值, 
           # 调用内部函数时就用该变量名调用,因为返回承接的都是
           #  函数的地址

输出结果:(<cell at 0x00000000004D7468: str object at 0x0000000001E7C5E0>,)
                    hello: zs

4.python 中怎么创建闭包:

三点:

  1. 闭包函数必须有内嵌函数
  2. 内嵌函数需要引用该嵌套函数上一级namespace中的变量
  3. 闭包函数必须返回内嵌函数

猜你喜欢

转载自blog.csdn.net/weixin_43567965/article/details/86004906