• python学习日记(匿名函数)


    匿名函数

    简介

    匿名函数:为了解决那些功能很简单的需求而设计的一句话函数。

    python 使用 lambda 来创建匿名函数。

    所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

    1 lambda 只是一个表达式,函数体比 def 简单很多。
    2 lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
    3 lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
    4 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率
    匿名函数
    #定义一个函数实现加法运算
    def add(x,y):
        return x+y
    print(add(1,2))
    #匿名函数实现
    a = lambda x,y:x+y# lamba 参数:返回值
    print(a(1,2))

    由上面可以看出,匿名函数是可以有函数名的。不过它也真的可以匿名,在和其他功能函数合作的时候。

    求字典dic={'k1':10,'k2':100,'k3':30}中value最大的key。

    实现:

    dic={'k1':10,'k2':100,'k3':30}
    def func(k):
        return dic[k]
    print(max(dic,key=func))

    转换成匿名函数:

    dic={'k1':10,'k2':100,'k3':30}
    print(max(dic,key=lambda k:dic[k]))

    求列表l = [1,2,3,4,5,6]的平方。

    实现:

    l = [1,2,3,4,5,6]
    def func(x):
        return x**2
    f = map(func,l)
    for i in f:
        print(i,end=' ')

    匿名函数实现:

    f1 = map(lambda x:x**2,[1,2,3,4,5,6])
    for i in f1:
        print(i,end=' ')

    筛选出列表中大于10的数字

    实现:

    l = [5,8,11,9,15]
    def func(x):
        return x > 10
    s = filter(func,l)
    for i in s:
        print(i,end=' ')

    匿名函数实现:

    s1 = filter(lambda x:x > 10,[5,8,11,9,15])
    for i in s1:
        print(i,end=' ')

    面试题

    一、

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

    实现:

    t1 = (('a'),('b'))
    t2 = (('c'),('d'))
    r1 = zip(t1,t2)
    
    def func(t):
        return {t[0]:t[1]}
    
    r2 = map(func,r1)
    print(list(r2))#要求生成列表

    匿名函数实现:

    r2 = map(lambda t:{t[0]:t[1]},zip((('a'),('b')),(('c'),('d'))))
    print(list(r2))

    提示:看到要求使用匿名函数实现的,就要立刻联想到能和匿名函数一起使用的功能函数。

    min max filter map sorted <——> lambda

    还能够这样写:

    t1 = (('a'),('b'))
    t2 = (('c'),('d'))
    r = lambda t1,t2:[{i:j} for i,j in zip(t1,t2)]
    print(r(t1,t2))
    r1 = [{i:j} for i,j in zip(t1,t2)]
    print(r1)

    二、

    1.下面程序的输出结果是:
    d = lambda p:p*2
    t = lambda p:p*3
    x = 2
    x = d(x)
    x = t(x)
    x = d(x)
    print x

    很容易看出来,不再赘述。

    三、

    3.以下代码的输出是什么?请给出答案并解释。
    def multipliers():
        return [lambda x:i*x for i in range(4)]
    print([m(2) for m in multipliers()])
    请修改multipliers的定义来产生期望的结果。

    输出结果:

    解析:1、先定义一个函数 multipliers,未调用。

       2、在print语句里面调用函数 multipliers,得到的返回值是一个列表推导式

       3、在 i 分别等于0,1,2,3的时候,都生成一个 lamba x:i*x,即返回值是4个 lamba x:i*x

       4、四个 lamba x:i*x都是名为 m 的函数,此时调用m,即m(2)

       5、调用m函数的时候,x=2,i=3,因为在生成第四个lamba x:i*x的时候,i=3,最终赋值,前面i=0、1、2的时候函数m都未调用

       6、即输出[3*2,3*2,3*2,3*2,]——>[6,6,6,6]

    如题又说修改函数multipliers的定义来产生期望的结果:

    既是想要使i=0、1、2、3的时候分别调用函数m,使输出为[0,2,4,6]

    实现:将列表推导式改成生成器表达式就行了。由于惰性,每次调用函数的时候,生成器才执行一次,取出一个值,一个一个取,即满足需求。

    def multipliers():
        return (lambda x:i*x for i in range(4))
    print([m(2) for m in multipliers()])

    pass

    作者:Gruffalo
    ---------------------------------------------
    天行健,君子以自强不息
    地势坤,君子以厚德载物
    内容仅为自己做日常记录,备忘笔记等
    真小白,努力学习ing...一起加油吧!(ง •̀_•́)ง
  • 相关阅读:
    chapter1 Qt入门
    base64加密解密
    vue+CryptoJS+cookie实现保存账号密码
    js计时器
    Elenent ui中的表单校验规则、自定义校验规则、预验证功能
    js获取文件后缀
    js中如何将有字符串转换为数组,或将数组转换为字符串
    vue-router
    Vue项目纯前端导出word文档
    async/await
  • 原文地址:https://www.cnblogs.com/smallfoot/p/10066756.html
Copyright © 2020-2023  润新知