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

    什么是迭代

    1 迭代器

    通常我们认为的迭代是能够循环的,如字符串,列表,元组等,这些数据类型都是根据自身的索引值进行循环的。

    实际上,我们也是需要对字典、集合、文件等内容进行循环读取其内容的,这些数据类型本身是无序的,也就是没有索引值,索引我们要对这些内容进行读取的时候就用到了迭代器。

    1.1 可迭代对象

    可迭代的对象本身内置的__iter__()函数可以判断是否是可迭代对象

    例如:

    d={'a': 1, 'b': 2}
    >>> d.__iter__()
    <dict_keyiterator object at 0x0000000002220138>
    

    可迭代的对象都内置了.iter()方法,等同于iter(d). 函数的参数是可迭代的对象

    1.2 迭代器

    i=iter(d)
    i= d.iter() 可迭代对象的返回值赋值给一个值就是迭代器

    思路:

    要想明白可迭代器要先明白可迭代对象,可迭代对象的返回值赋值给另一值,这个值就是迭代器。

    可迭代器的执行通过d.next()就可以循环取出可迭代对象的内容。在这里只是一个例子,等同于next(d)

    1.2.1 white循环

    d={'a': 1, 'b': 2}
    
    i = l.__iter__()   # i = iter(l)
    while True:
        try:
            # print(next(i))
            print(i.__next__())  # next(i)
        except StopIteration:   # 异常处理  结束信号
            break
    

    1.2.2 for 循环###

    d = {'a': 1, 'b': 2}  
    for i in d:  # for z直接迭代其对象    
        print(i)
    

    for循环实现的本质

    d = {'a': 1, 'b': 2}  
    i = iter(d)
    for item in i:    #                              这里for循环直接迭代的是迭代器,说明迭代器也是可迭代对象
        # try:
        print(item)  # for不用处理异常信息
        # except StopIteration:
            # break
    

    下面的更明确:

    d = {'a': 1, 'b': 2}
    for item in iter(d):    #    这里是for循环封装了iter()方法
        # try:
        print(item)  # for不用处理异常信息
        # except StopIteration:
            # break
    
    • 需要注意的是迭代器是只能从前往后取,但是迭代器是不清楚长度的,只能取到不能取为止,最后返回异常就全部取完了

    • 迭代器构造了一种不依赖索引,但是能取值的统一的方法

    1.2.3 文件的迭代

    文件本身就是迭代器

    with open("a.txt") as f:   # f本身就是迭代器
        f.__next__
        f.__iter__
        print(f)
        print(f.__iter__())
        for line in f:
            print(line.strip())
    

    下面是打印的:
    print(f) print(f.iter()) 是一样的, f本身就是迭代器

    _io.TextIOWrapper name='a.txt' mode='r' encoding='cp936'
    _io.TextIOWrapper name='a.txt' mode='r' encoding='cp936'

    为什么用迭代器:
    优点:
    1.迭代器提供了一种不依赖索引取值的方式

            2. 迭代器与列表比较
                迭代器取的是一个地址,迭代器是惰性计算,节省内存
                列表会把所有的值读取到内存
        缺点:
            1.无法获取迭代器的长度,只有next到最后的地址报错后才知道
            2.迭代器是一次性的,只能往后取值,直到next走完
    

    1.2.4 查看可迭代对象与迭代器对象

    判断是可迭代对象

    from collections import Iterable,Iterator
    
    s = "123"
    l = [1,2,3]
    t = (1,2,3)
    d = {"a":1}
    set1 = {1,2,3}
    f = open("a.txt")
    
    s.__iter__()
    l.__iter__()
    t.__iter__()
    d.__iter__()
    set1.__iter__()
    f.__iter__()
    
    print(isinstance(s,Iterable))
    print(isinstance(l,Iterable))
    print(isinstance(d,Iterable))
    print(isinstance(set1,Iterable))
    print(isinstance(f,Iterable))
    
    

    结果:
    True
    True
    True
    True
    True

    只要内置了__iter__()方法,就是可迭代对象

    判断迭代器对象

    print(isinstance(s,Iterator))
    print(isinstance(l,Iterator))
    print(isinstance(d,Iterator))
    print(isinstance(set1,Iterator))
    print(isinstance(f,Iterator))
    

    结果:
    False
    False
    False
    False
    True

    这里面只有文件是迭代器对象

  • 相关阅读:
    201805140815_《缓存操作函数封装》
    201802071223_《更换两个二进制》
    201801301359——《注意Javascript这种形式》
    201708310807_《算法-Javascript实现最大公约数》
    重拾java openjdk1.8 语法小试
    代码轮子之很简单但是挺管用的基于C# Task的模拟并发的代码
    docker1.12 安装pxc(Percona XtraDB Cluster )测试
    .net orm比较之dapper和Entity Framework6的简单测试比较
    StackExchange.Redis使用和封装小试
    docker1.12 安装redis3官方集群 攻略
  • 原文地址:https://www.cnblogs.com/Python666/p/6694693.html
Copyright © 2011-2022 走看看