06 函数

作者: leacoder | 来源:发表于2019-07-03 00:06 被阅读0次

    目录链接:https://www.jianshu.com/p/e1e201bea601

    函数定义

    def name(param1, param2, ..., paramN):
        statements
        return/yield value # optional
    

    其中:
    def 是函数的声明;

    my_func 是函数的名称;

    括号里面的 message 则是函数的参数;

    在函数最后, 你可以返回调用结果(return 或 yield) , 也可以不返回。

    闭包

    闭包其实和嵌套函数类似,不同的是, 这里外部函数返回的是一个函数, 而不是一个具体的值。 返回的函数通常赋于一个变量, 这个变量可以在后面被继续执行调用。
    比如, 我们想计算一个数的 n 次幂, 用闭包可以写成下面的代码:

    def nth_power(exponent):
        def exponent_of(base):
            return base ** exponent
        return exponent_of # 返回值是 exponent_of 函数
    
    square = nth_power(2) # 计算一个数的平方
    cube = nth_power(3) # 计算一个数的立方 
    square
    # 输出
    <function __main__.nth_power.<locals>.exponent(base)>
    
    cube
    # 输出
    <function __main__.nth_power.<locals>.exponent(base)>
    
    print(square(2))  # 计算 2 的平方
    print(cube(2)) # 计算 2 的立方
    # 输出
    4 # 2^2
    8 # 2^3
    

    匿名函数

    什么是匿名函数?

    lambda argument1, argument2,... argumentN : expression
    

    例子:
    匿名函数计算一个数的平方

    square = lambda x: x**2
    square(3)
    9
    

    常规函数计算一个数的平方

    def square(x):
        return x**2
    square(3)
     9
    

    匿名函数 lambda 和常规函数一样, 返回的都是一个函数对象(function object) ,它们的用法也极其相似, 不过还是有下几点区别。

    • 第一, lambda 是一个表达式(expression) , 并不是一个语句(statement) 。

    所谓的表达式, 就是用一系列“公式”去表达一个东西, 比如 x + 2、 x**2 等等;
    所谓的语句, 则一定是完成了某些功能, 比如赋值语句 x = 1完成了赋值

    lambda 可以用在用些常规函数 def 不能用的地方:
    lambda 可以在list内部使用
    [(lambda x: x
    x)(x) for x in range(10)]
    输出
    [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

    lambda 可以作为函数的参数
    l = [(1, 20), (3, 0), (9, 10), (2, -1)]
    l.sort(key=lambda x: x[1]) # 按列表中元祖的第二个元素排序
    print(l)
    输出
    [(2, -1), (3, 0), (9, 10), (1, 20)]*

    • 第二, lambda 的主体是只有一行的简单表达式, 并不能扩展成一个多行的代码块。

    Python 函数式编程

    所谓函数式编程, 是指代码中每一块都是不可变的(immutable) , 都由纯函数(pure function) 的形式组成。 这里的纯函数, 是指函数本身相互独立、 互不影响, 对于相同的输入, 总会有相同的输出, 没有任何副作用。

    例子:
    对于一个列表, 我想让列表中的元素值都变为原来的两倍

    def multiply_2(l):
        for index in range(0, len(l)):
            l[index] *= 2
        return l
    

    这不是一个纯函数的形式, 因为列表中元素的值被改变了,我多次调用multiply_2()这个函数, 那么每次得到的结果都不一样。

    纯函数的形式写法如下,重新创建一个新的列表并返回。

    def multiply_2_pure(l):
        new_list = []
        for item in l:
            new_list.append(item * 2)
        return new_list
    

    Python 主要提供了这么几个函数:map()、 filter() 和 reduce(), 通常结合匿名函数 lambda 一起使用。

    函数 参考链接
    map() 函数 https://www.runoob.com/python/python-func-map.html
    filter() 函数 https://www.runoob.com/python3/python3-func-filter.html
    reduce() 函数 https://www.runoob.com/python/python-func-reduce.html

    关于Python 函数式编程可参看
    https://blog.csdn.net/u013398034/article/details/78701714

    参考资料:

    极客时间 Python核心技术与实战学习

    Python核心技术与实战(极客时间)链接:
    http://gk.link/a/103Sv

    一篇文章搞懂Python中的函数式编程:
    https://blog.csdn.net/u013398034/article/details/78701714


    GitHub链接:
    https://github.com/lichangke/LeetCode

    知乎个人首页:
    https://www.zhihu.com/people/lichangke/

    简书个人首页:
    https://www.jianshu.com/u/3e95c7555dc7

    个人Blog:
    https://lichangke.github.io/

    欢迎大家来一起交流学习

    相关文章

      网友评论

        本文标题:06 函数

        本文链接:https://www.haomeiwen.com/subject/apwxhctx.html