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

    迭代器
    迭代的工具。

        迭代:
            迭代指的是重复迭代,每一次迭代都是基于上一次的结果而来的。
    
        迭代器:
            迭代器指的是迭代取值的工具,它可以迭代取值。
            迭代器就是迭代器对象
    
        - 如果想要知道python中迭代器是什么?必须先知道什么是可迭代对象?
    
        - 可迭代对象:  所有的序列类型: str, list, tuple, dict, set, f
            凡是内部有str.__iter__()方法的都是可迭代对象。
           以下都是可迭代对象
    

    '''
    str1 = 'hello tank!'
    str1.iter()
    list1 = [1, 2, 3] # list([1, 2, 3])
    list1.iter()
    set.iter()
    dict.iter()
    tuple.iter()
    open('a.txt').iter()
    '''

    str1 = '靓仔靓女'

    iter_str1 = str1.iter()

    print(iter_str1) # iterator指的是迭代器对象 # iter_str1 ---> python13期都是靓仔,靓女!

    print(iter_str1.next())

    print(iter_str1.next())

    print(iter_str1.next())

    print(iter_str1.next())

    因为迭代器中的值已经取完了

    print(iter_str1.next()) # 报错,StopIteration

    dict1 = {'age': 17, 'name': 'tank'}

    iter_dict1 = dict1.iter()

    print(iter_dict1.next())

    print(iter_dict1.next())

    print(iter_dict1.next())

    获取迭代器对象: iter_list1

    iter_list1 = list1.iter()

    while True:

    # 补充: try: 捕获异常

    try:

    print(iter_list1.next()) # 报错

    # 立即触发此处代码 StopIteration

    except StopIteration:

    break

       - 获取迭代器:
            通过可迭代对象.__iter__(), 得到的返回值就是 “迭代器对象”。
            迭代器是迭代取值的工具,作用是迭代取值。
    
            - 如何迭代取值:
                迭代器对象.__next__()  # “每一次执行”,都会从迭代器对象中取出一个值
    
    
        - 总结: 可迭代对象 VS 迭代器对象:
            - 获取可迭代对象: 定义序列类型(str, list, set, tuple, dict, f)
                - 特点:
                    内置有__iter__()
    
            - 获取迭代器对象: 通过可迭代对象调用.__iter__()得到返回值
                - 特点:
                    内置有__next__()
    
        - 迭代器对象的优点:
            - 优点:
                1.不依赖于索引迭代取值。
                2.节省内存空间。
    
            - 缺点:
                1.取指定某个值麻烦
                2.不能通过len计算长度
    
    
        for循环原理
            语法:     for i in 可迭代对象:
            in: 可迭代对象 ----> 内部会自动调用.__iter__() ---> 迭代器对象
            for line in list1:
                # 会自动帮你调用.__next__()
                #for 循环内部也有一个捕获异常机制,一旦遇到异常,也会停止取值。
    
    
        - 迭代器本质上是一个可迭代对象
    
        - 文件本质上既是迭代器对象,也是可迭代对象。
    
        - 可迭代对象不一定是迭代器对象
        
        
        
      # 依赖于索引取值
    

    list1 = [1, 2, 3, 4] # 1, 2, 3, 4

    n = 0

    while n < len(list1):

    print(list1[n])

    n += 1

    不依赖索引的取值方式

    tuple1 = ('tank', 'jason鸡哥', 'sean', '饼哥')

    # 获取迭代器对象: iter_list1

    iter_tuple1 = tuple1.iter()

    while True:

    # 补充: try: 捕获异常

    try:

    print(iter_tuple1.next()) # 报错

    # 立即触发此处代码 StopIteration

    except StopIteration:

    break

    list1 = [1, 2, 3, 4]

    for line in list1: # list1是可迭代对象 ----> 内部会自动调用.iter() ---> 迭代器对象

    # 迭代器对象.next()

    print(line)

    测试迭代文件

    f = open('user.txt', 'r', encoding='utf-8')

    iter_f = f.iter()

    while True:

    try:

    print(iter_f.next())

    except StopIteration:

    break

    str1 = 'hello tank'

    先获取迭代器对象

    iter_str1 = str1.iter()

    while True:

    try:

    print(iter_str1.next())

    except StopIteration:

    break

    set1 = {1, 2, 3, 4}

    set1 = (1, 2, 3, 4)

    set1 = [1, 2, 3, 4]

    set1 = '1, 2, 3, 4'

    iter_set1: 迭代器对象

    iter_set1 = set1.iter()
    iter_set1.next()

    确定: 迭代器对象也是一个可迭代对象

    判断可迭代对象是否是迭代器对象

    print(iter_set1.iter() is iter_set1) # True

    唯独文件比较特殊: 因为文件从读取出来的时候就是一个迭代器对象

    f ---> 可迭代对象, 还是迭代器对象

    f = open('user.txt', 'r', encoding='utf-8')

    # 确定: 文件既是可迭代对象,也是迭代器对象。

    # iter_f ---> 迭代器对象

    iter_f = f.iter()

    print(iter_f is f) # True

    可迭代对象

    list1 = [1, 2, 3, 4]

    iter_list1 ---> 迭代器对象

    iter_list1 = list1.iter()
    print(iter_list1 is list1) # False

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

  • 相关阅读:
    ISO14229:2013 之 通过标志输入输出控制InputOutputControlByIdentifier (0x2F)
    ISO14229:2013 之 清除诊断信息ClearDiagnosticInformation (0x14)
    ISO14229:2013 之 通过标志写数据WriteDataByIdentifier (0x2E)
    Git常用命令及方法大全
    High concurrency Architecture Detailed _ Architecture
    Data structures and algorithms in Java, Part 1: Overview
    Java代码优化
    详解二分查找算法
    服务容灾
    分布式限流之一:redis+lua 实现分布式令牌桶,高并发限流
  • 原文地址:https://www.cnblogs.com/bs2019/p/11858738.html
Copyright © 2011-2022 走看看