Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.python > #85411

Re: __next__ and StopIteration

Path csiph.com!usenet.pasdenom.info!gegeweb.org!usenet-fr.net!nerim.net!novso.com!newsfeed.xs4all.nl!newsfeed4.news.xs4all.nl!xs4all!post.news.xs4all.nl!not-for-mail
Return-Path <ian.g.kelly@gmail.com>
X-Original-To python-list@python.org
Delivered-To python-list@mail.python.org
X-Spam-Status OK 0.011
X-Spam-Evidence '*H*': 0.98; '*S*': 0.00; 'none:': 0.07; 'referring': 0.07; 'immutable': 0.09; 'python': 0.11; 'def': 0.12; 'suggest': 0.14; 'itself.': 0.14; 'constructs': 0.16; 'iterable': 0.16; 'iterables': 0.16; 'iterated': 0.16; 'iterator': 0.16; 'iterators': 0.16; 'object).': 0.16; 'wrote:': 0.18; 'value.': 0.19; '(the': 0.22; 'feb': 0.22; 'otherwise,': 0.22; 'mon,': 0.24; 'source': 0.25; 'this:': 0.26; 'values': 0.27; 'header:In-Reply- To:1': 0.27; 'raise': 0.29; 'message-id:@mail.gmail.com': 0.30; "d'aprano": 0.31; 'steven': 0.31; 'trivial': 0.31; 'yourself.': 0.31; 'class': 0.32; '(e.g.': 0.33; 'skip:_ 10': 0.34; 'skip:s 30': 0.35; 'received:google.com': 0.35; 'there': 0.35; 'version': 0.36; 'next': 0.36; 'method': 0.36; 'should': 0.36; 'to:addr :python-list': 0.38; 'pm,': 0.38; 'track': 0.38; 'itself': 0.39; 'to:addr:python.org': 0.39; 'even': 0.60; 'new': 0.61; 'range': 0.61; 'simply': 0.61; 'more': 0.64; 'determine': 0.67; '2015': 0.84; 'self.value': 0.84; 'subject:skip:S 10': 0.84
DKIM-Signature v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :content-type; bh=TDdmKjgJxvnS6CXv0871YZaob4UZIKGITpFN5gluAiY=; b=DzWiYUv2Ya4yEgxKXUoduE+5GLBsTcaaFlJsFWzkN8ag91FprOnBuyrTWsEBJhRY/z lOJqLpbmj118kzNSaw57BpDe1x1MuYYY0BXm1uNDUGZoHmfx50VBL0cEm7ZAF94nC4Gn +pFjcmkQoG6Azt//VF0wRY4jk3XVyeXApc5/pIHNDCgM7RHC0t3/n09MP1zcOqbBTCq4 i3Tk2k54/ulsD/shyyuDtAuNoEr780BGvRsgUIRBrDkv85kHdd9agtTt8xwDLtDHUOvF utSNm+gDItTNjIVJhN0eHPY5WKSp9KdQQG1/xhZXvld6X3bBKNzSfw+ToldG3Vmv5Mpl Hk/g==
X-Received by 10.68.197.72 with SMTP id is8mr33369744pbc.17.1423526237004; Mon, 09 Feb 2015 15:57:17 -0800 (PST)
MIME-Version 1.0
In-Reply-To <54d94307$0$12998$c3e8da3$5496439d@news.astraweb.com>
References <mailman.18573.1423509383.18130.python-list@python.org> <54d94307$0$12998$c3e8da3$5496439d@news.astraweb.com>
From Ian Kelly <ian.g.kelly@gmail.com>
Date Mon, 9 Feb 2015 16:56:36 -0700
Subject Re: __next__ and StopIteration
To Python <python-list@python.org>
Content-Type text/plain; charset=UTF-8
X-BeenThere python-list@python.org
X-Mailman-Version 2.1.15
Precedence list
List-Id General discussion list for the Python programming language <python-list.python.org>
List-Unsubscribe <https://mail.python.org/mailman/options/python-list>, <mailto:python-list-request@python.org?subject=unsubscribe>
List-Archive <http://mail.python.org/pipermail/python-list/>
List-Post <mailto:python-list@python.org>
List-Help <mailto:python-list-request@python.org?subject=help>
List-Subscribe <https://mail.python.org/mailman/listinfo/python-list>, <mailto:python-list-request@python.org?subject=subscribe>
Newsgroups comp.lang.python
Message-ID <mailman.18582.1423526240.18130.python-list@python.org> (permalink)
Lines 41
NNTP-Posting-Host 2001:888:2000:d::a6
X-Trace 1423526240 news.xs4all.nl 2860 [2001:888:2000:d::a6]:46820
X-Complaints-To abuse@xs4all.nl
Xref csiph.com comp.lang.python:85411

