zoukankan      html  css  js  c++  java
  • lambda表达式&map&filter&yield

     

     

    一、先来看下lambda表达式

    1、lambda表达式其实很简单,他是简单的函数的变种,只有三部分组成,之前老师没有讲清楚,今天看书,终于明白了,写个博客记录下

    lambda关键字+参数+返回值,参数之间用逗号隔开,参数和返回值之间用冒号隔开,表达式结尾最好用分号隔开;

    我们看下下面的例子

    f = lambda x,y,z:x * y * z
    
    print(f(2,3,4))
    

      

    lambda关键字,x,y,z是三个参数,表达式 x * y * z就是在函数中的returen中的表达式,我们可以通过f来调用这个lambda表达式,通过传递指定参数,然后拿到表达式的结果

    结果如下

     2、表达式其实主要使用的场景是在列表或者字典中,看下下面的例子

    l = [
        lambda x:x ** 2,
        lambda x:x ** 3,
        lambda x:x ** 4,
    
    ]
    for f in l:
        print(f(100))
    
    print(l[0](100))
    

      

    结果如下

     3、lambda也可以传递默认参数,我们看下下面的例子

    f = lambda x,y=2,z=3:x + y + z
    
    print(f(1,4,5))
    
    print(f(2,4))
    
    print(f(2))
    

      

    结果如下

    4、lambda还可以实现简单的if-else语句

    f = lambda x,y:"aaa" if x > y else "bb";
    
    print(f(2,4))
    
    #如果x大于y,则返回“aaa”,如果x不大于y,则返回“bbb”
    

      

    结果如下

     5、还可以在一个函数中定义一个lambda,这个lambda还可以运用函数中的局部变量

    import sys
    def test(x):
        sys.stdout.write("hahh" + "
    ")
        #sys.stdout.write( == print
    
        return lambda y:x * y
    
    f = test(2)
    
    # 这里这个f是lambda表达式的地址
    
    
    sys.stdout.write(str(f(3)))
    #这个lambda可以直接使用函数中的局部变量x
    

      

    结果如下

    二、在来介绍一下map这个内置函数

    map这个内置的作用就是:对一个或者多个可迭代的对象,比如列表,元组,遍历每一个元素,然后将每个元素作为参数传递到map的第一个参数中,这个参数一定是一个函数的地址,然后返回一个可迭代的对象,这个对象必须要用list才能打印出来,我们看下面的例子

    f = lambda x:x + 100
    
    print(map(f,[1,2,3,4,5,6,7,8,9]))
    
    # 这里是返回这个对象的地址
    
    print(list(map(f,[1,2,3,4,5,6,7,8,9])))
    #通过list方法才能拿到这个可迭代对象的内容
    

      

    结果如下

    map内置函数不仅仅可以传递一个可迭代的对象,还可以传递多个可迭代的对象,他首先从第一个对象中取第一个值,然后从第二个对象中取第一个值,依次类推

    f = lambda x,y: x + y + 100;
    
    print(list(map(f,[1,2,3,4,5,6,7,8,9],[1,2,3,4,5,6,7,8,9])))
    

      

    结果如下

     三、最后在来介绍下filter函数

    filter函数的作用将可迭代对象中的每个元素传递到filter的第一个参数中,这个参数一定是一个函数,然后将执行结果为true的返回到可迭代的对象中,执行结果为false的直接丢失,也就是被过滤掉了

    f = lambda x:True if x > 5 else False;
    
    print(list(filter(f,[1,2,3,4,5,6,7,8,9])))
    

      

    结果如下

    上面的例子还可以简写成这样

    f = lambda x:x > 5;
    
    print(list(filter(f,[1,2,3,4,5,6,7,8,9])))
    

      

    结果如下

    最后一点版面在稍微复习一下生成器

    def gen(x):
        for i in range(x):
            temp = yield i ** 3
            print(temp)
    
    
    g = gen(5)
    a = next(g)
    print(a)
    
    a = next(g)
    print(a)
    

      

    a、执行g = gen(5),生成了一个生成器

    b、然后在a = next(g),这里这个a是什么呢?因为next方法执行yield就终止了,不继续往下执行,而yield后面的表达式的值就相当于普通函数的return,所以a的值就相当于yield后面表达式的值,这里也就是“0”,执行到这里后,就从函数中跳出来,因为遇到yield了,所以就需要跳出函数,执行外面的语句

    c、第三步就开始执行print(a)语句,因为a 就相当于函数的返回值,也就是yield后面表达式返回的值,所以这里是0

    d、执行完print(a)语句后,我们的第四步就是再次使用next方法进入生成器,这个时候,生成器函数是从上次跳出函数的位置开始执行,也就是print(temp),而这个temp是什么呢?temp不是yield后面返回的,temp的值只能通过外部生成器对象调用send方法进行传递,这里我们没有在外部通过生成器对象调用send方法传递,所以这里的值默认情况下是none

    我们在看下面这个例子,这里就有外部调用生成器对象是一共send方法

    def gen(x):
        for i in range(x):
            temp = yield i ** 3
            print(temp)
    
    
    g = gen(5)
    a = next(g)
    print(a)
    
    
    g.send("xxxx")
    
    a = next(g)
    print(a)
    

      

    a、执行g = gen(5)语句,生成一个生成器对象,这个对象就是g

    b、然后在a = next(g),这里这个a是什么呢?因为next方法执行yield就终止了,不继续往下执行,而yield后面的表达式的值就相当于普通函数的return,所以a的值就相当于yield后面表达式的值,这里也就是“0”,执行到这里后,就从函数中跳出来,因为遇到yield了,所以就需要跳出函数,执行外面的语句

    c、第三步就开始执行print(a)语句,因为a 就相当于函数的返回值,也就是yield后面表达式返回的值,所以这里是0

    d、第四步很关键,我们这里使用生成器对象g调用send方法g.send("xxxx"),这个方法就会传递“xxxx”这个字符串给yield前面的变量,也就是temp这个变量会被赋值为“xxxx”,因为生成器上次是print(temp)语句退出的,通过send方法也可以进行生成器内部,所以第四步这里首先会执行print(temp)语句,这里就会打印"xxxx"

    e、打印完xxx后就会继续执行a = next(g)语句,这里就和上一个例子的效果是一样的

  • 相关阅读:
    HDU 2955 Robberies(01背包)
    HDU 2602 Bone Collector(01背包)
    HUST 1352 Repetitions of Substrings(字符串)
    HUST 1358 Uiwurerirexb jeqvad(模拟解密)
    HUST 1404 Hamming Distance(字符串)
    HDU 4520 小Q系列故事――最佳裁判(STL)
    HDU 2058 The sum problem(枚举)
    【破解】修改程序版权、添加弹窗
    HDU 1407 测试你是否和LTC水平一样高(枚举)
    HDU 1050 Moving Tables(贪心)
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/8537757.html
Copyright © 2011-2022 走看看