1. 装饰器介绍
1.1 装饰器定义
装饰器是在闭包的基础上,将函数作为外部函数的唯一的形参传入进去。
装饰器格式:
def decorator(fn):
def inner():
fn()
return inner
调用方式:
fn=decorator(fn) # 此时fn=inner,而不是fn=inner()
fn() # fn() == inner()
语法糖格式: 将@装饰器 写到被装饰的函数前面。
@decorator
def fn(x):
print(x)
fn()
1.2 带参装饰器
def func(flog):
def decorator(fn):
def inner(num1,num2):
if flag == 1:
fn(num1,num2)
else:
result = 0
return result
return inner
return decorator
@func(1)
def fn(num1,num2):
result = num1+num2
return result
result = fn(1,2)
print(result)
装饰器错误原因:装饰器的外部函数形参只有一个函数参数
def decorator(fn,flag):
def inner(num1,num2):
if flag ==1:
result = fn(num1,num2)
else:
result = 0
return result
return inner
1.3 多个装饰器的使用
def make_div(func):
"""对被装饰的函数的返回值 div标签"""
def inner(*args, **kwargs):
return "<div>" + func() + "</div>"
return inner
def make_p(func):
"""对被装饰的函数的返回值 p标签"""
def inner(*args, **kwargs):
return "<p>" + func() + "</p>"
return inner
# 装饰过程: 1. content = make_p(content) 2. content = make_div(content)
# content = make_div(make_p(content))
@make_div
@make_p
def content():
return "人生苦短"
result = content()
print(result)
多个装饰器可以对函数进行多个功能的装饰,装饰顺序是由内到外的进行装饰
1.4 类装饰器
class Check(object):
def __init__(self, fn):
# 初始化操作在此完成
self.__fn = fn
# 实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用。
def __call__(self, *args, **kwargs):
# 添加装饰功能
print("请先登陆...")
self.__fn()
@Check # comment=Check(comment)
def comment():
print("发表评论")
comment()
1. 迭代器
1.1 可迭代对象
Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指能够执行for …in 循环语句遍历的对象。
- 常见的可迭代对象包括:
- 集合数据类型,如list、tuple、dict、set、string,range;
- 生成器(generator),包括生成器和带yield的生成器函数(generator function)
- iter方法的作用是让对象可以用for … in循环遍历
- for … in语句其实做了两件事:第一件事是调用iter()获得一个可迭代器,第二件事是循环调用next()。
- 如何判断一个对象是可迭代对象呢?具体判断方法如下: ```python from collections import Iterable #导入Iterable 模块
a = isinstance(变量, Iterable) #判断一个变量是否为可迭代对象返回True表明是可迭代对象 print(a)
1.2 迭代器
一个对象只要实现了_iter(),next()方法,就是迭代器。
- 迭代是Python最强大的功能之一,是访问集合元素的一种方式。
- 迭代器是一个可以记住遍历的位置的对象。
- 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。
迭代器有两个基本的方法:iter() 和 next()。
>>> list=[1,2,3,4]
>>> it = iter(list) # 创建迭代器对象
>>> print (next(it)) # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>
1.3 自定义迭代器
自定义迭代器需要在类中定义_iter(),next()方法
StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。 ```python class Reverse(object): def init(self, data):self.data = data
self.index = len(data)
def iter(self):
return self
def next(self):
if self.index == 0:
raise StopIteration
self.index -= 1
return self.data[self.index]
rev = Reverse([1,2,3,4,5]) for x in rev: print(x)
2. 生成器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。