-
作用:当我们想要增强原来已有函数的功能,但不想(无法)修改原函数,可以使用装饰器解决
-
使用:
-
先写一个装饰器,就是一个函数,该函数接受一个函数作为参数,返回一个闭包,而且闭包中执行传递进来的函数,闭包中可以在函数执行的前后添加一些内容。
-
在需要装饰的函数前添加
@装饰器名
就可以使用了,如:@zhuangshiqi def show(): pass
-
再使用原函数时,就已经是装饰过的了
-
-
-
示例1:无参无返回值
def shuai(func): def wrapper(): print('拉风的墨镜') func() print('脚穿大头鞋') return wrapper @shuai def mugai(): print('木盖,屌丝一枚') mugai()
-
示例2:带参函数的装饰器
# 带参函数的装饰器 def zhuangshiqi(func): def wrapper(*args, **kwargs): print('今天天气不错,出门就打到车了') func(*args, **kwargs) return wrapper @zhuangshiqi def test(n): print('我的幸运数字为:{}'.format(n)) test(7)
-
示例3:带参有返回值的装饰器
def zhuangshiqi(func): def wrapper(*args, **kwargs): return func(*args, **kwargs) + 10 return wrapper @zhuangshiqi def pingfang(n): return n*n print(pingfang(4))
生成器(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))