Show key headers only | View raw


On Mon, Feb 9, 2015 at 4:30 PM, Steven D'Aprano
<steve+comp.lang.python@pearwood.info> wrote:
> The way you write iterators is like this:
>
>
> Method 1 (the hard way):
>
> - Give your class an __iter__ method which simply returns self:
>
>     def __iter__(self):
>         return self
>
> - Give your class a __next__ method (`next` in Python 2) which *returns* a
> value. You will need to track which value to return yourself. It must raise
> StopIteration when there are no more values to return. Don't use yield.
>
>     def __next__(self):
>         value = self.value
>         if value is None:
>             raise StopIteration
>         self.value = self.calculate_the_next_value()
>         return value
>
> Your class is itself an iterator.

This is an anti-pattern, so don't even suggest it. Iterables should
never be their own iterators. Otherwise, your iterable can only be
iterated over once!

The proper version of the "hard way" is:

1) The __iter__ method of the iterable constructs a new iterator
instance and returns it.

2) The __iter__ method of the *iterator* simply returns itself.

3) The __next__ method of the iterator tracks the current value and
returns the next value. Note that the iterator should never store the
iterable's data internally, unless the iterable is immutable and the
calculation is trivial (e.g. a range object). Instead, it should
determine the next value by referring to its source iterable.

Back to comp.lang.python | Previous | NextPrevious in thread | Next in thread | Find similar | Unroll thread


Thread

__next__ and StopIteration Charles Hixson <charleshixsn@earthlink.net> - 2015-02-09 11:14 -0800
  Re: __next__ and StopIteration Rob Gaddi <rgaddi@technologyhighland.invalid> - 2015-02-09 19:27 +0000
  Re: __next__ and StopIteration Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2015-02-10 10:30 +1100
    Re: __next__ and StopIteration Ian Kelly <ian.g.kelly@gmail.com> - 2015-02-09 16:56 -0700
      Re: __next__ and StopIteration Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2015-02-10 11:42 +1100
        Re: __next__ and StopIteration Chris Angelico <rosuav@gmail.com> - 2015-02-10 11:54 +1100
          Re: __next__ and StopIteration Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2015-02-10 12:11 +1100
            Re: __next__ and StopIteration Chris Angelico <rosuav@gmail.com> - 2015-02-10 12:58 +1100
        Re: __next__ and StopIteration Chris Kaynor <ckaynor@zindagigames.com> - 2015-02-09 16:59 -0800
          Re: __next__ and StopIteration Steven D'Aprano <steve+comp.lang.python@pearwood.info> - 2015-02-10 16:54 +1100
        Re: __next__ and StopIteration Ian Kelly <ian.g.kelly@gmail.com> - 2015-02-10 01:30 -0700
        Re: __next__ and StopIteration Chris Kaynor <ckaynor@zindagigames.com> - 2015-02-10 09:27 -0800
    Re: __next__ and StopIteration Charles Hixson <charleshixsn@earthlink.net> - 2015-02-09 20:33 -0800
    Re: __next__ and StopIteration Chris Angelico <rosuav@gmail.com> - 2015-02-10 15:46 +1100
    Re: __next__ and StopIteration Charles Hixson <charleshixsn@earthlink.net> - 2015-02-09 22:16 -0800
    Re: __next__ and StopIteration Chris Angelico <rosuav@gmail.com> - 2015-02-10 17:38 +1100
    Re: __next__ and StopIteration Ethan Furman <ethan@stoneleaf.us> - 2015-02-10 08:44 -0800
    Re: __next__ and StopIteration Ian Kelly <ian.g.kelly@gmail.com> - 2015-02-10 09:53 -0700
    Re: __next__ and StopIteration Ethan Furman <ethan@stoneleaf.us> - 2015-02-10 09:33 -0800

csiph-web