函数(下)

高阶函数

高阶函数的特征:

  • 接受函数作为参数
  • 返回值仍然是一个函数
* `def fun1(n):
        if n>50:
            return True
def fun2(fun,n):
    n1=[]
    for i in n:
        if fun(i):
            n1.append([i])
    return n1
import random
array=[]
for i in range(0,100):
    array.append(random.randint(0,101))
print(fun2(fun1,array))`

这就是一个高阶函数,我们可以通过不断调整fun1实现fun2的不同功能。

闭包

• 将函数作为返回值也是高阶函数我们也称为闭包

闭包的好处

• 通过闭包可以创建一些只有当前函数能访问的变量
• 可以将一些私有数据藏到闭包中

行成闭包的条件

• 函数嵌套
• 将内部函数作为返回值返回
• 内部函数必须要使用到外部函数的变量

def fun(num1):
    def fun1(num2):
        add=num1+num2
        print(add)
    return fun1
fun(4)(7)

装饰器

装饰器的引入

我们可能会产生以下问题:
• 如果修改的函数多,修改起来会比较麻烦
• 不方便后期的维护
• 这样做会违反开闭原则(ocp)
• 程序的设计,要求开发对程序的扩展,要关闭对程序的修改

import time
def fun_out(fun):
    def fun_in(*args,**kwargs):
        start = time.clock()
        r=fun(*args,**kwargs)
        print(r)
        end=time.clock()
        print(end)
    return fun_in

装饰器的使用

• 通过装饰器,可以在不修改原来函数的情况下来对函数进行扩展
• 在开发中,我们都是通过装饰器来扩展函数的功能的

import time
def fun_out(fun):
    def fun_in(*args,**kwargs):
        start = time.clock()
        r=fun(*args,**kwargs)
        print(r)
        end=time.clock()
        print(end)
    return fun_in
@fun_out
def add(n1,n2):
    result=n1+n2
    return result
add(7,5)

一般情况下,我们是调用那些非递归函数,但是我们可不可以调用递归函数呢?

import time
def fun_out(fun):
    def fun_in(*args,**kwargs):
        start = time.clock()
        r=fun(*args,**kwargs)
        print(r)
        end=time.clock()
        print(end)
    return fun_in
@fun_out
def add(n1,n2):
    result=n1+n2
    return result
add(7,5)
@fun_out
def sum_n_numbers(n):
    if n==1:
       return 1
    else:
        return n+sum_n_numbers(n-1)
sum_n_numbers(600)

输出结果

 File "G:/程序们/作业十/函数装饰器.py", line 29, in sum_n_numbers
    return n+sum_n_numbers(n-1)
  File "G:/程序们/作业十/函数装饰器.py", line 5, in fun_in
    r=fun(*args,**kwargs)

这表明递归函数没法用装饰器直接实现,有什么办法呢?见作业。

作业

(递归函数的装饰器使用)

import time
def fun_out(fun):
    def fun_in(*args,**kwargs):
        start = time.clock()
        r=fun(*args,**kwargs)
        print(r)
        end=time.clock()
        print(end)
    return fun_in
@fun_out
def func(n):
    def sum_n_numbers(n):
     if n==1:
        return 1
     else:
        return n+sum_n_numbers(n-1)
    return sum_n_numbers(n)
func(600)
@fun_out
def add(n1,n2):
    result=n1+n2
    return result
add(7,5)
180300
0.0006065
12
0.0006283

解决方法其实很简单,只需要将递归函数放置在一个函数内使其成为一个普通的函数,再用装饰器就可以了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值