一.迭代器
迭代概念
就是一种获取数据的方式,通过for循环获取数据的过程也叫迭代。
可迭代对象
指可以通过for循环遍历的对象,例如:列表、字典、元组、字符串等。也可以自定义可迭代对象。
- 判断对象是否是可迭代对象:
isinstance('对象', Iterable)
返回结果True或False
迭代器
迭代器可以获取可迭代对象的数据时记录当前获取的位置。迭代器只能一直往前获取,不会后退,直到获取完后,再去获取则会抛出异常StopIteration
异常
- 获取一个可迭代对象的迭代器:
迭代器 = iter(可迭代对象)
- next获取迭代器里的数据:
date = next(迭代器)
- for获取迭代器里的数据:
fro i in 迭代器:
当for循环获取完数据后,会自动处理StopIteration
异常
自定义迭代器
- 只要在类中定义
__iter__
方法的对象,就是一个可迭代对象,在__iter__
方法中返回一个迭代器
class MyList(object):
"""自定义可迭代对象"""
def __init__(self):
self.items = []
def add(self, val):
self.items.append(val)
def __iter__(self):
myiterator = MyIterator(self)
return myiterator
- 定义一个迭代器类实现
__next__
方法,这里__iter__
返回self
class MyIterator(object):
"""定义迭代器"""
def __init__(self, mylist):
self.mylist = mylist
# current记录当前访问的位置
self.current = 0
def __next__(self):
# 判断是否全部迭代完毕
if self.current < len(self.mylist.items):
# 每次获取一个值然后返回
item = self.mylist.items[self.current]
self.current += 1
return item
else:
raise StopIteration
def __iter__(self):
return self
二.生成器
生成器概念
生成器是一种特殊的迭代器,可以一边循环一边计算的机制称之为生成器
生成器的创建
方式1:将列表推导式中的[]
改为()
list01 = (x for x in range(100))
方式2:在函数中定义yield
def test1():
yield
三.闭包
闭包的定义
在一个函数里嵌套定义了另外一个函数,里面的函数使用外部函数中的变量,最后把里面的函数作为外部函数的返回值反回,这样就形成一个闭包
作用
闭包可以让里面的函数用外面函数的变量,这样就保证了此时的变量在局部起效果,而非所有函数都可以调用。
定义一个闭包
def test(num1):
def test_in(num2):
print('我是test_in')
return num1+num2
# 根据实际情况需不需要返回里面的函数
return test_in
四.装饰器
装饰器介绍
在类中,通过@装饰器对方法进行添加功能的方式就是装饰器,装饰器是为了在不改动源代码的基础上给方法添加功能,实现的开闭原则。
定义装饰器
def test1(func):
def test2(*args, **kwargs):
print("%s called at %s"%(func.__name__, ctime()))
func(*args, **kwargs)
return wrapped_func
@timefun
def func(a, b, c):
print(a+b+c)
foo(2,4,6)