0812博文——闭包、装饰器和迭代器

闭包函数

什么是闭包?

我对闭包的理解就是,将函数与一个固定参数封闭并且打包成一个包子

包子的不同的馅儿就像是不同的固定参数,函数就像是包子皮,每种不同的固定参数和同样的包子皮,就包成了肉包菜包梅干菜包。

avatar

def 包子皮(func):
	def 包子():
		func()
	return 包子

def 猪肉()
	print('肉包子')

肉包子=包子皮(猪肉)

肉包子()>>>>>>>>打印'肉包子'

闭包函数的应用

这里以一个小爬虫脚本为例

import requests
def spider(url):
    def func():
        rsps=requests.get(url).text
        print(rsps)
    return func
    
    
baidu_spider=spider('baidu.com') #配方
baidu_spider()  #重复配方
baidu_spider()
baidu_spider()

nickblog_spider=spider('https://www.cnblogs.com/nickchen121/p/10769394.html')
nickblog_spider()
nickblog_spider()

当我写好爬虫的闭包函数时,我只需要将含有固定参数(这里是网址url)的’含馅儿包子皮‘赋给一个变量名xx_spider,这样这个变量名的变量值就是这个’含馅儿包子皮‘的内存地址,仅需一个调用,也就是(),就可以调用’含馅儿包子皮‘并且得到一个包子,并且配方你已经知道了,可以重复这样的操作。

装饰器

个人理解:装饰器是一种在不改变函数调用方式和函数源代码基础上给函数增加新功能的解决方案

装饰器的通用模板

def deco(func) #func是需要增加功能的函数
	def inner(*args,**kwargs):
		#需要增加的功能代码
		res=func(*args,**kwargs)
		#需要增加的功能代码
		return res
	return inner
	

装饰器的应用

现在有一个需求,需要在一个加法计算功能中加入计时的功能

from time import time
def get_sum(x,y):
	return x+y
	
def deco(func):
	def inner(*args,**kwargs):  #*args,**kwargs接受原函数中所有的位置实参和关键字实参
        start=time()
        res=func(*args,**kwargs)
        end=time()
        print(end-start)
        return res         #返回原函数的返回值
	return inner

get_sum = deco(get_sum)
print(get_sum(10,20))
>>>>>>>>>>>>>>>>>
0.0
30

还有更简单的写法,通过语法糖

from time import time
def deco(func):
	def inner(*args,**kwargs):  #*args,**kwargs接受原函数中所有的位置实参和关键字实参
        start=time()
        res=func(*args,**kwargs)
        end=time()
        print(end-start)
        return res         #返回原函数的返回值
	return inner
	
	
@deco #语法糖   #相当于get_sum = deco(get_sum)
def get_sum(x,y):
	return x+y
	
print(get_sum(10,20))

迭代器

这个并没有这么难理解

直接cv大法

https://www.cnblogs.com/nickchen121/p/10778506.html

原文地址:https://www.cnblogs.com/Sheppard/p/11340648.html