zoukankan      html  css  js  c++  java
  • 13,迭代器 和 生成器

    迭代器

    什么是可迭代对象?

    内部含有__iter__方法就是可迭代对象。

    什么事迭代器?

    内部含有__iter__和__next__方法的就是迭代器。

    实际上可迭代对象是不可以一个一个的一次取值的,因为他没有__next__方法。

    迭代器取值有两种方法。

    第一种 (print(la.__next__()))

    l = [1, 2, 3]
    la = l.__iter__()
    print(la.__next__()) #取值,执行一次取一个值。
    print(la.__next__()) #取值,执行一次取一个值。
    print(la.__next__()) #取值,执行一次取一个值。

    第二种方法 for循环

    l = [1, 2, 3]
    la = l.__iter__()
    print([a for a in la])
    print('__next' in dir(la))

    如何判断是不是迭代器或可迭代对象(有两种方式)

    第一种

    __iter__ in dir(数据类型)

    #str类型
    print('__iter__'in dir('laonanhai')) # True
    
    #列表类型
    print('__iter__' in dir([1,2,3,4])) #True
    
    #字典类型
    print("__iter__" in dir({'alex': 1})) #True
    
    #int类型
    print("__iter__" in dir(1)) #False
    
    #bool类型
    print("__iter__" in dir(bool)) #False
    
    #set类型
    print("__iter__" in dir({4}))
    
    #文件句柄,既是可迭代对象,也是迭代器。
    with open('log',encoding='utf-8') as f1:
    print("__iter__" in dir(f1))  #True
    print("__next__" in dir(f1))  #True
    print(isinstance(range,Iterator))#False
    print(isinstance(range,Iterable))#False
    print('__iter__' in dir(range))#True
    print('__next__' in dir(range))#False
     

    第二种方法(需要调用一个模块模块名字叫from collections import Iterable)

    from collections import Iterable
    l1 = 'str类型'
    print(isinstance(l1,Iterable)) #True
    l2 = [123,456]
    print(isinstance(l2,Iterable))#True
    l3 = {3:1}
    print(isinstance(l3,Iterable))#True
    l4 = {'a'}
    print(isinstance(l4,Iterable))#True
    l5 = bool
    print(isinstance(l5, Iterable))#False
    l6 = 3
    print(isinstance(l6, Iterable))#False
    with open('log',encoding='utf-8') as f1:
        print(isinstance(f1, Iterable))#True

     for 循环有一个机制:

    1,将可迭代对象转化成迭代器。

    2,利用__next__进行取值。

    3,用try一场处理方法防止报错。(万能的rty都能解决)

    例如:

    l = [1, 2, 3, 4, 5]
    l_obj = l.__iter__()
    while True:
        try:
            print(l_obj.__next__())
        except Exception:
            break

    迭代器总结:

    什么是迭代器:

    1 节省内存

    2,满足惰性机制

    3,取值过程不可逆

    可以使用__next__()来取值

    可以for循环取值

    生成器:

    生成器的本质也是迭代器,生成器是自己用python写的迭代器。

    1,通过生成器函数构造。

    2,通过生成器推导式构建。

    通过函数构建如下:

    def func1():
        print(111)
        print(222)
        print(444)
        yield 555
        print(666)
        yield 555
    
    a = func1()
    print(a.__next__())
    print(a.__next__())
    每执行一次print(a.__next__()),就会执行第一个yield以前的值。
    凡是带yield的都是迭代器。
    def cloth2():
        for i in range(1,10001):
            yield '衣服',i
    a = cloth2()
    for i in range(1,51):
        print(a.__next__())
    for i in range(1,151):
        print(a.__next__())#每次自增150
        print(a.__next__())#每次自增150
        print(a.__next__())#每次自增150
        print(a.__next__())#每次自增150
        print(a.__next__())#每次自增150
    def func1():
        count = yield 222
        print(count)
        yield 777
        yield 888
        return 888
    g_obj = func1()
    print(g_obj.__next__())
    print(g_obj.send('wusir'))
    print(g_obj.send('wusir'))

    send

    def func1():
        count = yield 222
        print(count)
        yield 777
        yield 888
        print(2222)
        yield 444
    g_obj = func1()
    print(g_obj.__next__())
    print(g_obj.send('wusir'))
    print(g_obj.send('111'))
    print(g_obj.send('wusir'))
    1,send 具有next功能。
    2,send 可以给上一个yield传值。
    3, 第一个取值不能使用send.
    4,最后一个yield不会得到send的值。、
  • 相关阅读:
    生活的真谛
    WSDL文件简介(附例子)
    关于智慧
    叔叔的去世
    google labs
    项目需求工具
    agent/angel/angle
    关于地图投影的C程序的一些说明
    Ubuntu下开启Apache重写扩展
    PHP内置函数之ctype_alnum() 函数检查字符串是否由字符和数字组成
  • 原文地址:https://www.cnblogs.com/ZJGG/p/9046007.html
Copyright © 2011-2022 走看看