码迷,mamicode.com
首页 > 其他好文 > 详细

函数的进阶(一)

时间:2019-09-23 22:58:43      阅读:190      评论:0      收藏:0      [点我收藏+]

标签:延迟   模板   内部函数   爬虫   int   import   方式   全局   def   

闭包函数

什么是闭包

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

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

两种为函数传参的方式

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


    
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

函数的进阶(一)

标签:延迟   模板   内部函数   爬虫   int   import   方式   全局   def   

原文地址:https://www.cnblogs.com/hj59988326/p/11575012.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!