zoukankan      html  css  js  c++  java
  • 函数式编程

    # 函数式编程
    # 语法都会,但是仍然不会写程序.
    # 比如,英语单词和语法达到一定的量之后,就自动说出英语了.
    # 不会写程序,还是语法不熟悉.坚持练
    # 有的人写代码需要很多行,有的人需要一行就搞定了.

    """
    编程的方法论:
    # 面向过程
    # 函数式
    # 面向对象
    1)面向过程
    大的问题拆分成几部来完成
    每一步一步的完成
    # 没有返回值的函数
    def cal(x):
    res = 2*x
    res += 1
    return res

    2)函数式编程
    并不是简单的函数封装
    函数式 = 编程语言定义的函数+数学意义的函数
    先定义数学模型,y=2*x + 1
    用python实现上面的数学逻辑.
    def cal(x):
    return 2*x + 1
    代码精简,可读性差
    python不是严格意义上的函数式编程语言.
    函数式编程语言:hashell clean erlang

    3)面向对象


    函数式编程有哪些特点?
    """
    # 1) 不可变:不用变量保存状态,不修改变量
    a = 1
    def incr_test1():
    global a
    a += 1
    return a
    print(incr_test1())

    # 没有变量的定义
    # 不修改变量
    n = 1
    def incr_test2(n):
    return n + 1
    print(incr_test2(10))


    # 2) 第一类变量:函数即"变量"
    # 函数可以作为一个参数进行传递
    def foo(n):
    print(n)
    def bar(m):
    print("bar" + m)
    foo(bar) # print bar函数的地址<function bar at 0x1019ac598>
    foo(bar("alex")) # bar函数返回值传给foo None

    # 返回值中可以包含函数,可以是自己
    def foo():
    print("from foo")
    return foo
    func = foo()
    func()
    # 也可以是其他任意函数
    def bar():
    print("from bar")
    def foo():
    print("from foo")
    return bar
    func = foo()
    func() # from bar

    def test1():
    return "from test1"
    def test2():
    return test1()
    print(test2()) # from test1

    """
    函数接受的参数是一个函数
    返回值中可以包含函数,可以是自己,也可以是其他任意函数

    满足这两个条件之一就是高阶函数.
    """

    # 3) 尾调用:在函数最后一步调用另外一个函数(最后一步不一定是函数的最后一行)
    # 最后一步不一定是函数的最后一行
    def test(x):
    if x > 1:
    return True
    elif x == 1:
    return False
    else:
    return True
    test1()

    # bar 在foo内非尾调用
    def bar(n):
    return n
    def foo(x):
    return bar(x) + 1 # notes: 这里最后一步并不是调用函数,实际上是两步

    # bar 在foo内是尾调用
    def bar(n):
    return n
    def foo(x):
    bar(x)


    # 尾递归优化,进入递归,上一层递归的状态不进行保存,立马丢弃.因为已经完全执行完了.解决一部分递归效率低的问题(因为递归开辟内存大,需要保存每一层的状态.)

  • 相关阅读:
    环形数组求最大子数组
    教学楼电梯调度需求分析
    结对编程实践扩展
    《梦断代码》读书笔记
    CS小分队第二阶段冲刺站立会议(5月30日)
    CS小分队第二阶段冲刺站立会议(5月29日)
    CS小分队第二阶段冲刺站立会议(5月28日)
    第一阶段冲刺个人总结
    CS小分队第二阶段冲刺站立会议(5月27日)
    CS小分队第二阶段冲刺站立会议(5月26日)
  • 原文地址:https://www.cnblogs.com/Windows-phone/p/9729843.html
Copyright © 2011-2022 走看看