装饰器、生成器、迭代器

 
 
装饰器
 
装饰器
装饰器是一个闭包,把一个函数作为一个参数然后返回一个替代的函数,本质上就是一个返回函数的高阶函数。
 
闭包:如果在一个内部函数中对外部作用域(但不是全局作用域)的变量进行引用,那么该内部函数称为闭包
 
什么时候用装饰器?
在不修改原函数的前提下增加函数的功能 ,最好的方法是使用装饰器。(在代码运行期间动态增加功能)
 
为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(迭代器)。
原文地址:https://www.cnblogs.com/yekushi-Z/p/11411702.html