python 装饰器,生成器,迭代器
-
作用:当我们想要增强原来已有函数的功能,但不想(无法)修改原函数,可以使用装饰器解决
-
使用:
-
先写一个装饰器,就是一个函数,该函数接受一个函数作为参数,返回一个闭包,而且闭包中执行传递进来的函数,闭包中可以在函数执行的前后添加一些内容。
-
在需要装饰的函数前添加
@装饰器名
就可以使用了,如:-
再使用原函数时,就已经是装饰过的了
-
-
-
示例1:无参无返回值
def shuai(func):
def wrapper():
print('拉风的墨镜')
func()
print('脚穿大头鞋')
return wrapper
-
示例2:带参函数的装饰器
# 带参函数的装饰器
def zhuangshiqi(func):
def wrapper(*args, **kwargs):
print('今天天气不错,出门就打到车了')
func(*args, **kwargs)
return wrapper
-
示例3:带参有返回值的装饰器
def zhuangshiqi(func):
def wrapper(*args, **kwargs):
return func(*args, **kwargs) + 10
return wrapper
生成器(generator)
-
列表生成式,可以快速的生成列表
# 数据量非常小,内存占用不大
l = [i for i in range(10)]
# 数据量特别大时,会造成内存占用突然增大
l2 = [i for i in range(10000)] -
为了解决内存突然增大问题,python引入了生成器
-
产生方式:
-
将列表生成式的[]改为()
# 数据量非常小,内存占用不大
l = [i for i in range(10)]
# 数据量特别大时,会造成内存占用突然增大
# l2 = [i for i in range(10000)]
# 生成器
l2 = (i for i in range(2))
print(type(l))
print(type(l2))
# 可以转换为列表
# print(list(l2))
# 使用next获取生成器中值,一次一个,遍历结束会报错StopIteration
# print(next(l2))
# print(next(l2))
# print(next(l2))
# 可以使用for-in遍历
for i in l2:
print(i)-
通过在函数中使用
yield
关键字
def test(n):
l = []
for i in range(1, n+1):
l.append(i)
return l
# print(test(5))
def test2(n):
for i in range(1, n+1):
yield i
t = test2(5)
for j in t:
print(j) -
-
特性:
-
可以使用next获取数据,一次一个,结束时会报错
-
只能遍历一遍
-
可以转换为列表
-
可以使用for-in遍历
-
定义:就是可以使用for-in进行遍历,并且可以使用next依次获取元素的对象
-
说明:
-
生成器就是一种特殊的迭代器
-
判断是否是迭代器
from collections import Iterator
l = (i for i in range(10))
print(isinstance(l, Iterator))-
字符串、列表、元组、集合、字典等都不是迭代器,他们都是可迭代对象。
-
可迭代对象
-
定义:可以使用for-in遍历的对象,我们都称之为可迭代对象
-
判断一个对象是否是可迭代对象
from collections import Iterable
print(isinstance(l, Iterable))
print(isinstance(lt, Iterable))
iter函数
-
作用:将可迭代对象转换为迭代器
-
使用:
lt2 = iter(lt)
print(isinstance(lt2, Iterator))