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更适合

  • 相关阅读:
    UVA 254 Towers of Hanoi
    UVA 701 The Archeologists' Dilemma
    UVA 185 Roman Numerals
    UVA 10994 Simple Addition
    UVA 10570 Meeting with Aliens
    UVA 306 Cipher
    UVA 10160 Servicing Stations
    UVA 317 Hexagon
    UVA 10123 No Tipping
    UVA 696 How Many Knights
  • 原文地址:https://www.cnblogs.com/Keep-Ambition/p/7273319.html
Copyright © 2011-2022 走看看