• Python学习


    前言

    • 学习渠道:慕课网:Python进阶
    • 记录原因:我只是想边上课边做笔记而已,呵呵哒
    • 食用提示:教程环境基于Python 2.x,有些内容在Python 3.x中已经改变

    函数式编程

    • 定义:一种抽象计算的编程模式
    • 特点

      • 把计算视为函数而非指令
      • 纯函数式编程不需要变量,没有副作用,一个函数任意执行多少次结果都是确定的,测试简单
      • 支持高阶函数,代码简单
    • Python支持的函数式编程

      • Python允许变量,不是纯函数式编程
      • 支持高阶函数,函数可以作为变量传入
      • 支持闭包,可以返回函数
      • 有限度地支持匿名函数

    高阶函数

    • 定义:能接受函数作为参数的函数
    • 特点

      • 变量可以指向函数
      • 函数名其实就是指向函数的变量
        import math
    
        def add(x, y, f) :
            return f(x) + f(y)
    
        print add(25, 9, math.sqrt);    
    

    8.0

    - ###map()
       - Python内置的高阶函数
       - map(fun, list)将函数fun依次作用在list的每个元素上
       - map()不改变原有list,而是返回一个新的list
       - map()可以处理包含任何类型的list,只要传入的fun可以处理
    
        def fort_name(s) :
            return s.capitalize();    #首字母大写,其余小写
            # return s[0].upper()+s[1:].lower();
            # return s.title();
    
        print map(format_name, ['adam', 'LISA', 'barT'];
        # Python3中需要用户list()转换map()
        print (list(map(format_name, ['adam', 'LISA', 'barT']));
        print (list(map(lambda x: x.capitalize(), ['adam', 'LISA', 'barT'])));
        # 可以处理字符串含有空格的情况?
        print [name.capitalize() for name in [' adam ', ' LISA ', ' barT ']];
    

    ['Asam', 'Lisa', 'Bart']

    - ###reduce()
       - Python内置的高阶函数(Python3之后移除了,[关于移除](https://www.artima.com/forums/flat.jsp?forum=106&thread=98196))
       - reduce(fun, list)对list的每个元素**反复**调用函数fun,并返回最终结果值
       - reduce(fun, list, val0)还可接收一个计算初值
    
        from functools import reduce
        # Python3中reduce()被从全局名字空间里移除了,现在被放置在functools模块中,使用前需要引用
    
        def prod(x, y) :
            return x * y
    
        print reduce(prod, [2, 4, 5, 7, 12])
    

    3360 # 2 * 4 * 5 * 7 * 12 = 3360

    - ###filter()
           - Python内置的高阶函数
           - filter(fun, list)对list的每个元素进行判断,返回True或False
           - filter()根据判断结果,返回由符合条件的元素组成的新list
    
        import math
    
        def is_sqr(x) :
            return math.sqrt(x) % 1 == 0
    
        print filter(is_sqr, range(1, 101))
    

    [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

    - ###sorted()
           - Python 内置的高阶函数
           - sorted(list) 对 list 进行排序
           - sorted(list, cmp_fun) 传入一个函数对 list 排序
           - cmp_fun(x, y) :如果 x 应排在 y 前面,返回 -1;如果 x 应排在 y 后面,返回1;如果 x 和 y 相等,返回0 
    
        def cmp_ignore_case(s1, s2):
            # return cmp(s1.lower(), s2.lower());
            if (s1.lower() < s2.lower()) :
                return -1;
            elif (s1.lower() > s2.lower()) :
                return 1;
            else :
                return 0;
    
        print sorted(['bob', 'about', 'Zoo', 'Credit'])
        print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
        # print (sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case))
    

    ['Credit', 'Zoo', 'about', 'bob'] # 'Z' 的ASCII码比 'a' 小
    ['about', 'bob', 'Credit', 'Zoo']

    - ###返回函数
           - 在函数 f() 中定义函数 g() ,返回函数 **g**
           - 可以把一些计算延迟
    
        def calc_prod(lst) :
            def mult_ prod() :
                return reduce(lambda x, y : x * y, lst)
        return mult_prod
    
        # 调用calx_prod()没有返回计算结果,而是返回函数
        delay_calc = calc_prod([1, 2, 3, 4])    
    
        # 对返回函数进行调用时,才获得结果(延迟)
        print delay_calc()
    

    24

    - ###闭包
           - 定义:内层函数引用了外层函数的局部变量(参数),然后返回内层函数的情况
           - 在函数内部定义的函数无法被外部访问,为防止不必要的调用,可将函数移入函数内部
           - 正确使用闭包,要确保局部变量在函数返回后不能变。即:**返回函数不要引用任何循环变量,获后续会发生变化的变量**
    
        def count() :
            fs = []
            for i in range(1, 4) :
                def f() :
                    return i*i
                fs.append(f)
            return fs
    
        f1, f2, f3 = count()
        # f1=count()[0],f2=count()[1],f3=count()[2]
    
        print f1(), f2(), f3()
    

    9, 9, 9

        # fs存放的是f(),并没有进行i的计算
        # f()只在执行时才去获取外层参数i
        # 等f()执行时,i的值已经改变
        # fs = [i*i, i*i, i*i]
    
        def count():
            fs = []
            for i in range(1, 4):
                def f(j = i):        # changed
                    return j * j    # changed
                fs.append(f)
            return fs
    
        f1, f2, f3 = count()
        print f1(), f2(), f3()
    

    1, 4, 9

        # 问题的产生是因为函数只在执行时才去获取外层参数i,若函数定义时可以获取到i,问题便可解决
        # 默认参数可以在完成定义时获取i值
    
    - ###匿名函数
       - 定义:`lambda 函数参数:表达式`
       - 限制:只能有一个表达式,返回值就是表达式的结果
       - 不需要显式地定义函数,可简化代码
       - 可以被返回
    
        def is_not_empty(s):
            return s and len(s.strip()) > 0
    
        print filter(is_not_empty, ['test', None, '', 'str', '  ', 'END'])
        # 效果等同与于
        print filter(lambda s:s and len(s.strip()) > 0, ['test', None, '', 'str', '  ', 'END'])
    
    - decorator装饰器
       - 本质:其实就是定义一个高阶函数,它接收一个函数作为参数,然后返回一个新函数
       - 作用:定义了一个函数,运行时动态增加功能,又不改动函数本身的代码
       - 使用:decorator用Python提供的@语法,简化代码,避免每个函数编写重复性代码
           - 打印日志:@log
           - 检测性能:@performance
           - 数据库事务:@transaction
           - URL路由:@post('/register')
    
    
    
    
  • 相关阅读:
    7. 整数反转
    14. 最长公共前缀
    13. 罗马数字转整数
    从web解析到网络空间
    python实例:霍兰德人格分析雷达图
    从数据处理到人工智能
    Python第三方库的安装
    Python之os库的使用
    Python第三方库的安装
    Python程序设计思维
  • 原文地址:https://www.cnblogs.com/wyq0808/p/8822692.html
Copyright © 2020-2023  润新知