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

    #!/usr/bin/python
    #-*-coding:utf-8 -*-

    '''
    迭代器
    迭代: 重复的过程称为迭代 但是还有重要的一点====>>每次迭代的结果是下一次迭代的初始值
    为什么要用迭代器:
    有序:有明确的索引或者下标
    无序:比如文件,字典没有顺序
    对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式
    可迭代的对象:
    只要此数据类型下边有__iter__的就是可迭代对象
    # [1,2,4,].__iter__()
    # (1,2,3,).__iter__()
    # {1,3,3}.__iter__()
    # {'name':'alex','age':23}.__iter__()
    # 'hello'.__iter__()
    # f = open('aa.txt','w')
    # f.__iter__()
    迭代器:
    执行__iter__得到的对象就是迭代器
    # v = [1,2,4,].__iter__()
    # print(v)
    # #打印结果
    # #<list_iterator object at 0x0000013B36E6D160> iterator 迭代器
    v = [1,2,4,].__iter__()
    #以下两种形式等同
    print(v.__next__())
    print(next(v))
    #打印结果 每次print 依次取出值 当取值超过所有的值后 提示StopIteration 也就是取值完毕的意思
    #1
    #2
    ##举例字典的迭代
    # dic = {'name':'alex','age':23}.__iter__()
    # print(next(dic))
    # print(next(dic))
    # #打印结果 取出的是key 打印结果是无序的 顺序是随机的
    # # name
    # # age
    #然后用while迭代 实现依次取出地点的value
    # dic = {'name':'alex','age':23}
    # i = dic.__iter__()
    # while True:
    # key=next(i)
    # print(dic[key])
    #以上的代码,会抛出异常StopIteration
    #解决的方法 try except
    # dic = {'name':'alex','age':23}
    # i = dic.__iter__()
    # while True:
    # try:#try里放可能会抛出异常的代码
    # key=next(i)
    # print(dic[key])
    # ##except 指出可能会抛出什么异常
    # except StopIteration:
    # break
    ###补充####
    # dic = {'name':'alex','age':23}
    # test1=dic.__iter__() ####
    # print(test1)
    # test2=iter(dic)###效果一致 发现规律了吧
    # print(test2)

    ##如何判断一个对象是可迭代的对象,还是迭代器
    ##迭代器一定是可迭代的对象,可迭代的对象不一定是迭代器
    from collections import Iterable,Iterator
    #判断字符串'hello'是不是可迭代对象
    # print(isinstance('hello',Iterable)) #True
    # #判断字符串'hello'是不是迭代器
    # print(isinstance('hello',Iterator)) #False

    #可迭代对象
    # 内置iter方法的
    #迭代器
    # 执行iter后的结果,结果 有next方法

    # f = open('aa.txt','w')
    # f.__iter__()
    #以下都是可迭代的对象
    # print(isinstance('hello',Iterable)) #字符串
    # print(isinstance([],Iterable)) #列表
    # print(isinstance({'name':'alex'},Iterable)) #字典
    # print(isinstance((),Iterable))#元组
    # print(isinstance({1,2,},Iterable))#集合
    # print(isinstance(f,Iterable))#文件

    #文件是迭代器
    # print(isinstance('hello',Iterator)) #字符串
    # print(isinstance([],Iterator)) #列表
    # print(isinstance({'name':'alex'},Iterator)) #字典
    # print(isinstance((),Iterator))#元组
    # print(isinstance({1,2,},Iterator))#集合
    # f.__next__()##仅仅f直接有next 这些里只有文件是迭代器
    #迭代协议
    # 对象有__next__ # 对象有__iter__ 对于迭代器来说,__iter__的结果还是它本身#可迭代对象只有 __iter__#for循环拿出了key,是怎么个原理呢,下面为你揭晓 # dic = {'name':'alex','age':23} # for k in dic: #iter(dic)==>> k=next(i) 迭代循环 # print(k) #for循环遵循的是迭代器协议 #for会把in后的这个对象 iter了 变成迭代器,每次循环一次就是一次next #并且for把try和except功能也做了 捕捉异常 ##下面针对文件再说说 # with open('aa.txt','r',encoding='utf-8') as f: # for line in f: # print(line.strip()) # print(next(f))迭代器的优劣 优点: 1.提供了一种不依赖下标的迭代方式 2.就迭代器本身来说,更节省内存 缺点: 1.是一次性的,只能依次往下走,不能退回,不如序列对象取值灵活 2.无法获取迭代器对象的长度#enumerate 本身就是个迭代器 # i=[a,b,c] # v=enumerate(i) # v.__iter__() # v.__next__()'''
  • 相关阅读:
    mongodb 创建auto increment 自增函数
    QT通过IP地址定位地址(用get方法取数据)
    VC程序快速删除自己(可能做升级程序的时候有用)
    让程序出现在控制面板(写注册表)
    亲测VS2010纯静态编译QT4.8.0,实现VS2010编译调试Qt程序,QtCreator静态发布程序(图文并茂,非常详细) good
    Qt configure 参数不完全说明
    C语言和C++篇
    C#开源实现MJPEG流传输
    前端EASYUI的简化调用
    .NET Mvc Razor
  • 原文地址:https://www.cnblogs.com/lazyball/p/6916645.html
Copyright © 2011-2022 走看看