博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【python】-- 递归函数、高阶函数、嵌套函数、匿名函数
阅读量:6403 次
发布时间:2019-06-23

本文共 3621 字,大约阅读时间需要 12 分钟。

递归函数

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

def calc(n):    print(n)    if int(n/2) == 0:  #结束符        return n    return calc(int(n/2))  #调用函数自身 m = calc(10)print('----->',m) #输出结果10521-----> 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("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])            return binary_search(dataset[0:mid], find_num)        else:# 找的数在mid右面            print("\033[32;1m找的数在mid[%s]右面\033[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**nprint(calc(10)) #换成匿名函数calc = lambda n:n**nprint(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中 #输出
#bar函数的内存地址in the barthe 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函数改变调用方式 #输出
#打印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更适合

 

转载于:https://www.cnblogs.com/Keep-Ambition/p/7273319.html

你可能感兴趣的文章
Vue 基础篇
查看>>
JavaScript:函数防抖与函数节流
查看>>
关于区间贪心的补全
查看>>
架构设计步骤
查看>>
自定义元素探秘及构建可复用组件最佳实践
查看>>
区块链是一个公共数据库,要放在一个块内
查看>>
Jenkins 用户文档(目录)
查看>>
系统常见指标
查看>>
使用crond构建linux定时任务及日志查看
查看>>
地图绘制初探——基于maptalks的2.5D地图绘制
查看>>
SpringBoot2.0之七 实现页面和后台代码的热部署
查看>>
Git 仓库大扫除
查看>>
设计模式-单例模式
查看>>
es6基础0x014:WeakMap
查看>>
九种 “姿势” 让你彻底解决跨域问题
查看>>
php中mysqli 处理查询结果集总结
查看>>
你不知道的JavaScript运算符
查看>>
小程序开发注意事项
查看>>
ECMAScript7规范中的instanceof操作符
查看>>
Hadoop HDFS原理分析
查看>>