Python三器一闭

迭代器

  • 什么是迭代器?
    迭代器就是一个可以记住遍历的位置的对象
    从第一个元素开始访问,直到所有的元素被访问完结束,迭代器只能往前不会后退
  • 什么是可迭代对象?
    一个可以被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__方法的对象也是生成器
    • 生成器也是一种特殊的迭代器
  • 创建生成器的两种方法
    第一种: 把列表推导式的[]改为()
    [x for x in range(10)] ----> (x for x in range(10))
    
    第二种: 函数中含有yield
    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
    
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值