zoukankan      html  css  js  c++  java
  • 【python】-- 递归函数、高阶函数、嵌套函数、匿名函数

    递归函数

    在函数内部,可以调用其他函数。但是在一个函数在内部调用自身,这个函数被称为递归函数

    def calc(n):
        print(n)
        if int(n/2) == 0:  #结束符
            return n
        return calc(int(n/2))  #调用函数自身
     
    m = calc(10)
    print('----->',m)
     
    #输出结果
    10
    5
    2
    1
    -----> 1 #最后返回的值

    递归特性:

    1. 必须有一个明确的结束条件

    2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少

    3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

    堆栈详情:http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html 

    递归函数使用案例:

    二分查找:

    data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
     
     
    def binary_search(dataset,find_num):
        print(dataset)
     
        if len(dataset) >1:
            mid = int(len(dataset)/2)
            if dataset[mid] == find_num:  #find it
                print("找到数字",dataset[mid])
            elif dataset[mid] > find_num :# 找的数在mid左面
                print("33[31;1m找的数在mid[%s]左面33[0m" % dataset[mid])
                return binary_search(dataset[0:mid], find_num)
            else:# 找的数在mid右面
                print("33[32;1m找的数在mid[%s]右面33[0m" % dataset[mid])
                return binary_search(dataset[mid+1:],find_num)
        else:
            if dataset[0] == find_num:  #find it
                print("找到数字啦",dataset[0])
            else:
                print("没的分了,要找的数字[%s]不在列表里" % find_num)
     
     
    binary_search(data,66)
    View Code

    1+2+3+4+.....+100的例子:

    def add_to_100(n):
        if n == 0:
            return n
        return n + add_to_100(n-1)
     
    n = add_to_100(100)
    print(n)
     
    #输出
    5050
    View Code

    匿名函数

    匿名函数就是不需要显式的指定函数,跟普通函数的最大区别就是不用特意用def 关键字去定义

    #这段代码
    def calc(n):
        return n**n
    print(calc(10))
     
    #换成匿名函数
    calc = lambda n:n**n
    print(calc(10))

    匿名函数主要是和其它函数搭配使用,可以优化代码,如下:

    res = map(lambda x:x**2,[1,5,7,4,8])
    for i in res:
        print(i)

    嵌套函数

    嵌套函数,顾名思义就是函数里面套函数,在一个函数的函数体内,用def 去声明一个函数,而不是去调用其他函数,称为嵌套函数

    name = "apple"
     
    def change_name():
        name = "apple1"
     
        def change_name2():
            name = "apple2"
            print("第3层打印",name)
     
        change_name2() #调用内层函数
        print("第2层打印",name)
     
     
    change_name()
    print("最外层打印",name)

     注:主要用于装饰器

    高阶函数

    变量可以指向函数(把函数名,即函数的栈内存地址当成变量的值,函数名作为变量),函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,说白了,高阶函数功能就是:把函数本身当做一个参数,传到另一个函数中,然后在这个函数中做处理,这种函数就称之为高阶函数:

    #普通函数
    def test_1(a,b):
        return a+b
     
    #高阶函数
    def test_2(a,b,f):
        return f(a)+f(b)
     
    print("------test_1-----")
    res = test_1(1,-3)
    print(res)
    print("------test_2-----")
    res = test_2(1,-3,abs)  #把abs这个内置函数当做参数传进去
    print(res)
     
    #输出
    ------test_1-----
    -2
    ------test_2-----
    4

     

    实现高阶函数有两个条件:

    1、把一个函数名当做实参传给另外一个函数

    def bar():
        time.sleep(3)
        print("in the bar")
     
    def test1(func):
        print(func)
        start_time = time.time()
        func()
        stop_time = time.time()
        print("the func run the is %s"%(stop_time-start_time))
    #没有修改bar的代码
    test1(bar)  #把bar函数名当做实参传到test1中
     
    #输出
    <function bar at 0x0000000000A7D378>  #bar函数的内存地址
    in the bar
    the func run the is 2.9912972450256348

    2、返回值中包含函数名

    import  time
     
    def bar():
        time.sleep(3)
        print("in the bar")
     
    def test2(func):
        print(func)
        return func   #返回函数的内存地址
     
    #调用test2函数
    bar = test2(bar) 
    bar()  #没有bar函数改变调用方式
     
    #输出
    <function bar at 0x0000000000B6D378>  #打印bar函数的内存地址
    in the bar

    注:主要用于装饰器

    函数式编程介绍

    函数是Python内建支持的一种封装,我们通过把大段代码拆成函数,通过一层一层的函数调用,就可以把复杂任务分解成简单的任务,这种分解可以称之为面向过程的程序设计。函数就是面向过程的程序设计的基本单元。

    函数式编程中的函数这个术语不是指计算机中的函数(实际上是Subroutine),而是指数学中的函数,即自变量的映射。也就是说一个函数的值仅决定于函数参数的值,不依赖其他状态。比如sqrt(x)函数计算x的平方根,只要x不变,不论什么时候调用,调用几次,值都是不变的。

    Python对函数式编程提供部分支持。由于Python允许使用变量,因此,Python不是纯函数式编程语言。

    一、定义

    简单说,"函数式编程"是一种"编程范式"(programming paradigm),也就是如何编写程序的方法论。

    主要思想是把运算过程尽量写成一系列嵌套的函数调用。举例来说,现在有这样一个数学表达式:

     (1 + 2) * 3 - 4

     传统的过程式编程,可能这样写:

    var a = 1 + 2;
    
    var b = a * 3;
    
    var c = b - 4;

    函数式编程要求使用函数,我们可以把运算过程定义为不同的函数,然后写成下面这样:

    var result = subtract(multiply(add(1,2), 3), 4);

    再演进以下,可以变成这样:

    add(1,2).multiply(3).subtract(4)

    函数式编程只是介绍,python 并不适合函数式编程,Erlang,Haskell更适合

  • 相关阅读:
    JavaScript 判断 URL
    AppCan 文件上传实例
    IIS6.0手动安装与配置asp.net2.0全过程
    轻松搭建一个Windows SVN服务器
    IIS6.0上某些文件类型不能下载
    JavaScript 数组转字符串,字符串转数组
    百度地图API 应用实例
    IIS7.5 下:HTTP 错误 404.17 Not Found 请求的内容似乎是脚本 解决方法
    SQL 交集 差集 并集 笛卡尔积 应用实例
    Win7 64位 IIS未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项
  • 原文地址:https://www.cnblogs.com/Keep-Ambition/p/7273319.html
Copyright © 2011-2022 走看看