zoukankan      html  css  js  c++  java
  • python三大器之 迭代器与生成器

    1.迭代器 

    迭代器的两种生成方式:

    方式一:可迭代对象调用iter_obj = obj.__iter__()

    方式二:  使用生成器    yield    产生迭代器 

    '''
    1.迭代器
    2.生成器
    3.三元表达式
    4.列表生成式
    5.递归与二分法
    6.匿名函数
    7.内置函数
    '''
    # 迭代器:迭代的工具
    
    # 1.什么是迭代:指的是一个重复的过程,每一次重复称为一次迭代,
    #               并且每一次重复的结果是下一次重复的初始值
    
    l = ['a','b','c']
    count = 0
    while  count < len(l):
        print(l[count])
        count+=1
    
    # 2.为什么要有迭代器?
    # 对于序列类型:str,list,tuple,可以依赖索引来迭代取值
    # 但是对于dict,set,文件,python必须给我们提供一种不依赖于索引的迭代取值方式
    
    
    #3. 可迭代对象(下列都是):obj.__iter__   :凡是有__iter__方法的都是可迭代对象
    name = 'egon'
    l = [1,2,3]
    t = (1,2,3)
    d = {'name':'egon','age':18,'sex':'male'}
    s = {'a','b','c'}
    f = open('a.text','w',encoding='utf-8')
    name.__iter__
    l.__iter__
    t.__iter__
    d.__iter__
    s.__iter__
    f.__iter__
    
    
    
    
    #4. 迭代器对象(文件是):obj.__next__,obj.__iter__
    f.__iter__
    f.__next__
    # 总结:
    # 1.可迭代对象不一定是迭代器对象   比如列表必须调用iter方法,才能生成迭代器    
    # 2.迭代器对象一定是可迭代对象    文件是迭代器  既有iter方法,也有next方法
    # 3. 调用__iter__()方法,得到是迭代器对象(迭代器对象调用iter方法得到的是其本身)
    
    
    # d = {'name':'egon','age':18,'sex':'male'}
    # d_iter = d.__iter__()
    
    # f = open('a.text','w',encoding='utf-8')
    # f_iter = f.__iter__().__iter__().__iter__()
    # print(f_iter is f)
    
    # d = {'name':'egon','age':18,'sex':'male'}
    # d_iter = d.__iter__()
    # print(d_iter.__next__())
    # print(d_iter.__next__())
    # print(d_iter.__next__())
    # print(d_iter.__next__())   #迭代器d_iter没有值了,就会抛出异常StopIteration
    
    # f = open('a.text','r',encoding='utf-8')
    # print(f.__next__())   #一行一行取
    # print(f.__next__())
    # print(f.__next__())
    # print(f.__next__())
    
    # l = ['a','b','c']
    # l_iter = l.__iter__()
    # print(l_iter.__next__())
    # print(l_iter.__next__())
    # print(l_iter.__next__())
    # print(l_iter.__next__())
    
    # d = {'name':'egon','age':10,'sex':'male'}
    # d_iter = iter(d)   # d_iter = d.__iter()__
    # # len(obj) 等同于 obj.__len()__
    #
    #
    # while True:
    #     try:
    #         print(next(d_iter))
    #     except StopIteration:
    #         break
    
    #for 循环迭代原理
    # 1.调用in 后的obj.__iter__()
    # 2.k = obj_iter.__next__()
    # 3. 捕捉StopIteration异常,结束迭代
    
    d = {'name':'egon','age':10,'sex':'male'}
    for k in d:
        print(k)
    
    # 总结:迭代器的优缺点
    # 优点:
    # 1.提供一种统一的不依赖于索引的取值方式,为for循环的实现提供了依据
    # 2.迭代器同一时间在内存中只有一个值,更节省内存空间
    # 
    # 缺点:
    # 1. 只能往后取,并且是一次性的,不能依赖索引取到某个值
    # 2. 无法统计长度,没有len方法

    2.生成器

    生成器表达式: g = ('egg%s'i  for i in range(5))

    # 1.什么是生成器:只要函数体内出现yield关键字,那么再执行函数就不会执行函数体代码,会得到一个结果,该结果就是生成器
    
    def func():
        print('===1')
        yield
        print('====2')
        yield
        print('====3')
    
    #生成器就是迭代器
    g = func()
    
    res1 = next(g)
    print(res1)
    
    res2 = next(g)
    print(res2)
    
    res3 = next(g)
    print(res3)
    
    #yield功能
    #1.yield 为我们一种自定义迭代器的方法
    #2.yield与return的区别:1.yield可以返回多次值  2.函数暂停与再继续的状态是由yield帮我们保存的
    
    def my_range(start,stop,step=1):
        while start< stop:
            yield start
            start+=step
    
    g = my_range(1,5,2)
    print(next(g))
    print(next(g))
    
    for i in my_range(1,5,2):
        print(i)
        
  • 相关阅读:
    .net Core
    4.1 愚人节
    迷茫了....
    关于Plupload结合上传插件jquery.plupload.queue的使用
    兼容浏览器 回车键 keydown事件
    JS判断是否是IE浏览器的几种方式
    IE IE8 iframe的onload方法分析 IE浏览器onload事件失效
    java 获取请求的完整url地址
    SQLSERVER 数据库基础操作
    java 四舍五入 保留两位小数
  • 原文地址:https://www.cnblogs.com/bigbox/p/11867003.html
Copyright © 2011-2022 走看看