【python】-- 递归函数、高阶函数、嵌套函数、匿名函数

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("\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**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更适合

以上是 【python】-- 递归函数、高阶函数、嵌套函数、匿名函数 的全部内容, 来源链接: utcz.com/z/388277.html

回到顶部