zoukankan      html  css  js  c++  java
  • Python3入门(六)——函数式编程

    更多实例:参考:https://blog.csdn.net/u013398034/article/details/78701714

    一、高阶函数

      1.可以通过变量指向函数,达到类似别名的效果:

    >>> f = abs
    >>> f(-10)
    10

      2.函数的参数可以是函数,也就是函数可以作为一个入参

    def add(x, y, f):
        return f(x) + f(y)

      以下介绍几个高阶函数

      map、reduce

        这两个函数就不赘述了。和scala的功能类似,不过用法不一样,它接收两个参数,第一个是函数f,第二个是Iterable。并将计算结果作为新的Iterator返回,惰性的Iterator通过list便可以计算出结果了:

    def f(x):
        return x + 1
    
    
    r = map(f, [1, 2, 3, 4, 5])
    print(list(r))

        reduce入参类似map,但是它的f是接收两个参数,并且需要导包。并将结果作为下一次的输入,表示起来就是:

    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    from functools import reduce
    
    
    def f(x, y):
        return x + y
    
    
    r = reduce(f, [1, 2, 3, 4, 5])
    # 注意这里不需要list包装了,因为返回的不是Iterator
    print(r)

        filter

      和scala的filter也是类似了,返回Ture的留下,其它过滤掉。其他的入参和返回值与map相同

    def f(x):
        return x % 2 == 0
    
    
    r = filter(f, [1, 2, 3, 4, 5])
    print(list(r))

        sorted

        sorted可以直接对list进行比较

    >>> sorted([-1, 3, 2, 6])
    [-1, 2, 3, 6]

        也可以传入一个key的函数进行处理:

        key指定的函数将作用于list的每一个元素上,并根据key函数返回的结果进行排序。

    sorted([36, 5, -12, 9, -21], key=abs)

        如果是对字符串比较,默认是比较ASCII码,也就是Z<a;要忽略大小写,可以通过传入的key函数对每个元素进行操作:

    sorted(['img', 'ang', 'Zbb'], key=str.lower)
    ['ang', 'img', 'Zbb']

        反向排序,传入reverse参数

    sorted(['img', 'ang', 'Zbb'], key=str.lower, reverse=True)
    ['Zbb', 'img', 'ang']

        一个简单的排序小示例如下:

    # -*- coding: utf-8 -*-
    L = [('Bob', 75), ('Adam', 92), ('Bart', 66), ('Lisa', 88)]
    
    
    def by_name(t):
        return t[0].lower()
    
    
    def by_score(t):
        return t[1]
    
    
    L2 = sorted(L, key=by_name)
    L3 = sorted(L, key=by_score, reverse=True)
    print(L2)
    print(L3)

    二、返回函数

       高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

      以惰性求和为例,传统的求和是返回结算的结果,而高阶函数可以返回一个计算的函数,当调用这个返回的函数时才真正计算结果:

    # -*- coding: utf-8 -*-
    def my_sum(*args):
        def sum_in():
            s = 0
            for i in args:
                s += i
            return s
    
        return sum_in

      直接调用返回计算函数:

    f = my_sum(1,2,3,4)
    f
    <function my_sum.<locals>.sum_in at 0x000002C607E15048>

      f才是真正的计算函数:

    f()
    10

      // 这里返回的内部函数sum_in引用了外部函数my_sum的参数和局部变量,这也叫Python中的闭包!

    三、匿名函数

      也就是我们熟悉的拉姆达表达式了:lambda。Python中的用法如下:(需要显式使用lambda关键字)

    list(map(lambda x:x*x, [1,2,3]))
    [1, 4, 9]

      其他的lambda表达式不再赘述,和Java、scala一致

    四、装饰器

      之前提到的,可以通过变量给函数起别名:

    def fun1():
        print("100分,100分!")
        
    f1 = fun1

      真实名字可以通过.__name__得出:

    f1.__name__
    'fun1'

      装饰器在其他语言中也比较常见了,这里介绍Python的装饰器。它本质上是一个返回函数的高阶函数:

        使用的方式是通过注解形式进行装饰,而装饰者Log这里接收一个函数,并返回一个函数

    # -*- coding: utf-8 -*-
    def log(fun):
        def wrapper(*args, **kv):
            print("被装饰的函数是:%s" % fun.__name__)
            return fun(*args, **kv)
        return wrapper
    
    
    @log
    def func():
        print("现在是2018-04-24")
    
    
    func()

      至于装饰者本身需要参数的情况,参考廖老师的博客

    五、偏函数

      偏函数有点儿类似原来的默认参数,就是把函数的某些参数给固定住。这样就能快速调用:

        偏函数的功能由functools提供,需要提前导包:

    # -*- coding: utf-8 -*-
    import functools
    
    int2 = functools.partial(int, base=2)
    
    int2('11001001')

      以上的偏函数就把int函数的base参数给固定住了,这样int2在进行字符串转换时就会默认转换为2进制了,而不用每次都通过int(str, base=2)来指定了!

  • 相关阅读:
    HTTP深入浅出 http请求
    javascript 新兴的API
    javascript 高级技巧详解
    javascript AJAX与Comet详解
    php文件扩展名判断
    php创建新用户注册界面布局实例
    php使用递归创建多级目录
    php对文本文件进行分页功能简单实现
    php上传功能集后缀名判断和随机命名
    php判断数据库是否连接成功的测试例子
  • 原文地址:https://www.cnblogs.com/jiangbei/p/8921898.html
Copyright © 2011-2022 走看看