• 装饰器、生成器、迭代器


     
     
    装饰器
     
    装饰器
    装饰器是一个闭包,把一个函数作为一个参数然后返回一个替代的函数,本质上就是一个返回函数的高阶函数。
     
    闭包:如果在一个内部函数中对外部作用域(但不是全局作用域)的变量进行引用,那么该内部函数称为闭包
     
    什么时候用装饰器?
    在不修改原函数的前提下增加函数的功能 ,最好的方法是使用装饰器。(在代码运行期间动态增加功能)
     
    为func函数添加多个装饰器:
     1 def dec1(func):
     2     def wrapper(*args, **kwargs):
     3         print('添加功能1')
     4         func()
     5         print('添加功能1')
     6     return wrapper
     7 def dec2(func):
     8     def wrapper(*args, **kwargs):
     9         print('添加功能2')
    10         func()
    11         print('添加功能2')
    12     return wrapper
    13     
    14 @dec1
    15 @dec2
    16 def func():
    17     print('原本功能0')
    18 
    19 func()
    20 
    21 # 添加功能1
    22 # 添加功能2
    23 # 原本功能0
    24 # 添加功能2
    25 # 添加功能1

    装饰器使用场景

    1.参数、结果的检查。

    2.缓存

    3.计数

    4.日志

    5.统计

    6.权限管理

    7.重试

    生成器

    列表生成式

    是python内置的非常简单并且强大的可以用来生成list的生成式生成列表。

    1 # 列表生成式生成列表,在for循环后加上if判断
    2 print [ i*i for i in range(1,11) if i !=0 ]
    3 
    4 #[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
    # 使用双层循环(两个for循环),生成全排列
    print ([i*j for i in range(1,5) for j in range(2,6)])
    
    # [2, 3, 4, 5, 4, 6, 8, 10, 6, 9, 12, 15, 8, 12, 16, 20]

    生成器

    在python中,这种一边循环一边推导的机制成为生成器。

    生成器提供了一种更为便利的产生迭代器的方式, 一般用户不需要自己实现iter和next方法,它默认返回一个可迭代对象;代码更为简洁,优雅;节省存储空间

    通过列表生成式,可以直接创建一个列表,所有的数据都会存到内存中,受内存的限制,但列表的容量是有限制的。如果列表中有10000个数据,如果我们只需要访问前几个元素,后面的基本不会访问那么造成内存极大的浪费。如果我们列表中的元素可以按照某种算法推导出来,那么我们在循环遍历列表时,我们不断推导后面的元素,从而节省大量内存。

    创建生成器

    1、把列表生成式的 [] 改成 () 

    2、函数实现生成器(yield语句)

    函数是按顺序执行,遇到return 或者最后一行函数语句就返回。如果想要把一个函数改为生成器函数,只需将函数的return改为yield,即变成 generator函数。在每次调用next()的时候,会遇到yield语句返回,如果再次执行next(),那么它会从上次返回的yield语句处继续向下执行

    遍历方法:

    1、使用g.next()方法依次读取元素(当所有元素都拿出来后,再执行next会得到StopIteration异常)

    2、使用 for 循环(推荐)

    迭代器

    迭代(Iteration):在Python 中,我们可以通过 for 、while循环遍历 list 或 tuple 等数据类型,这种遍历我们称为迭代。

    可迭代对象(Iterable:可以直接作用于 for 循环的对象我们称为可迭代对象,一般包括集合数据类型和生成器。

    可以直接作用于for循环的数据类型:

        1.集合数据类型,如 list、tuple、dict、set、string等

        2.generator, 包含生成器 和带yield的 generator function

    注意:可以使用isinstance()函数 判断一个对象是否是 Iterable对象

    迭代器(Iterator):实现了迭代器协议的对象称为迭代器,生成器是可迭代对象,同时也是迭代器

    Iterable(可迭代对象)  和  Iterator(迭代器) 主要区别是:

    凡是可以用 for 循环的 都是  Iterable(可迭代对象),凡是需要通过next()函数获得值的可迭代对象都是 Iterator(迭代器)。
  • 相关阅读:
    MariaDB 正则
    MariaDB 条件语句WHERE
    MariaDB SHOW,ANALYZE,CHECK
    eclipse的debug使用(转载)
    linux中vi编辑器(转载)
    centos6.4中文输入法安装和切换(转载)
    windows快捷键大全(转载)
    windows命令大全(转载)
    windows下route命令详解(转载)
    public,protected,private,static,final的区别(转载)
  • 原文地址:https://www.cnblogs.com/yekushi-Z/p/11411702.html
Copyright © 2020-2023  润新知