zoukankan      html  css  js  c++  java
  • Python之必备函数

    1. lambda 表达式

    匿名函数(ANONYMOUS FUNCTION)是指一类无需定义标识符(函数名)的函数。通俗来讲,就是它可以让我们的函数,可以不需要函数名。

    正常情况下,我们定义一个函数,使用的是 def 关键字,而当你学会使用匿名函数后,替代 def 的是lambda

    下面就 def  和 lambda 分别举例说明:

    def mySum(x, y):
        return x+y
    mySum01(2, 3)
    # 5

    (lambda x, y: x+y)(2, 4)
    # 6

    从上面的示例,我们可以看到匿名函数直接运行,省下了很多行的代码!

    下面,我们来仔细看一下它的用法

    if/else

    >>>( lambda x, y: x if x < y else y )( 1, 2 )
    1

    嵌套函数

    >>>( lambda x: ( lambda y: ( lambda z: x + y + z  )( 1 ) )( 2 ) )( 3 )
    6

    递归函数

    >>> func = lambda n:1 if n == 0 else n * func(n-1)
    >>> func(5)
    120

    或者

    >>> f = lambda func, n: 1 if n == 0 else n * func( func, n - 1 )
    >>> f(f,4)
    24

    从以上示例来看,lambda 表达式和常规的函数相比,写法比较怪异,可读性相对较差。除了可以直接运行之外,好像并没有其他较为突出的功能,为什么在今天我们要介绍它呢?

    首先我们要知道 lambda 是一个表达式,而不是一个语句。正因为这个特点,我们可以在一些特殊的场景中去使用它。具体是什么场景呢?接下来我们会介绍到几个非常好用的内置函数。

    2. map 函数

    map 函数,它接收两个参数,第一个参数是一个函数对象(当然也可以是一个lambda表达式),第二个参数是一个序列。

    它可以实现怎样的功能呢,我举个例子你就明白了。

    >>> map(lambda x: x*2, [1,2,3,4,5])
    [2, 4, 6, 8, 10]

    可以很清楚地看到,它可以将后面序列中的每一个元素做为参数传入lambda中。

    当我们不使用 map 函数时,你也许会这样子写。

    mylist=[]
    for i in [1,2,3,4,5]:
        mylist.append(i*2)

    3. filter 函数

    filter 函数,和 map 函数相似。同样也是接收两个参数,一个lambda 表达式,一个序列。它会遍历后面序列中每一个元素,并将其做为参数传入lambda表达式中,当表达式返回 True,则元素会被保留下来,当表达式返回 False ,则元素会被丢弃。

    下面这个例子,将过滤出一个列表中小于0的元素。

    >>>filter(lambda x: x < 0, range(-5, 5))
    [-5, -4, -3, -2, -1]

    4. reduce 函数

    reduce 函数,也是类似的。它的作用是先对序列中的第 1、2 个元素进行操作,得到的结果再与第三个数据用 lambda 函数运算,将其得到的结果再与第四个元素进行运算,以此类推下去直到后面没有元素了。

          reduce 逻辑演示

    这边举个例子你也就明白了。

    >>>reduce(lambda x,y: x+y, [1,2,3,4,5])
    15

    它的运算过程分解一下是这样的。

    1+2=3
    3+3=6
    6+4=10
    10+5=15

    5. 注意点

    以上几个函数,熟练的掌握它们的写法,可以让我们的代码看起来更加的 Pythonic ,在某一程度上代码看起来更加的简洁。

    如果你是新手呢,你需要注意的是,以上示例是在 Python2.x 环境下演示的。而在 Python3.x 中,却有所不同,你可以自己尝试一下。

    这里总结一下:

    第一点,mapfilter 函数返回的都不再是一个列表,而是一个迭代器对象。这里以map为例

    >>> map_obj = map(lambda x: x*2, [1,2,3,4,5])
    >>> from collections.abc import Iterator
    >>> isinstance(map_obj, Iterator)
    True
    >>> next(map_obj)
    2
    >>> list(map_obj)
    [4, 6, 8, 10]

    第二点,reduce 不可以直接调用,而是要先导入才能使用。

    from functools import reduce

    注:来源于----痴海

  • 相关阅读:
    how to uninstall devkit
    asp.net中bin目录下的 dll.refresh文件
    查找2个分支的共同父节点
    Three ways to do WCF instance management
    WCF Concurrency (Single, Multiple, and Reentrant) and Throttling
    检查string是否为double
    How to hide TabPage from TabControl
    获取当前系统中的时区
    git svn cygwin_exception
    lodoop打印控制具体解释
  • 原文地址:https://www.cnblogs.com/Lee1010/p/10287232.html
Copyright © 2011-2022 走看看