**1. 迭代器
- 生成器
- 实战:range函数效果**
装饰器
- 用于拓展原来函数功能的一种函数
- 返回函数的函数
- 在不用更改原函数代码的前提下给函数增加新的功能
test_decorator.py
def hello():
"""简单功能模拟"""
print("hello world")
def test():
print('test...')
def hello_wrapper():
"""新的函数,包裹原来的hello"""
print('开始执行hello')
hello()
print('结束执行hello')
def test_wrapper():
print('进入函数')
test()
print('结束执行')
if __name__ == '__main__':
hello()
hello_wrapper()
什么是装饰器
def hello():
"""简单功能模拟"""
print("hello world")
def log(func):
"""记录函数执行的日志"""
def wrapper():
print('start...')
func()
print('end...')
return wrapper
def log_in(func):
"""记录函数执行的日志"""
def wrapper():
print('开始进入...')
func()
print('结束...')
return wrapper
@log
@log_in
def hello():
"""简单模拟功能"""
print('hello world')
@log
def test():
print('test ...')
if __name__ == '__main__':
hello()
print('-'*100)
test()
E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator2.py
start...
开始进入...
hello world
结束...
end...
----------------------------------------------------------------------------------------------------
start...
test ...
end...
Process finished with exit code 0
带参数的装饰器
def log(name=None):
"""记录函数执行的日志"""
def decorator(func):
def wrapper(*args, **kwargs):
print('{0}.start...'.format(name))
print(args)
print(kwargs)
rest = func(*args, **kwargs)
print('{0}.end...'.format(name))
return rest
return wrapper
return decorator
@log('from add')
def add(a, b,*args,**kwargs):
return a + b
@log('hello')
def hello():
"""简单模拟功能"""
print('hello world')
@log('test')
def test():
print('test ...')
if __name__ == '__main__':
# hello()
# print('-' * 100)
# test()
rest = add(5, 6, k=5, v=6)
print(rest)
E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator3.py
from add.start...
(5, 6)
{'k': 5, 'v': 6}
from add.end...
11
Process finished with exit code 0
带参数的装饰器之wraps
def log(name=None):
"""记录函数执行的日志"""
def decorator(func):
def wrapper2(*args, **kwargs):
"""装饰器里面的函数"""
print('{0}.start...'.format(name))
print(args)
print(kwargs)
rest = func(*args, **kwargs)
print('{0}.end...'.format(name))
return rest
return wrapper2
return decorator
@log('hello')
def hello():
"""简单模拟功能"""
print('hello world')
if __name__ == '__main__':
print('doc:{0}'.format(hello.__doc__))
print('name:{}'.format(hello.__name__))
hello()
hello()带装饰器
E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator4.py
doc:装饰器里面的函数
name:wrapper2
hello.start...
()
{}
hello world
hello.end...
Process finished with exit code 0
注释掉hello()装饰器的结果
E:\Python\venv\Scripts\python.exe E:/py-learn/chapter06/test_decorator4.py
doc:简单模拟功能
name:hello
hello world
Process finished with exit code 0
from functools import wraps
def log(name=None):
"""记录函数执行的日志"""
def decorator(func):
@wraps(func)
def wrapper2(*args, **kwargs):
"""装饰器里面的函数"""
print('{0}.start...'.format(name))
print('---------------warpper:{0}'.format(func.__name__))
print('---------------warpper:{0}'.format(func.__doc__))
rest = func(*args, **kwargs)
print('{0}.end...'.format(name))
return rest
# wrapper2.__doc__ = func.__doc__
# wrapper2.__doc__ = func.__name__
return wrapper2
return decorator
@log('hello')
def hello():
"""简单模拟功能"""
print('hello world')
if __name__ == '__main__':
print('doc:{0}'.format(hello.__doc__))
print('name:{}'.format(hello.__name__))
hello()
类装饰器
def f(self):
print('{0}>我要吃东西'.format(self.name))
print('0000000000000')
def eat(cls):
"""吃东西装饰器"""
# cls.eat = lambda self: print('{0}>我要吃东西'.format(self.name))
cls.eat = f
return cls
@eat
class Cat(object):
"""猫类"""
def __init__(self, name):
self.name = name
if __name__ == '__main__':
cat = Cat('小黑')
cat.eat()