Gist |
reset self.i self.nout class Nth. , - :
class Nth(object):
def __init__(self, n):
self.n = n
def itervalues(self, x):
for a,b in enumerate(islice(x, self.n - 1, None, self.n)):
self.nout = a
yield a,b
nout, :
def Nth(iterable, step):
return enumerate(itertools.islice(iterable, step - 1, None, step))
, NthSumDiff.itervalues ():
for (i,nthsum), (j,nthdiff) in izip(gen_sum, gen_diff):
gen_sum gen_diff, , gen_diff nout . , izip() gen_sum gen_diff. gen_sum StopIteration , gen_diff .
, , N , N% step == 7. self.i N- 0. self.i gen_sum 7, x . StopIteration. gen_diff self.i, 0.
self.i = 0 self.nout = 0 Nth.itervalues (), .
, , Pythonic. , , ( Python), , . C, , , , Python.
, ...
from itertools import izip, islice
import random
def sumdiff(x,y,step):
x = islice(x, step-1, None, step)
y = islice(y, step-1, None, step)
return ((xi + yi, xi - yi) for xi, yi in izip(x,y))
nskip = 12
nfiles = 10
for i in range(nfiles):
n = random.randint(50000, 100000)
print 'file %d n=%d' % (i, n)
x = range(n)
y = range(100,n+100)
for nthsum, nthdiff in sumdiff(x,y,nskip):
assert nthsum is not None
assert nthdiff is not None
assert len(list(sumdiff(x,y,nskip))) == n/nskip
:
. nout . X, . , ( , itertools.chain). , ; . StopIteration. izip ('ABCD', 'abcd') → Aa Bb Cc Dd, , ? - Hawkins 6
, , . . -, , itervalues(x).
class Nth(object):
def __init__(self, n):
self.n = n
self.i = 0
self.nout = 0
def itervalues(self, x):
for xi in x:
self.i += 1
if self.i == self.n:
self.i = 0
self.nout += 1
yield self.nout, xi
itervalues(x) , next() self.i self.n, , self.i , x, (itervalues () , ). itervalues () , Python StopIteration.
, class Nth, N, self.i itervalues(x) :
self.i = value_of_self_i_before_itervalues(X) + len(X) % N
, izip(Nth_1, Nth_2), - :
def izip(A, B):
try:
while True:
a = A.next()
b = B.next()
yield a,b
except StopIteration:
pass
, N=10 len(X)=13. next() izip(),
A, B self.i==0 . A.next() , self.i += 3, X, for, , Python StopIteration. izip() , B.next() . , A.i==3 B.i==0 .
( )
, . , , . , PyCon '14 . , 100% .
from itertools import izip, islice
import random
def sumdiff(data):
return ((x + y, x - y) for x, y in data)
def combined_file_data(files):
for i,n in files:
x = range(n)
y = range(100,n+100)
for data in izip(x,y):
yield data
def filelist(nfiles):
for i in range(nfiles):
n = random.randint(50000, 100000)
print 'file %d n=%d' % (i, n)
yield i, n
def Nth(iterable, step):
return islice(iterable, step-1, None, step)
nskip = 12
nfiles = 10
filedata = combined_file_data(filelist(nfiles))
nth_data = Nth(filedata, nskip)
for nthsum, nthdiff in sumdiff(nth_data):
assert nthsum is not None
assert nthdiff is not None