• lambda易错


    def num():
        return [lambda x:i*x for i in range(4)]
    print('这是num(): ',list(num()))
    print([m(2) for m in num()])
    for  i in num():
        print('每一个i:',i)
    输出:
    这是num():  [<function num.<locals>.<listcomp>.<lambda> at 0x00000000029759D8>, <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975A60>, <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975AE8>, <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975B70>]
    [6, 6, 6, 6]  # 每一个m(2)的值
    <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975BF8>
    <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975AE8>
    <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975B70>
    <function num.<locals>.<listcomp>.<lambda> at 0x0000000002975950>
    

    字典去重之后按原来的顺序重新排

    list0=['b','c', 'd','b','c','a','a']
    print(sorted(set(list0),key=list0.index)) # sorted output
    

    面试易错lambda

    # 面试易错的循环闭包lambda函数  闭包的相关知识 及闭包的后期绑定
    def testfun():
        temp = [lambda x: i*x for i in range(4)]
        return temp
    print(testfun())
    for everylambda in testfun():
        print(everylambda(2))   #结果是 6,6,6,6
    # 原因: python的闭包的后期绑定导致的 late binding,这意味着在闭包中的变量实在内部函数被调用的时候被查找.
    # 所以结果是:当任何testfun()返回的函数被调用时,i的值在他被调用时的周围作用域中查找,到那时 ,
    # 无论哪个返回的函数被调用,for循环都已经完成了 # i最后的值是3,因此,每个返回的函数testfun()的值都是3
    

    改进方法一:

    # 改正方法一:创建一个闭包,通过使用默认参数立即绑定他的参数
    def testfun1():
        # return [lambda x: i * x for i in range(4)]
        return  [lambda x ,i = i : i*x  for i in range(4)]
    
    for everylambda1 in testfun1():
        print(everylambda1(2),'你妹的')
    输出 0,2,4,6
    

    原版拆分

    def func():
        fs = []
        for i in range(3):
            print('进入lam前i的值:', i)
            def lam(x):
                print('进入lam后i的值:', i)
                return x * i
            fs.append(lam)
        return fs
    F = func()
    print('009',F,type(F))
    
    # 将x的值传入
    for f in F:
        print(f(2))
    
    print('这是---------------------------------------')
    def func():
        fs = []
        for i in range(3):
            def lam(x, i=i):
                print('这是i',i)
                return x * i
            fs.append(lam)
        return fs
    F = func()
    for f in F:
        print('10',f(3))
    
    输出:
    进入lam前i的值: 0
    进入lam前i的值: 1
    进入lam前i的值: 2
    009 [<function func.<locals>.lam at 0x0000000002876378>, <function func.<locals>.lam at 0x0000000009FF4620>, <function func.<locals>.lam at 0x0000000009FF46A8>] <class 'list'>
    进入lam后i的值: 2
    4
    进入lam后i的值: 2
    4
    进入lam后i的值: 2
    4
    这是-------------
    这是i 0
    10 0
    这是i 1
    10 3
    这是i 2
    10 6
    

    改正方法二:使用functools.partial函数,把函数的某些参数(不管有没有默认值)给固定起来(也就是相当与设置默认值)

    from functools import partial
    from operator import  mul
    def  testfun2():
        return [partial(mul,i)for i in range(4)]
    for everylambda2 in testfun2():
        print(everylambda2(2))
    输出 0,2,4,6
    
    def multipliers():
        return [partial(mul, i) for i in range(4)]
    print('解决方式二',[m(2) for m in multipliers()])     #[0, 2, 4, 6]
    

    改正方法三:优雅的写法,直接用生成器

    def testfun3():
        return (lambda x:i*x for i in range(4))
    for everylambda3 in testfun3():
        print(everylambda3(2))
    输出 0,2,4,6
    

    改正方法四:利用yield的惰性求值的思想

    def testfun4():
        for i in range(4):
            yield lambda x : i*x
    
    def multipliers1(x):
        for i in range(4):
            yield i*x
    print('解决方式1.1',[m for m in multipliers1(2)])     #[0, 2, 4, 6]
    

    for everylambda4 in testfun4():
    print(everylambda4(2),'你好啊')

    写入自己的博客中才能记得长久
  • 相关阅读:
    P4999 烦人的数学作业
    P3413 SAC#1
    P2657 [SCOI2009]windy数
    P2602 [ZJOI2010]数字计数
    JSOI2007 建筑抢修
    CF161B Discounts
    Description
    Street Numbers
    Pizza Cutting
    Supermean
  • 原文地址:https://www.cnblogs.com/heris/p/14044279.html
Copyright © 2020-2023  润新知