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)语句,这里就和上一个例子的效果是一样的

  • 相关阅读:
    基于UDP的聊天室一例
    用原始套接字编程实现linux中的 ping 命令
    UNIX域流式套接字一例
    基于TCP的多进程echo服务器
    网络数据包检测抓包一例
    Java中static、final用法小结
    TCP/IP 组播的发送和接收
    Java数据库连接字符串
    对java中的访问限定符的理解1
    UNIX域用户数据报套接字一例
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/8537757.html
Copyright © 2011-2022 走看看