zoukankan      html  css  js  c++  java
  • Python3中lambda表达式与函数式编程讲解

    今天小编就为大家分享一篇关于Python3中lambda表达式与函数式编程讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。其一般有如下几种使用方式:

    1、lambda的一般形式是关键字lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。lambda是一个表达式而不是一个语句。它能够出现在Python语法不允许def出现的地方。作为表达式,lambda返回一个值(即一个新的函数)。lambda用来编写简单的函数,而def用来处理更强大的任务。例如:

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

    结果:

    6
    10
    1
    2
    2、lambda表达式常用来编写跳转表(jump table),就是行为的列表或字典。例如:

    L = [(lambda x: x**2),
    (lambda x: x**3),
    (lambda x: x**4)]
    print L[0](2),L[1](2),L[2](2)
    D = {'f1':(lambda: 2+3),
    'f2':(lambda: 2*3),
    'f3':(lambda: 2**3)}
    print D['f1'](),D['f2'](),D['f3']()

    结果:

    4 8 16
    5 6 8
    1
    2
    3、lambda表达式可以嵌套使用,但是从可读性的角度来说,应尽量避免使用嵌套的lambda表达式。

    Lambda函数又称匿名函数,匿名函数就是没有名字的函数,函数没有名字也行?当然可以啦。有些函数如果只是临时一用,而且它的业务逻辑也很简单时,就没必要非给它取个名字不可。lamdba函数的正确使用场景:

    1、函数式编程

    尽管Python算不上是一门纯函数式编程语言,但它本身提供了很多函数式编程的特性,Python中,也有几个定义好的全局函数方便使用的,像map、reduce、filter、sorted这些函数都支持函数作为参数,lambda函数就可以应用在函数式编程中。如下:

    from functools import reduce
    foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
    print (list(filter(lambda x: x % 3 == 0, foo)))
    #[18, 9, 24, 12, 27]
    print (list(map(lambda x: x * 2 + 10, foo)))
    #[14, 46, 28, 54, 44, 58, 26, 34, 64]
    print (reduce(lambda x, y: x + y, foo))
    #139

    2、闭包

    闭包本身是一个晦涩难懂的概念,在这里我们以简单粗暴地理解为闭包就是一个定义在函数内部的函数,闭包使得变量即使脱离了该函数的作用域范围也依然能被访问到。lambda函数作为闭包的例子:

    >>> def my_add(n):
    ... return lambda x:x+n
    1
    2
    >>> add_3 = my_add(3)
    >>> add_3(7)

    这里lambda函数就是一个闭包,在全局作用域范围中,add_3(7)可以正常执行且返回值为10,之所以返回10是因为在my_add局部作用域中,变量n的值在闭包的作用使得它在全局作用域也可以被访问到。

    换成常规函数也可以实现闭包,只不过是这种方式稍显啰嗦,如下:

    >>> def my_add(n):
    ... def wrapper(x):
    ... return x+n
    ... return wrapper
    ...
    >>> add_5 = my_add(5)
    >>> add_5(2)

    不过不是任何情况lambda函数都要比常规函数更清晰明了,看这个例子:

    f = lambda x: [[y for j, y in enumerate(set(x)) if (i >> j) & 1] for i in range(2**len(set(x)))]
    1
    这是返回某个集合的所有子集的lambda函数,相信你要看一会儿才能看明白。

    python中有这样一句话是Explicit is better than implicit(明了胜于晦涩)。若用lambda函数不能使代码变得更清晰,就要考虑使用常规的方式来定义函数。

    最后给大家推荐一个资源很全的python学习聚集地,这里有我收集以前学习心得,学习笔记,还有一线企业的工作经验,且给大定on零基础到项目实战的资料,大家也可以在下方,留言,把不懂的提出来,大家一起学习进步
    总结

    以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,


    ————————————————
    版权声明:本文为CSDN博主「程序员adny」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/haoxun10/article/details/104930116

    你有什么心态,就有什么样的人生。管不好自己的心态,注定你就是个弱者。
  • 相关阅读:
    iOS开发多线程篇—GCD的常见用法
    iOS开发多线程篇—GCD的基本使用
    iOS开发多线程篇—线程的状态
    iOS开发多线程篇—GCD介绍
    iOS开发多线程篇—线程间的通信
    iOS开发多线程篇—线程安全
    iOS开发多线程篇—创建线程
    iOS开发多线程篇—多线程简单介绍
    iOS开发拓展篇-XMPP简单介绍
    iOS开发拓展篇—应用之间的跳转和数据传
  • 原文地址:https://www.cnblogs.com/LQZ888/p/12524905.html
Copyright © 2011-2022 走看看