Sunday, March 27, 2016

Python Iterable and Iterator

Python has similar concept to C# IEnumerable/IEnumerator + some RX 
 
Comprehension--[expr(i) for i in iterable] words="words make a sentence."
words.split() {[len(w) for w in words]} {factorial(x) for x in range(10)}
d={k:v} d_flip={v:k for k:v in d.items()} from math import factorial
from pprint import pprint as p p(d_flip) [w[0]:x for w in words]
{os.path.readpath(p):os.stat(p).st_size for p in glob.glob("*.py")
sum(x for x in range(1,step=1,stop_exclusive=100) if is_prime(x))

itr=itr(itra) itm =next(itr) def first(itra): return next(itr(itra))
except StopIteration return None is null first(set()) empty set None
def first(itra): try: return next(iter(itra)) return None

from math import sqrt
def is_prime(x):
    if x<2:
        return False
    for i in range(2,int(sqrt(x))+2):
        if x%i==0:
            return False
    return True

from itertools import islice, count
p1000=[x for x in range(1,1000) if is_prime(x)]
i=list(islice(p1000,5,10))  # islice=skip+take

 count() infinite lazy squence, carefuly with memory overrun by [
slice_inf= islice((x for x in count() if is_prime(x)),1000) # (tuple is fine

from pprint import pprint as pp does not help need list to convert
print(list(slice_inf)) print(sum(slice_inf))  #fast efficient

print(any(is_prime(x) for x in range(4495,4500))) 
print(all( n==n.title() for n in ["London","Boston Ma"])) # ma=false

from itertools import chain
s1=[1,2,3,4] s2=[5,6,7,8] print(list(zip(s1,s2,s1))) 
print(list(chain(s1,s2,s1))) print(list([ max(x) for x in zip(s1,s2,s1)]))

Fibonacci in Python -- lazy yield does not cost memory
def f(x): 
    yield 1
    t1=1
    t2=1
    while t1<x:
        yield t1
        t1,t2=t1+t2,t1

Generator = Lazy comprehension Iterable
g=(x for x in range(1000)) #must use () not [] as tuple RO efficient
l=list(g) realization cost 45M Ram list(g) is single use list(g) empty after
sum( x for x in ...) low memory cost re-run l=list(g) is not emoty cost Ram
statefull generator -- counter or seen=set() in memory durin iteration.
def take(n,itra) counter=0 for .. if(counter==n) return counter++ yield itm
def distinct(itra) seen=set() for .. if i in seen: continue yield itm seen.add(itm)
pipeline for i in take(10,distinc(itra)







No comments:

Post a Comment