Mesela bunu basitlestirelim:
En karmasik yer for loop’u. (Okuyarak anlamadim, calistirip bakmam gerekti ne yaptigina. +
operatoru Python’da bir suru farkli is yapiyor cunku.)
i
ve range
kullanmamizin sebebi indise ve bir araliga ihtiyacimiz olmasi mi? Hayir, bunlar yapmak istedigimizi tane tane ifade etme aliskanligindan geliyor. Aslinda istedigimiz ardisik ciftler. itertools
’a bakiyoruz:
import itertools
def pairwise(iterable):
"s -> (s0,s1), (s1,s2), (s2, s3), ..."
a, b = itertools.tee(iterable)
next(b, None)
return zip(a, b)
Kodda:
def pascal(n):
if n == 1:
return [1]
else:
SAT = [1]
ON_SAT = pascal(n-1)
for a, b in pairwise(ON_SAT):
SAT.append(a + b)
SAT += [1]
return SAT
ON_SAT
’a da ihtiyac kalmadi:
def pascal(n):
if n == 1:
return [1]
else:
SAT = [1]
for a, b in pairwise(pascal(n-1)):
SAT.append(a + b)
SAT += [1]
return SAT
Peki SAT
’in hakikaten hayatina [1]
olarak baslayip, yavas yavas buyumesine ihtiyacimiz var mi? Hayir, basinda ve sonunda 1 olan ve arada ciftlerin toplami olan bir liste istiyoruz:
def pascal(n):
if n == 1:
return [1]
else:
SAT = [1] + [a+b for a, b in pairwise(pascal(n-1))] + [1]
return SAT
Degiskene de ihtiyac yok:
def pascal(n):
if n == 1:
return [1]
else:
return [1] + [a+b for a, b in pairwise(pascal(n-1))] + [1]
Birden fazla return’e de:
def pascal(n):
return ([1]) if (n == 1) else ([1] + [a+b for a, b in pairwise(pascal(n-1))] + [1])
Sonra lambda’lastirmak istersek:
pascal = lambda n: ([1]) if (n == 1) else ([1] + [a+b for a, b in pairwise(pascal(n-1))] + [1])