1. 装饰器介绍
1.1 装饰器定义
装饰器是在闭包的基础上,将函数作为外部函数的唯一的形参传入进去。
装饰器格式:def decorator(fn):def inner():fn()return inner调用方式:fn=decorator(fn) # 此时fn=inner,而不是fn=inner()fn() # fn() == inner()语法糖格式: 将@装饰器 写到被装饰的函数前面。@decoratordef 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 = 0return resultreturn innerreturn decorator@func(1)def fn(num1,num2):result = num1+num2return resultresult = fn(1,2)print(result)装饰器错误原因:装饰器的外部函数形参只有一个函数参数def decorator(fn,flag):def inner(num1,num2):if flag ==1:result = fn(num1,num2)else:result = 0return resultreturn inner
1.3 多个装饰器的使用
def make_div(func):"""对被装饰的函数的返回值 div标签"""def inner(*args, **kwargs):return "<div>" + func() + "</div>"return innerdef 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_pdef 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 = dataself.index = len(data)
def iter(self):
return self
def next(self):
if self.index == 0:raise StopIterationself.index -= 1return self.data[self.index]
rev = Reverse([1,2,3,4,5]) for x in rev: print(x)
2. 生成器
生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
