At 16:22 23.10.2003 -0700, Guido van Rossum wrote: > > > def tee(iterable): > > > "Return two independent iterators from a single iterable" > > > data = {} > > > cnt = 0 > > > def gen(next): > > > global* cnt > > > dpop = data.pop > > > for i in count(): > > > if i == cnt: > > > item = data[i] = next() > > > cnt += 1 > > > else: > > > item = dpop(i) > > > yield item > > > next = iter(iterable).next > > > return (gen(next), gen(next)) > > > > > >which is IMO more readable. > > > > it's a subtle piece of code. I wouldn't mind a more structured syntax with > > both the outer function declaring that is ok for some inner function to > > rebind some of its locals, and the inner function declaring that a > local is > > coming from an outer scope: > > > > def tee(iterable): > > "Return two independent iterators from a single iterable" > > data = {} > > > > # cnt = 0 here would be ok > > > > share cnt = 0: # the assignment is opt, > > # inner functions in the suite can rebind cnt > > def gen(next): > > use cnt # OR outer cnt > > dpop = data.pop > > for i in count(): > > if i == cnt: > > item = data[i] = next() > > cnt += 1 > > else: > > item = dpop(i) > > yield item > > > > # cnt = 0 here would be ok > > > > next = iter(iterable).next > > return (gen(next), gen(next)) > > > > yes it's heavy and unpythonic, but it makes very clear that something > > special is going on with cnt. > >Might as well declare a class then. :-) well, no, it's probably that I expect rebindable closed-over vars to be introduced but some kind of structured construct instead of the usual Python freeform. I think for this kind of situation I miss the Lisp-y 'let'. def counter(starval): share cnt = startval: def inc(i): use cnt cnt += i return cnt def dec(i) use cnt cnt -= i return cnt return inc,dec vs. def counter(starval): cnt = startval def inc(i): global cnt in counter cnt += i return cnt def dec(i) global cnt in counter cnt -= i return cnt return inc,dec vs. def counter(starval): class Counter: def __init__(self,startval): self.cnt = startval def inc(self,i): self.cnt += i return self.cnt def dec(self,i): self.cnt += i return self.cnt newcounter = Counter(startval) return newcounter.inc,newcounter.dec vs. (defun counter (startval) (let ((cnt startval)) (flet ((inc (i) (incf cnt i)) (dec (i) (decf cnt i))) (values #'inc #'dec)))) <wink>
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4