zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    接水果(fruit)
    大融合
    排序(sortb)
    latex公式测试
    次小生成树
    HDU 2973 YAPTCHA (威尔逊定理)
    状压DP概念 及例题(洛谷 P1896 互不侵犯)
    ICPC Asia Nanning 2017 F. The Chosen One (大数、规律、2的k次幂)
    HDU 1074 Doing Homework (状压DP)
    最长上升(不下降)子序列(LIS) 不同求解方法(动规、贪心)
  • 原文地址:https://www.cnblogs.com/Sheppard/p/11340648.html
Copyright © 2011-2022 走看看