• 匿名函数


    现在我们要了解到一种函数:匿名函数。

    • ambda只是一个表达式,函数体比def简单很多。
    • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
    • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
    • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。

    所以 我们可以总结出来的是,匿名函数是一个能进行简单逻辑运算的简单函数,优点是不用再去命名类命名函数,降低程序的冗余度。

    在以下两种情况时使用匿名函数:

    1. 指定运算一次性使用,所以不需要定义函数名,节省内存中变量定义空间

    2. 如果想让程序更加简洁时。

    我们下面来看看普通的加法函数:

    def add(x,y):

        a=x+y

        return a

    我们再来使用匿名函数的方法:

    a=lambda x,y:x+y

    这样是不是简洁了很多?

    a=lambda x,y:x+y

    print(a(1,2))

    输出结果为:

    3

    那么我来讲解一下匿名函数的应用,匿名函数可以和map,reduce,filter相结合使用。

    ①map:

    map() 会根据提供的函数对指定序列做映射。

    现在先来一段程序理解以下:

    list1=[1,2,3,4,5]

    def multiply(x):

        return x**2

    a=map(multiply,list1)

    print(a)

    输出结果:

    <map object at 0x000001F25C276F98>

    于是在代码尾,再加一句print(list(a))

    输出结果:

    <map object at 0x000001F25C276F98>

    [1, 4, 9, 16, 25]

    看到这儿,应该明白了map的作用,我用通俗易懂的方式写出map的公式和作用:

    a=map(函数,列表),用括号内的函数的功能去实现列表里的每一个元素。

    那么输出结果在Python3.x中返回迭代器(在Python2.x中返回列表),承载着几个数据,故正确的打印应该是print(list(a))

    我们在上面已经提到了可以跟匿名函数结合运算:

    list1=[1,2,3,4,5]

    a=map(lambda x:x**2,list1)

    print(list(a))

    输出结果:

    [1, 4, 9, 16, 25]

    我们可以看到,跟匿名函数结合之后,代码变得更加简洁有效。

    ②reduce:

    reduce() 函数会对参数序列中元素进行累积。

    现在一段程序理解一下:

    def add(x,y):

        return x+y

    list2=[1,2,3,4,5]

    a=reduce(add,list2)

    print(a)

    我们运行的时候,却发现报了reduce的错,原因在于:

    在 Python3 中,reduce() 函数已经被从全局名字空间里移除了,它现在被放置在 functools 模块里,如果想要使用它,则需要通过引入 functools 模块来调用 reduce() 函数:

    from functools import reduce

    def add(x,y):

        return x+y

    list2=[1,2,3,4,5]

    a=reduce(add,list2)

    print(a)

    输出结果是:

    15

    那么为什么打印的时候,不是print(list(a))呢?要注意,这个函数的输出结果是一个数,而不是几个数据,但是依然输出到了迭代器。

    a=reduce(函数,列表),用括号内的函数去累加处理列表的每一个元素。也就是说,如果函数是乘法函数,那么输出结果就是列表中所有元素相乘的值。

    那么现在我们就用匿名函数与reduce相结合来试试乘法:

    from functools import reduce

    list2=[1,2,3,4,5]

    a=reduce(lambda x,y:x*y,list2)

    print(a)

    输出结果:

    120

    ③filter:

    filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。

    这个filter的运作方式是和map一样的,输出结果也是几组数据:

    def is_1(x):

        return x == 1

    list3=[1,2,5,1,6,1]

    a=filter(is_1,list3)

    print(list(a))

    输出结果:

    [1,1,1]

    a=filter(函数,列表),用括号内的函数去筛选过滤列表的每一个元素。

    同样的,我们依然能使用匿名函数的方法去简化:

    list3=[1,2,5,1,6,1]

    a=filter(lambda x:x==1,list3)

    print(list(a))

    输出结果:

    [1,1,1]

    现在我讲完了匿名函数与map,reduce和filter相结合的方法,我们来总结一下:

    这三个的输出结果都是到迭代器,处理的对象是列表。

    匿名函数可以让代码变得更加简洁效率化,减少占用内存。

    那么,匿名函数与map,reduce和filter相结合的这种方法,究竟属于什么样的编程呢?

    我们把这种方式叫做命令式编程。

    那么,还有一种编程方式,自然是函数式编程,函数式编程可以说已经贯穿了之前的博客,因为:

    函数式编程是用def,for,if,else等等来完成。

    我们在写代码的时候,要学会取舍命令式编程和函数式编程的使用,不同的情况下做出不同的选择。

    那么我就啰嗦一下函数式编程中的一些能够更简洁的方法吧:

    这个方法叫做三元表达式:

    x=2

    y=1

    z=x if x >y else y 

    print(z)

    输出结果:

    2

    很显然,三元表达式极大简化了代码,希望大家也注意一下这种表达式的应用。

  • 相关阅读:
    @EnableCaching缓存
    totastmessage 触发事件后浮框消失的方法
    JavaScript的类型自动转换样例集合处
    [译]bootstrap-select (selectpicker)方法
    通过使用CSS字体阴影效果解决hover图片时显示文字看不清的问题
    [Java]求文件大小并保留两位小数(文件大小是一个长整型数单位是Byte)
    PHP多进程编程(2):管道通信
    PHP多进程编程(一)
    如何解决PHP里大量数据循环时内存耗尽的问题
    推荐!国外程序员整理的 PHP 资源大全
  • 原文地址:https://www.cnblogs.com/Masterpaopao/p/10181289.html
Copyright © 2020-2023  润新知