迭代器
- 什么是迭代器?
迭代器就是一个可以记住遍历的位置的对象
从第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退 - 什么是可迭代对象?
一个可以被for循环遍历的对象就是可迭代对象 - 迭代器一定是可迭代对象,可迭代对象不一定是迭代器
- 判断是否为可迭代对象
from collections.abc import Iterable
a = [1, 2, 3, 4]
b = 123
print(isinstance(a, Iterable))
print(isinstance(b, Iterable))
--------打印结果-----------
True
False
通过Iterable来判断一个对象是否是可迭代对象,因此可见列表是可迭代的,整数是不可以迭代的
- 判断是否为迭代器
from collections.abc import Iterator
a = [1, 2, 3, 4]
iter_a = iter(a)
print(isinstance(iter_a, Iterator))
print(isinstance(a, Iterator))
通过Iterable来判断是否是一个迭代器
生成器
- 什么是生成器
- 一边循环一边计算的机制就是生成器
- 含有yield关键字的函数也是生成器
- 一个含有__item__、__next__方法的对象也是生成器
- 生成器也是一种特殊的迭代器
- 创建生成器的两种方法
第一种: 把列表推导式的[]改为()
第二种: 函数中含有yield[x for x in range(10)] ----> (x for x in range(10))
def num(): num1 = 1 num2 = 2 while True: temp_num = num1 num1, num2 = num2, num1 + num2 yield temp_num n = num() print(next(n)) print(next(n)) print(next(n)) print(next(n)) print(next(n)) -------------执行结果-------------- 1 2 3 5 8
- next()和send()的区别
- next唤醒函数,从断点处继续执行
- send唤醒函数, 并向断点处传入一个值继续执行
- 生成器的特点
- 生成器存储的是生成数据的方式,而不是存储的数据,因此节约内存
闭包
我们想要理解装饰器就必须先学习闭包,因此我们把闭包放在前面
-
什么是闭包?
- 闭包是函数内嵌套了另一个函数,内部函数用了外部函数的局部变量,外部函数返回了内部函数的引用
-
闭包案例
def test(number): def test_in(number_in): print("in test_in 函数, number_in is %d" % number_in) return number+number_in return test_in ret = test(20) print(ret(100)) print(ret(200)) ------------执行结果-------------- in test_in 函数, number_in is 100 120 in test_in 函数, number_in is 200 220
案例中test返回了test_in的引用,所以当调用ret时ret就指向了test_in函数,而内部函数又使用了外部函数的变量number,所以这就是一个闭包
-
闭包和普通函数的区别?
- 普通函数执行结束后会被python解释器自动释放局部变量
- 闭包可以让参数和变量不会被垃圾回收机制回收,始终保持在内存中
装饰器
-
什么是装饰器?
- 能够快速将函数的指向修改, 在不修改代码的前提下,给函数添加功能的方式
-
实现过程
- 将原函数的引用当做实参传递到闭包中
- 修改原函数的指向为闭包中的内部函数
-
使用装饰器实现单例
def SingletonDecorator(cls): _instance = None def get_instance(*args, **kwargs): nonlocal _instance if _instance is None: _instace = cls(*args, **kwargs) return _instance return get_instance @SingletonDecorator class Singleton(object): pass # 创建实例对象 a = Singleton() b = Singleton() print(id(a)) print(id(b)) ---------------------执行结果------------------ 1823904976 1823904976