On Mon, Jan 13, 2014 at 1:36 PM, Keith Winston <keithw...@gmail.com> wrote: > Yikes, Peter, that's scary. Wow.
Yikes, watch the top posting. :) >> In the mean time here is my candidate: >> >> def test(a, b): >> a = iter(a) >> return all(c in a for c in b) Refer to the language reference discussion of comparison expressions: http://docs.python.org/3/reference/expressions.html#not-in For user-defined classes which do not define __contains__() but do define __iter__(), x in y is true if some value z with x == z is produced while iterating over y. Since the iterator returned by `iter(a)` doesn't implement __contains__, the interpreter iterates it looking for a match for `c`. In effect, Peter smuggled a state variable into the expression, equivalent to `index` in your code. CPython Implementation The "in" comparison operator is implemented abstractly by PySequence_Contains. If the type doesn't define sq_contains, then the call is routed to _PySequence_IterSearch, which calls PyIter_Next until it either finds a match or the iterator is exhausted. _______________________________________________ Tutor maillist - Tutor@python.org To unsubscribe or change subscription options: https://mail.python.org/mailman/listinfo/tutor