精华内容
下载资源
问答
  • Python 迭代器

    2020-08-26 16:34:38
    #Python 迭代器# 系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的...

    #Python 迭代器# 系列文章目录
    提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
    例如:第一章 Python 机器学习入门之pandas的使用


    提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档


    前言

    您将学习迭代器的工作原理以及如何使用__iter__和__next__方法构建自己的迭代器。

    一、python中的迭代器的性质

    1 迭代是一个重复反馈的过程,每次对过程的重复称为一次迭代,而每次迭代的结果又会称为下一次的初始值。

    2 从技术上讲,Python 迭代器对象必须实现两个特殊方法,iter()next()统称为迭代器协议。

    3 如果我们可以从对象获得迭代器,则该对象称为可迭代。Python中大多数内置容器(例如:list,tuple,string等)都是可迭代的。
    但是要注意的是对于 set(集合)迭代器是访问元素的唯一方式。

    3 该iter()函数(依次调用该__iter__()方法)从它们返回一个迭代器。
    代码如下(示例):

        def __iter__(self):
            return self
    

    二、迭代函数

    1普通函数

    代码如下(示例):

    string = 'I love python'
    it = iter(string) # 使用一个iter()获取一个迭代器
    for i in string:
        print(next(it))  # 这里等同于print(i)
        pass
    

    结果如下:

    l
    o
    v
    e

    p
    y
    t
    h
    o
    n
    使用next()将返回下一个item 当我们到达末尾并且没有更多数据要返回时,它将引发StopIteration。
    代码如下(示例):

    it = iter(range(10))
    while True:
        try:
            print(next(it))
        except StopIteration:
            break
        pass
    

    2.魔术方法

    代码如下(示例):

    class Fibs:  # 构造一个类输出斐波那契数列
        def __init__(self):
            self.a = 0
            self.b = 1
            pass
    
        def __iter__(self):  
        # 这个魔术方法的写法是固定的(当然你也可以加入一些初始化)
            return self
    
        def __next__(self):
            c = self.b
            self.b = self.a + self.b
            self.a = c
            return self.a
        pass
      
    fibs = Fibs()
    for each in fibs:
        if each < 20:
            print(each)
            pass
        else:
            break
        pass
    

    结果:
    1
    1
    2
    3
    5
    8
    13
    __next()__魔术方法会被不断调用,上一次调用的结果将会成为下一次的初始值。直到抛出StopIteration的异常。

    总结

    我想到这里各位心中可能会想到另一个类似的概念 递归

    迭代 递归
    允许重复使用条件循环执行顺序的一组语句。 函数主体中的语句调用函数本身。
    存在带有需要初始化,递增或递减的控制变量的循环以及不断检查执行终止的条件控制语句。 递归函数必须包含至少一个基本情况,即终止执行的条件。

    这是迭代:
    在这里插入图片描述
    这是递归:
    递归

    这仅是对目前我遇到的迭代器进行简单的总结,欢迎批评指正。

    .

    展开全文
  • Python迭代器

    2019-08-08 09:58:00
    迭代器是可以迭代的对象。 在本教程中,您将了解迭代器的工作原理,以及如何使用__iter__和__next__方法构建自己的迭代器。 迭代器在Python中无处不在。...从技术上讲,Python迭代器对象必须实现两个特殊的方法__it...

    迭代器是可以迭代的对象。 在本教程中,您将了解迭代器的工作原理,以及如何使用__iter____next__方法构建自己的迭代器。

    迭代器在Python中无处不在。 它们优雅地实现在循环,推导,生成器等中,但隐藏在明显的视觉中。

    Python中的迭代器只是一个可以迭代的对象。一个将一次返回数据的对象或一个元素。

    从技术上讲,Python迭代器对象必须实现两个特殊的方法__iter__()__next__(),统称为迭代器协议。

    如果我们从中获取一个迭代器,那么一个对象被称为iterable。 大多数Python中的内置容器是列表,元组,字符串等都是可迭代的。

    iter()函数(这又调用__iter__()方法)返回一个迭代器。

    通过Python中的迭代器迭代

    使用next()函数来手动遍历迭代器的所有项目。当到达结束,没有更多的数据要返回时,它将会引发StopIteration。 以下是一个例子。

    # define a list
    my_list = [4, 7, 0, 3]
    
    # get an iterator using iter()
    my_iter = iter(my_list)
    
    ## iterate through it using next() 
    
    #prints 4
    print(next(my_iter))
    
    #prints 7
    print(next(my_iter))
    
    ## next(obj) is same as obj.__next__()
    
    #prints 0
    print(my_iter.__next__())
    
    #prints 3
    print(my_iter.__next__())
    
    ## This will raise error, no items left
    next(my_iter)
    
    Python

    更优雅的自动迭代方式是使用for循环。 使用for循环可以迭代任何可以返回迭代器的对象,例如列表,字符串,文件等。

    >>> for element in my_list:
    ...     print(element)
    ...     
    4
    7
    0
    3
    
    Python

    循环如何实际工作?

    在上面的例子中看到的,for循环能够自动通过列表迭代。

    事实上,for循环可以迭代任何可迭代对象。我们来仔细看一下在Python中是如何实现for循环的。

    for element in iterable:
        # do something with element
    
    Python

    实际上它是以类似下面的方式来实现的 -

    # create an iterator object from that iterable
    iter_obj = iter(iterable)
    
    # infinite loop
    while True:
        try:
            # get the next item
            element = next(iter_obj)
            # do something with element
        except StopIteration:
            # if StopIteration is raised, break from loop
            break
    
    Python

    所以在for的内部,for循环通过在可迭代的对象上调用iter()来创建一个迭代器对象iter_obj

    有意思的是,这个for循环实际上是一个无限循环~..~。

    在循环中,它调用next()来获取下一个元素,并使用该值执行for循环的主体。 在所有对象耗尽后,引发StopIteration异常,内部被捕获从而结束循环。请注意,任何其他类型的异常都将正常通过。

    在Python中构建自己的Iterator

    构建迭代器在Python中很容易。只需要实现__iter__()__next__()方法。

    __iter__()方法返回迭代器对象本身。如果需要,可以执行一些初始化。

    __next__()方法必须返回序列中的下一个项目(数据对象)。 在到达结束后,并在随后的调用中它必须引发StopIteration异常。

    在这里,我们展示一个例子,在每次迭代中给出下一个2的几次方。 次幂指数从零开始到用户设定的数字。

    class PowTwo:
        """Class to implement an iterator
        of powers of two"""
    
        def __init__(self, max = 0):
            self.max = max
    
        def __iter__(self):
            self.n = 0
            return self
    
        def __next__(self):
            if self.n <= self.max:
                result = 2 ** self.n
                self.n += 1
                return result
            else:
                raise StopIteration
    
    Python

    现在可以创建一个迭代器,并通过它迭代如下 -

    >>> a = PowTwo(4)
    >>> i = iter(a)
    >>> next(i)
    1
    >>> next(i)
    2
    >>> next(i)
    4
    >>> next(i)
    8
    >>> next(i)
    16
    >>> next(i)
    Traceback (most recent call last):
    ...
    StopIteration
    
    Shell

    也可以使用for循环迭代那些迭代器类。

    >>> for i in PowTwo(5):
    ...     print(i)
    ...     
    1
    2
    4
    8
    16
    32
    
    Shell

    Python无限迭代器

    迭代器对象中的项目不必都是可耗尽的,可以是无限迭代器(永远不会结束)。 处理这样的迭代器时一定要小心。

    下面是用来演示无限迭代器的一个简单的例子。

    内置的函数iter()可以用两个参数来调用,其中第一个参数必须是可调用对象(函数),而第二个参数是标头。迭代器调用此函数,直到返回的值等于指定值。

    >>> int()
    0
    
    >>> inf = iter(int,1)
    >>> next(inf)
    0
    >>> next(inf)
    0
    
    Python

    可以看到,int()函数总是返回0,所以将它作为iter(int,1)传递将返回一个调用int()的迭代器,直到返回值等于1。这从来没有发生,所以这样就得到一个无限迭代器。

    我们也可以建立自己的无限迭代器。 以下迭代器理论上将返回所有奇数。

    class InfIter:
        """Infinite iterator to return all
            odd numbers"""
    
        def __iter__(self):
            self.num = 1
            return self
    
        def __next__(self):
            num = self.num
            self.num += 2
            return num
    
    Python

    示例运行如下 -

    >>> a = iter(InfIter())
    >>> next(a)
    1
    >>> next(a)
    3
    >>> next(a)
    5
    >>> next(a)
    7
    
    Shell

    当迭代这些类型的无限迭代器时,请注意指定终止条件。

    使用迭代器的优点是它们可以节省资源。 如上所示,我们可以获得所有奇数,而不将整个系统存储在内存中。理论上,可以在有限的内存中计算有无限的项目。

    原文出自【易百教程】,商业转载请联系作者获得授权,非商业转载请保留原文链接:https://www.yiibai.com/python/iterator.html

    转载于:https://www.cnblogs.com/valorchang/p/11319442.html

    展开全文
  • python迭代器

    2019-06-03 16:20:49
    # python迭代器 # Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么? # 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的, # 也就是说有多少事可知...
    # python迭代器
    
    # Python中 list,truple,str,dict这些都可以被迭代,但他们并不是迭代器。为什么?
    # 因为和迭代器相比有一个很大的不同,list/truple/map/dict这些数据的大小是确定的,
    # 也就是说有多少事可知的。但迭代器不是,迭代器不知道要执行多少次,所以可以理解
    # 为不知道有多少个元素,每调用一次next(),就会往下走一步,是惰性的。
    
    from collections import Iterator,Iterable
    a = [1,2,3,4,5,6,7]#a不是可迭代对象,但是可以迭代
    #创建一个迭代器
    b = iter(a)#b迭代器a
    print(type(b))
    print(b)
    print(next(b))
    print(next(b))
    
    #Iterator判断是不是迭代器,Iteraable判断可不可以迭代
    c = isinstance(a,Iterator)#
    print(c)
    d = isinstance(a,Iterable)#
    print(d)
    # 凡是可以for循环的,都是Iterable
    # 凡是可以next()的,都是Iterator
    # 集合数据类型如list,truple,dict,str,都是Itrable不是Iterator,但可以通过iter()函数获得一个Iterator对象
    # Python中的for循环就是通过next实现的
    
    展开全文
  • python迭代器Good day learners! In our previous tutorial, we learned about Python Operator Overloading. In this tutorial we are going to learn about Python Iterator. 美好的一天学习者! 在上一教程中,...

    python迭代器

    Good day learners! In our previous tutorial, we learned about Python Operator Overloading. In this tutorial we are going to learn about Python Iterator.

    美好的一天学习者! 在上一教程中,我们了解了Python操作符重载 。 在本教程中,我们将学习Python Iterator。

    Python迭代器 (Python Iterator)

    Knowingly or unknowingly, you have used iterator in your Python code. Basically, an iterator is an object which is used to iterate through an iterable element. Didn’t understand the meaning of the last line? Well, don’t worry. We will make you understand about Python Iterator through our tutorial.

    在有意无意的情况下,您已经在Python代码中使用了迭代器。 基本上,迭代器是用于迭代可迭代元素的对象。 不明白最后一行的意思吗? 好吧,别担心。 我们将通过本教程使您了解Python Iterator。

    Python迭代器和可迭代元素 (Python Iterator and Iterable Elements)

    Most of the objects of Python are iterable. In python, all the sequences like Python String, Python List, Python Dictionary etc are iterable. Now, what is iterator? Suppose, A group of 5 boys are standing in a line. Your are pointing at the first boy and ask him about his name. Then, he replied. After that, you ask the next boy and so on. The below picture will illustrate the thing.

    Python的大多数对象都是可迭代的。 在python中,所有序列(如Python StringPython ListPython Dictionary等)都是可迭代的。 现在,什么是迭代器? 假设有5个男孩在排队。 您指着第一个男孩,问他这个名字。 然后,他回答。 之后,您询问下一个男孩,依此类推。 下图将说明问题。

    In this case, you are the Iterator!!!! Obviously, the group of boys is the iterable element. Hope you understand now.

    在这种情况下,您就是Iterator !!!! 显然,男孩组是可迭代的元素。 希望你现在明白了。

    Python迭代器协议 (Python Iterator Protocol)

    Python Iterator Protocol includes two functions. One is iter() and the other is next(). In this section, we will learn to how to traverse an iterable element using Python Iterator Protocol.

    Python迭代器协议包含两个函数。 一个是iter() ,另一个是next() 。 在本节中,我们将学习如何使用Python迭代器协议遍历可迭代元素。

    In the previous section, we gave the example of group of 5 boys and you. You are the iterator and the boys group is the iterable element. After knowing the name of one boy, you ask the same question to the next boy.

    在上一节中,我们给出了一个由5个男孩和您组成的小组的示例。 您是迭代器,而boys组是可迭代的元素。 知道一个男孩的名字后,您向下一个男孩问同样的问题。

    After that, you do it again. iter() function is used to create an iterator of an iterable element. And the next() function is used to iterate to the next element.

    在那之后,您再做一次。 iter()函数用于创建可迭代元素的迭代器。 next()函数用于迭代到下一个元素。

    Python迭代器示例 (Python Iterator Example)

    If the iterator go beyond the number of iterable elements then the next() method will raise StopIteration exception. See the code below for python iterator example.

    如果迭代器超出了可迭代元素的数量,则next()方法将引发StopIteration异常。 有关python迭代器示例,请参见下面的代码。

    list_string = ['Boy 1', 'Boy 2', 'Boy 3', 'Boy 4', 'Boy 5']
    
    iterator_you = iter(list_string)
    
    # point the first boy
    output = next(iterator_you)
    # This will print 'Boy 1'
    print(output)
    
    # point the next boy, the second boy
    output = next(iterator_you)
    # This will print 'Boy 2'
    print(output)
    
    # point the next boy, the third boy
    output = next(iterator_you)
    # This will print 'Boy 3'
    print(output)
    
    # point the next boy, the fourth boy
    output = next(iterator_you)
    # This will print 'Boy 4'
    print(output)
    
    # point the next boy, the fifth boy
    output = next(iterator_you)
    # This will print 'Boy 5'
    print(output)
    
    # point the next boy, but there is no boy left
    # so raise 'StopIteration' exception
    output = next(iterator_you)
    # This print will not execute
    print(output)

    Output

    输出量

    Boy 1
    Boy 2
    Boy 3
    Boy 4
    Boy 5
    Traceback (most recent call last):
      File "/home/imtiaz/Desktop/py_iterator.py", line 32, in 
        output = next(iterator_you)
    StopIteration

    制作Python迭代器 (Making of a Python Iterator)

    However, you can make your own specified Python Iterators. To do so, you have to implement a Python class. I assume that you know about Python Class. If you don’t know about this, you can read our tutorial about Python Class.

    但是,您可以创建自己的指定Python迭代器。 为此,您必须实现一个Python类。 我假设您了解Python类。 如果您不了解这一点,可以阅读有关Python Class的教程。

    As we have said earlier that, Python Iterator Protocol consist of two methods. So we need to implement those method.

    如前所述,Python迭代器协议包含两种方法。 因此,我们需要实现那些方法。

    For example, you want to generate a list of fibonacci number so that each time call the next function it returns you the next fibonacci number.

    例如,您要生成一个斐波那契编号列表,以便每次调用下一个函数时,它都会向您返回下一个斐波那契编号。

    To raise the exception, we limit the value of n below 10. If the value of n reach 10, it will raise an exception. The code will be like this.

    为了引发异常,我们将n的值限制为小于10。如果n的值达到10,它将引发异常。 代码将像这样。

    class fibo:
        def __init__(self):
            # default constructor
            self.prev = 0
            self.cur = 1
            self.n = 1
    
        def __iter__(self):  # define the iter() function
            return self
    
        def __next__(self):  # define the next() function
            if self.n < 10:  # Limit to 10
                # calculate fibonacci
                result = self.prev + self.cur
                self.prev = self.cur
                self.cur = result
                self.n += 1
                return result
            else:
                raise StopIteration  # raise exception
    
    # init the iterator
    iterator = iter(fibo())
    # Try to print infinite time until it gets an exception
    while True:
        # print the value of next fibonacci up to 10th fibonacci
        try:
            print(next(iterator))
        except StopIteration:
            print('First 9 fibonacci numbers have been printed already.')
            break  # break the loop

    So, the output will be

    因此,输出将是

    1
    2
    3
    5
    8
    13
    21
    34
    55
    First 9 fibonacci numbers have been printed already.

    为什么要制作Python迭代器 (Why Making Python Iterator)

    After going through the previous section, a question may arise to your mind that why should we make Python Iterator.

    经过上一节后,您可能会想到一个问题,为什么我们应该制作Python Iterator。

    Well, we have seen already that iterator can traverse an iterable element. Suppose, in our previous example if we make a list of fibonacci numbers and then traverse it via a Python Iterator, it would take huge memory. But if you create a simple Python Iterator class, you can serve your purpose without consuming that much memory.

    好了,我们已经看到迭代器可以遍历可迭代元素。 假设在前面的示例中,如果我们列出了斐波那契数字的列表,然后通过Python迭代器遍历它,则将占用大量内存。 但是,如果您创建一个简单的Python Iterator类,则可以在不消耗大量内存的情况下实现您的目的。

    So that’s all for Python Iterator. Hope that you are now able to work with Python Iterator. For any further query, you can use the comment box. Learn and practice as much as you can.

    这就是Python Iterator的全部内容。 希望您现在可以使用Python Iterator。 对于任何其他查询,您可以使用注释框。 尽可能多地学习和练习。

    #HappyCoding

    #HappyCoding

    Reference: Python Doc

    参考: Python文档

    翻译自: https://www.journaldev.com/14620/python-iterator

    python迭代器

    展开全文
  • Python 迭代器与生成器1.迭代器迭代器是集合元素的一种方式迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退迭代器有两个基本的方法:iter() 和 next()字符串,列表或...
  • 很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系?这篇文章就是要用最简单的方式让你理解Python迭代器和生成器!1、迭代器和迭代过程维基百科解释道:在Python中,迭代器是遵循迭代协议的...
  • python迭代器和生成器一、迭代器1、什么是迭代器说迭代器之前有个相关的名词需要介绍: 可迭代对象:只要定义了iter()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器。在Python中,for循环可以用于...
  • python 迭代器

    2020-06-24 16:18:58
    迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 迭代器是一个可以记住遍历的位置的对象。 迭代器...
  • 很多童鞋搞不懂python迭代器和生成器到底是什么?它们之间又有什么样的关系?这篇文章就是要用最简单的方式让你理解Python迭代器和生成器!1、迭代器和迭代过程维基百科解释道:在Python中,迭代器是遵循迭代协议的...
  • 本文实例讲述了python迭代器的简单用法,分享给大家供大家参考。具体分析如下:生成器表达式是用来生成函数调用时序列参数的一种迭代器写法生成器对象可以遍历或转化为列表(或元组等数据结构),但不能切片(slicing)...
  • Python 迭代器与生成器实例详解一、如何实现可迭代对象和迭代器对象1.由可迭代对象得到迭代器对象例如l就是可迭代对象,iter(l)是迭代器对象?# 下面这种直接调用函数的方法如果数据量大的时候会对网络IO要求比较高,...
  • Python迭代器是什么?如何在Python中使用迭代器?在python中,可以将Iterator定义为用于保存一组值的对象,该值可以在程序的迭代操作中使用。为了使用iterator对象执行迭代操作,python有两个特殊的方法,例如iter()...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 22,789
精华内容 9,115
关键字:

python迭代器

python 订阅