zoukankan      html  css  js  c++  java
  • 053 迭代器

    迭代器解决了不依赖索引取值的问题

    一、可迭代对象

    特征: __iter__()方法的对象就是可迭代对象

    x = 1                   # 不可迭代对象
    s = 'nick'              # 可迭代对象
    lt = [1, 2, 3]          # 可迭代对象
    dic = {'a': 1, 'b': 2}  # 可迭代对象
    tup = (1,)              # 可迭代对象,元组只有一个元素必须得加逗号
    se = {1, 2, 3}          # 可迭代对象
    f = open('time.py')     # 可迭代对象
    def func():             # 不可迭代对象
        pass
    

    总结:除了数字类型和函数之外Python内置str、list、tuple、dict、set、file都是可迭代对象

    二、迭代器对象

    只有字符串和列表都是依赖索引取值的,而其他的可迭代对象都是无法依赖索引取值的。因此我们得找到一个方法能让其他的可迭代对象不依赖索引取值。

    特征: 具有__iter__()以及__next__()方法的叫做迭代器对象

    s = 'nick'              # 可迭代对象,不属于迭代器对象
    lt = [1, 2, 3]          # 可迭代对象,不属于迭代器对象
    dic = {'a': 1, 'b': 2}  # 可迭代对象,不属于迭代器对象
    tup = (1,)              # 可迭代对象,不属于迭代器对象
    se = {1, 2, 3}          # 可迭代对象,不属于迭代器对象
    f = open('time.py')     # 可迭代对象,迭代器对象
    def func():             # 不可迭代对象,不属于迭代器对象
        pass
    

    总结:只有文件是迭代器对象

    三、for循环原理

    for循环 == 迭代循环

    lt = [1,2,3]
    lt_iter = lt.__iter__()
    # li_iter = iter(lt)        # iter(lt) 和 lt.__iter__() 功能相同,都可以使用
    while 1:
        try:
            print(lt_iter.__next__())
            # print(next(lt_iter))  # next(lt_iter) 和 lt_iter.__next__() 功能相同,都可以使用
        except StopIteration:
            break
    

    总结:

    1. (可迭代对象/迭代器对象)可以用__iter__()方法转换成迭代器对象
    2. 使用__next__()取出迭代器里的所有值
    3. 使用__next__()方法取尽迭代器中的所有值,一定会报错,通过异常捕捉退出while循环

    可迭代对象: 具有__iter__()方法的对象就是可迭代对象,除了数字类型和函数都是可迭代对象
    迭代器对象: 具有__iter__()__next__()方法的都是迭代器对象,只有文件是迭代器对象

    迭代器对象一定是可迭代对象; 可迭代对象不一定是迭代器对象

  • 相关阅读:
    IOS开发中针对UIImageView的几种常用手势
    VIew中的触摸事件 touchBegin 等一系列方法
    控制器的跳转-modal与push
    终于决定把自己的小窝从CSDN搬到博客园了
    UIView的frame和bounds区别
    android中数据存储的contentprovider的使用方法
    android中Json数据保存方式
    android手机操作SD的使用方法
    android手机中图片的拖拉及浏览功能
    android图片切换ImageSwichter的动画切换效果
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11341360.html
Copyright © 2011-2022 走看看