【Python三大利器】迭代器,生成器,装饰器

1.迭代器

【for循环实现】可迭代对象,迭代器_for 循环对象-CSDN博客

2.生成器

  • 产生背景
    • 不依赖于range()和其他数据类型,可以自定义出来一个迭代器
  • 什么是生成器?
    • 通过yield实现,每次迭代即使用next()生成一个值。值不存在则报错
  • 作用
    • 惰性计算
    • 延迟执行
    • 按需输出,节省内存
      • import sys
        import time
        start = time.time()
        gen = (i for i in range(1,10000) if i % 2==0)
        print(f"生成器花费时间{time.time()-start:.2f}s,内存占用是{sys.getsizeof(gen)}bytes")
        
        
        最终结果是:
        
            生成器花费时间0.00s,内存占用是112bytes
  • 生成器表达式
    • 方法一:gen = (i for i in 可迭代对象 [判断条件])
      • 遵循按需输出,遍历才执行
    • gen = (i for i in range(5))
      
      print(gen)  # <generator object <genexpr> at 0x10b0830b0>
      
      for y in gen:
      
          print(y, end=' ')  # 0 1 2 3 4 
      
      应用1: 计算数字的平方
      
      gen = (i**2 for i in range(5))
      
      for j in gen:
      
          print(j,end=" ") # 0 1 4 9 16 
      
      应用2: 偶数筛选
      
      gen = (i for i in range(20) if i%2 == 0)
      
      for j in gen:
      
          print(j,end=" ") # 0 2 4 6 8 10 12 14 16 18 
      
      应用3:修改迭代器的值
      
      arr = ["name","age","favorite"]
      gen = (name for name in arr if len(arr)>=3)
      arr = ["age","favorite"]
      print(list(gen))  # []
    • 方法二:函数内部使用yield关键字,调用该函数生成一个生成器.
      • ⚠️yield与return的区别:
        • yield和return 都表示返回的意思;
        • yield后面可跟代码且返回,return后面的代码不执行
          • 场景1:
            def func(n):
            
                for o in range(1,n+1)
            
                    yield o
            
            步骤1:创建生成器
            n = func(5) 
            
            步骤2: 使用next开始执行一次迭代,遇到yield停止
            print(next(n)) # 1
            
            步骤3: 再次使用next继续从yield开始执行
            
            print(next(n)) # 2
            
            
            场景2:使用for 遍历生成器
            
            def fuc():
                lst = [1, 2, 3]
                for item in lst:
                    yield item
                yield 'a'
            
            
            gen = fuc()
            for i in gen():
                print(I,end=' ')  # 1 2 3 a
            
        • yield  from  生成器
          • 可以连接调用者和子生
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值