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

    1、可迭代的变量

    dist、dic、str、set、tuple、f = open()、range()、enumerate(枚举)

    2、怎么样获取到变量所含有的方法:

    1 print(dir([])) 
    1 ['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    求普通类别的方法

    1 print(dir([]))  
    '__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']

    求列表被__iter__处理后的方法

    1 print(dir([].__iter__()))

    结果:

    1 ['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']

    求以上两种方法的差集

    1 print(set(dir([].__iter__())) - set(dir([]))) 

    结果:

    1 {'__next__', '__length_hint__', '__setstate__'}

    __length_hint__是求元素的个数

    1 print([1,2,'a','avc'].__iter__().__length_hint__()) 

    结果:4

    3、双下方法

    1 l = [4,5,6]
    2 l2 = l.__iter__()
    3 print(l2.__next__())
    4 print(l2.__next__())
    5 print(l2.__next__())
    1 4
    2 5
    3 6
    参考结果

    4、总结:

       Iterable 可迭代的   --> __iter__  只要含有__iter__方法的都是可迭代的
       [].__iter__()  迭代器   -->  __next__ 通过next就可以从迭代器中一个一个的取值
       只要含有__iter__方法的都是可迭代的----可迭代协议

    迭代器协议:内部含有__next__和__iter__方法的就是迭代器
                 证明过程如下:
            
    1 print('__next__' in dir([].__iter__()))
    2 print('__iter__' in dir([].__iter__()))
    3 
    4 结果:
    5 True
    6 True

    5、自己创建一个迭代器例子

     1 from collections import Iterable
     2 from collections import Iterator
     3 class B:                       #这里少了任意一个方法都不行
     4     def __iter__(self):pass
     5     def __next__(self):pass
     6 
     7 a = B()
     8 print(isinstance(a,Iterator))
     9 print(isinstance(a,Iterable))
    10  
    11 结果:
    12 True
    13 True

    6、迭代器协议与可迭代协

          可以被for循环的都是可迭代可迭代的内部都有__iter__方法只要是迭代器 ,一定可以迭代

       可迭代的.__iter__()方法就可以得到一个迭代器

    迭代器中的__next__()方法可以一个一个的取值
    for循环:其实为了能用for循环,那么把变量设为可迭代对象,for循环的本质就是迭代器,

          在不确定是否能用for循环时候,那么判定它是否可迭代即可。
    迭代器的好处:从容器中取值,可以一个一个取所有的值
    可节省内存空间,迭代器并不会在内存中占用一大块内存,可以用next找出下一个。
    1 def func():
    2     for i in range(200000):
    3         i = "wanshanghao%s"%i
    4     return i
    5 print(func())
    6 结果:
    7 wanshanghao199999



  • 相关阅读:
    翻转单词顺序序列
    左旋转字符串
    查找第一个只出现一次的字符
    C语言函数与程序结构
    C语言实现快速排序法(分治法)
    C语言binsearch,shellsort,insertsort
    c语言的类型、运算符与表达式
    进程和线程
    CMS和G1
    Python IO编程
  • 原文地址:https://www.cnblogs.com/xiaofei1106/p/10700445.html
Copyright © 2011-2022 走看看