2020-04-09

类型和对象

1 迭代器

自己不会写迭代器,只用

任务:请展示列表中所有的数据

  • while + 索引 + 计数器

  • 迭代器,帮助你对某类对象(str/dirt/list/set/tuple)--可迭代对象中的与元素逐一获取。

    • 列表转换成迭代器:v1 = iter([11,22,33,44])

    • 迭代器想要获取每个值,反复调用 val = v1._ _ next _ _()

    • 直到报错:Stopiteration错误,表示已经迭代完毕

      v1 = [11, 22, 33, 44]
      # 列表转换成迭代器,元组,集合(无序),字典(只有键被循环出来),字符串等容器都可以
      v2 = iter(v1)
      v2=v1.__iter__()
      while True:
          try:
            val = v2.__next__()
              print(val)
          except Exception  as e:
              break
      
    • 如何判别一个对象是否是迭代器:内部是否有_ _ next _ _方法

    • for循环

      v1 = [11,22,33,44]
      #1.内部会将v1转换成迭代器
      #2.内部反复执行 迭代器.__next__()
      #3.取完不报错
      for item in v1:
          print(item)
      

2可迭代对象

  • 内部具有_ _ iter _ _()方法且返回一个迭代器。
  • 可以被for循环

3 生成器(函数的变异)

def func():
    return 123
func()
#生成器函数(内部是否包含yield)
def func():
    print('F1')
    yield 1
    print('F2')
    yield 2
    print('F3')
    yield 100
    print('F4')
v1 = func()
for item in v1:
    print(item)
 #打印结果:
F1
1
F2
2
F3
100
F4
#函数内部代码不会执行,返回一个生成器对象
v1 = func()
#生成器可以被for循环,一旦开始循环那么函数内部代码就会开始执行
for item in v1:
    print(item)
def func():
   count = 1
   while True:
       yield count
       count += 1
       if count == 100:
            return
v1 = func()
for item in v1:
    print(item)

总结

函数中如果存在yield,那么该函数就是一个生成器函数,调用生成器函数会返回一个生成器,生成器只有被for循环时,生成器函数内部代码才会执行。每次循环都会获取yield的返回值。

示例【面试会遇到】:

def func():
    """
    分批去读取文件中的内容,将文件的内容返回给函数
    :return:
    """
    cursor = 0
    while True:
        f = open('db', 'x', encoding-'utf-8') #通过网络连接上redis
        #代指 redis[0:10]
        f.seek(cursor)
        data_list = []
        for i in range(10):
            line = f.readline()
            if not line:
                return
            data_list.append(line)
        cursor = f.tell()
        f.close() #关闭与redis的连接
for item in func():
    print(item)

生成器还是一个特殊的迭代器

def func():
    yield 1
    yield 2
    yield 3
v = func()
result = v.__next__()
print(result)
result = v.__next__()
print(result)
result = v.__next__()
print(result)
result = v.__next__()
print(result)

生成器也是一个特殊的可迭代对象

def func():
    yield 1

v = func()
result = v.__iter__()
print(result)

其他知识

  • yield from关键字
  • 生成器推到式
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容