美文网首页
day11-04 Python的迭代器生成器

day11-04 Python的迭代器生成器

作者: 代码小小白 | 来源:发表于2020-08-13 15:20 被阅读0次
可迭代对象
  • 字面意思:一个可以进行循环更新的一个试试在在的值
  • 专业角度:内部含有"_iter_"方法的对象称为可迭代对象
  • 判断一个对象是不是可迭代对象
    1.通过dir(obj)函数获取该对象所有的方法,结果是list。通过判断"_iter_"是否在列表中即可。
    例:
name="python"
print("__iter__" in dir(name))

输出结果:

True
  • 可迭代对象的优缺点:
    优点:
  1. 存储数据能直接展示,比较直观
  2. 拥有的方法比较多,方便操作
    缺点:
  3. 占用内存
  4. 不能直接取值,虽然能通过for循环取值,实际上是内部转化成了迭代器
迭代器
  • 迭代器的含义
    • 字面意思:可更新迭代的工具
    • 专业角度:内部含有"_iter"方法,并且含有"_next"方法的对象就是迭代器
    • 判断是否迭代器:"_iter_" and "_next_"方法在对象中
  • 可迭代对象转化成迭代器
    • iter(obj) 或者 obj.iter()
    • 使用next()或者next()进行迭代
      例:
l1 = [11,22,33,44]
obj = iter(l1)
# obj = l1.__iter__()
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
print(next(obj)) # print(obj.__next__())
  • 输出结果
11
22
33
44
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration

当迭代器超过他本身对象个数时,会抛出StopIteration的错误
迭代器也可以直接for循环,(其实可迭代对象不能for循环,只是内部做了特殊处理
例:

l1 = [11,22,33,44]
obj = iter(l1)
for i in obj:
  print(i)
  • 输出结果
11
22
33
44
  • 优点:
  1. 节省内存
  2. 惰性机制,next一次取一个值,不会多取
  • 缺点
  1. 速度慢,以时间换空间
  2. 只能顺序取值,不走回头路
生成器
  • 生成器:
    • 生成器:
      • 获取生成器的三种方式
        • 生成器函数
          def func():
              print(111)
              yield 1
              yield 2
          ret = func() # 生成一个生成器对象
          print(ret)   # <generator object func at 0x10cfee450> 
          #一个yield对应一个next
          print(next(ret)) # 111  1
          print(next(ret))# 2
          
          备注:return 和 yield的区别
          return: 一个函数只有一个return,return会终结函数的执行,并且返回return后面的值
          yield:只要函数中还有yield,他就不是函数,而是一个生成器,一个函数可以有多个yield,他不会结束函数的执行,一个yield对应一个next
          yield from:会将yield from 后面的值变成一个迭代器返回
          例:
          def func():
              lst1 = ['卫龙', '老冰棍', '北冰洋', '牛羊配']
              lst2 = ['馒头', '花卷', '豆包', '大饼']
              yield from lst1
              yield from lst2
          
          s= func() 
          print(s) # <generator object func at 0x104e242d0>
          print(next(s)) # 卫龙 |如果不加from,则会返回lst1这个列表
          print(next(s)) # 老冰棍 |如果不加from,则会返回lst2这个列表
          
        • 生成器表达式
          • 列表推导式 :用一行代码构建一个比较复杂有规律的列表。
            • 两类列表推导式
            1. 循环模式:[变量(可加工) for 变量 in iterable]
              例子:将10以内所有整数的平方写入列表。
              [i**2 for i in range(1,11)]
              
            2. 条件模式:[变量(可加工) for 变量 in iterable if 条件]
              例子:30以内能被3整除的数
              [i for i in range(1,31) if i%3 == 0]
              
            • 生成器表达式:与列表推导式几乎一模一样,只是把 [ ] 改成了()
              • 生成器表达式和列表推导式的区别:生成器表达式生成的是生成器对象,而列表推导式生成的是可迭代对象
            • 字典推导式
             lst1 = ['jay', 'jj', 'meet']
             lst2 = ['周杰伦','林俊杰','元宝']
             dict = {lst2[i]:lst1[i] for i in range(len(lst1))}
            
            • 集合推导式
             {i for i in range(1,11)}
            
        • Python内部提供的一些: 文件句柄

相关文章

网友评论

      本文标题:day11-04 Python的迭代器生成器

      本文链接:https://www.haomeiwen.com/subject/iwnpdktx.html