zoukankan      html  css  js  c++  java
  • Python函数式编程学习笔记

    Python函数式编程学习笔记

    Python函数式编程基础

    1. 理解函数名也是一个变量
    2. 理解Python中的变量都具有指向意义
    3. 函数式编程就是一个高阶函数的输入参数是几个参数和几个函数名称,而输出也可能是一个函数名称的编程模式。
    >>> def add(x, y, f):
    	    return f(x) + f(y)
    >>> f = abs
    >>> add(-5, 6, abs)
    11
    

    map函数:

    1. 输入:函数名,list
    2. 输出:list
    3. 功能:将输入list中的每一个元素传入函数中,将所有结果放入list中输出
    >>> def f(x):
    ...     return x * x
    ...
    >>> map(f, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    >>> map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9])
    ['1', '2', '3', '4', '5', '6', '7', '8', '9']
    

    reduce函数:

    1. 输入:双输入函数名,list
    2. 输出:一个值
    3. 功能:按顺序两个两个将list中的元素输入到函数中得到一个值,最终将list合并为一个值

    关于reduce的直观解释如下

    reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
    

    如果按位处理一个整数的话

    >>> def fn(x, y):
    ...     return x * 10 + y
    ...
    >>> reduce(fn, [1, 3, 5, 7, 9])
    13579
    

    字符串转整型数就是这样

    >>> def fn(x, y):
    ...     return x * 10 + y
    ...
    >>> def char2num(s):
    ...     return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
    ...
    >>> reduce(fn, map(char2num, '13579'))
    13579
    

    还可以包装起来

    def str2int(s):
        def fn(x, y):
            return x * 10 + y
        def char2num(s):
            return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
        return reduce(fn, map(char2num, s))
    

    不是特别复杂的函数可以用lambda代替

    def char2num(s):
        return {'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9}[s]
    
    def str2int(s):
        return reduce(lambda x,y: x*10+y, map(char2num, s))
    

    filter函数

    1. 输入:bool函数,list
    2. 输出:list
    3. 功能:根据传入的bool函数过滤list中的元素,true的留下,false的去掉
    def is_odd(n):
        return n % 2 == 1
    
    filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15])
    

    sorted函数

    1. 输入:list,函数名
    2. 输出:list
    3. 功能:根据函数名定义的顺序,对list进行排序

    Python内部的顺序定义
    x < y 返回 -1
    x = y 返回 0
    x > y 返回 1

    def cmp_ignore_case(s1, s2):
        u1 = s1.upper()
        u2 = s2.upper()
        if u1 < u2:
            return -1
        if u1 > u2:
            return 1
        return 0
    
    >>> sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
    ['about', 'bob', 'Credit', 'Zoo']
    

    装饰器

    用一个代码例子来解释可能更容易

    >>> def now():
    ...     print '2013-12-25'
    ...
    >>> f = now
    >>> f()
    2013-12-25
    
    def log(func):
        def wrapper(*args, **kw):
            print 'call %s():' % func.__name__
            return func(*args, **kw)
        return wrapper
    
    @log
    def now():
        print '2013-12-25'
    
    >>> now()
    call now():
    2013-12-25
    

    @log放在now函数定义前面相当于执行了

    now = log(now)
    

    偏函数

    1. 引入模块:functools
    2. 形式: int2 = functools.partial(int, base=2)
    3. 功能:定义一个新函数,新函数可以修改原函数的部分默认值

    关于functools.partial
    输入:func,*args,**kws

    1. 默认值其实是作为kws 输入的:即{base:2}
    2. 如果传入args 会将其作为func 函数的默认左输入

    总结

    1. 对list进行合并用reduce
    2. 对list进行映射用map
    3. 对list进行过滤用filter
    4. 对list进行排序用sorted
    5. 简单函数的定义用lambda
    6. 修改已有函数用装饰器
    7. 修改已有函数的默认值用偏函数

    后记

    关于函数式编程,说到底,是为了让代码变的简洁强大,使用Python语言,其实没有必要在函数式编程上走的很远,只要用好了本文中的这些函数和技术,就可以让Python变得异常强大和精致。

  • 相关阅读:
    JS如何判断是否已经引入某个css或是js?
    FILTER:progid:DXImageTransform.Microsoft.Gradient使用
    根据ip查询ip归属地
    java判断是否是合法IP
    jQuery下实现等待指定元素加载完毕(可改成纯js版)
    jsp 循环数字
    jsp获取当前日期
    MyBatis In的使用
    给半径求圆面积
    实现一个数值加法函数,返回两个数字的和。要求能进行参数验证,若参数不是数字或为空则抛出异常。
  • 原文地址:https://www.cnblogs.com/dn-harris/p/6047362.html
Copyright © 2011-2022 走看看