函数的进阶

Posted hj59988326

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了函数的进阶相关的知识,希望对你有一定的参考价值。

闭包函数

什么是闭包

闭包:闭是封闭(函数内部函数),包是包含(该内部函数对外部作用域而非全局作用域的变量引用)

闭包指的是:函数内部函数对外部作用域而非全局作用域的引用。

两种为函数传参的方式

为函数传参的方式一:使用参数的形式


    
def func(x):
    print(x)


func(1)
func(1)
func(1)

为函数传参的方式二:包给函数

def outter(x):
    x = 1

    def inner():
        print(x)
    return inner


f = outter(1)
f()
f()
f()
# 查看闭包的元素
print(F"f.__closure__[0].cell_contents: f.__closure__[0].cell_contents")

闭包函数的应用

闭包的意义:返回的函数对象,不仅仅是一个函数对象,在该函数外还包裹了一层作用域,这使得,该函数无论在何处调用,优先使用自己外层包裹的作用域。

应用领域:延迟计算(原来我们是传参,现在我们是包起来)、爬虫领域。

装饰器

什么是装饰器

器指的是工具,而程序中的函数就是具备某一功能的工具,所以装饰器指的是为被装饰器对象添加额外功能。因此定义装饰器就是定义一个函数,只不过该函数的功能是用来为其他函数添加额外的功能。

要注意的是:

  • 装饰器本身其实是可以任意可调用的对象
  • 被装饰的对象也可以是任意可调用的对象

为什么要用装饰器

对原来的功能进行扩展另外功能但使其源代码不变

装饰器的实现必须遵循两大原则:

  1. 不修改被装饰对象的源代码
  2. 不修改被装饰对象的调用方式

怎么使用装饰器

第一种传参方式:改变调用方式

import time

def index():
    print('welcome to index')
    tinme.sleep(1)

def time_count(func):
    star=time.time()
    func()
    end=time.time()
    print(f'func time is start-end')
    
time_count(index)
    

第二种传参方式:包给函数-外包

import time 

def index():
    print('welcome to index')
    time.sleep(1)
    
def time_count(func)
    def wrapper():
        star = time.time()
        func()
        end = time.time()
    return wrapper


index = time_count(index)
index()

完善装饰器

上述的装饰器,最后调用index()的时候,其实是在调用wrapper(),因此如果原始的index()有返回值的时候,wrapper()函数的返回值应该和index()的返回值相同,也就是说,我们需要同步原始的index()和wrapper()方法的返回值。

import time


def index():
    print('welcome to index')
    time.sleep(1)

    return 123


def time_count(func):
    # func = 最原始的index
    def wrapper():
        start = time.time()
        res = func()
        end = time.time()
        print(f"func time is start-end")

        return res
    return wrapper


index = time_count(index)
res = index()
print(f"res: res")

装饰器语法糖

在被装饰函数正上方,并且是单独一行写上@装饰器名

装饰器模板

def deco(func):
    def wrapper(*args,**kwargs):
        res = func(*args,**kwargs)
        return res
    return wrapper

以上是关于函数的进阶的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript函数进阶回调函数递归函数闭包函数

函数进阶

python---函数的进阶

第五篇 函数进阶

Python进阶学习——函数式编程

No-12.函数进阶