@@ -147,10 +147,10 @@ loops that truncate the stream.
147
147
>>> list (accumulate(data, max )) # running maximum
148
148
[3, 4, 6, 6, 6, 9, 9, 9, 9, 9]
149
149
150
- # Amortize a 5% loan of 1000 with 4 annual payments of 90
151
- >>> cashflows = [ 1000 , - 90 , - 90 , - 90 , - 90 ]
152
- >>> list (accumulate(cashflows, lambda bal , pmt : bal * 1.05 + pmt ))
153
- [1000, 960.0 , 918.0, 873.9000000000001, 827.5950000000001 ]
150
+ # Amortize a 5% loan of 1000 with 10 annual payments of 90
151
+ >>> account_update = lambda bal , pmt : round (bal * 1.05 ) + pmt
152
+ >>> list (accumulate(repeat( - 90 , 10 ), account_update, initial = 1_000 ))
153
+ [1000, 960, 918, 874, 828, 779, 728, 674, 618, 559, 497 ]
154
154
155
155
See :func: `functools.reduce ` for a similar function that returns only the
156
156
final accumulated value.
@@ -951,7 +951,10 @@ which incur interpreter overhead.
951
951
nexts = cycle(islice(nexts, num_active))
952
952
953
953
def partition(pred, iterable):
954
- "Use a predicate to partition entries into false entries and true entries"
954
+ """Partition entries into false entries and true entries.
955
+
956
+ If *pred * is slow, consider wrapping it with functools.lru_cache().
957
+ """
955
958
# partition(is_odd, range(10)) --> 0 2 4 6 8 and 1 3 5 7 9
956
959
t1, t2 = tee(iterable)
957
960
return filterfalse(pred, t1), filter(pred, t2)
@@ -1031,7 +1034,7 @@ The following recipes have a more mathematical flavor:
1031
1034
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
1032
1035
1033
1036
def sieve(n):
1034
- "Primes less than n"
1037
+ "Primes less than n. "
1035
1038
# sieve(30) --> 2 3 5 7 11 13 17 19 23 29
1036
1039
data = bytearray((0, 1)) * (n // 2)
1037
1040
data[:3] = 0, 0, 0
@@ -1068,7 +1071,7 @@ The following recipes have a more mathematical flavor:
1068
1071
1069
1072
def matmul(m1, m2):
1070
1073
"Multiply two matrices."
1071
- # matmul([(7, 5), (3, 5)], [[ 2, 5], [ 7, 9] ]) --> (49, 80), (41, 60)
1074
+ # matmul([(7, 5), (3, 5)], [( 2, 5), ( 7, 9) ]) --> (49, 80), (41, 60)
1072
1075
n = len(m2[0])
1073
1076
return batched(starmap(math.sumprod, product(m1, transpose(m2))), n)
1074
1077
@@ -1109,6 +1112,17 @@ The following recipes have a more mathematical flavor:
1109
1112
powers = map(pow, repeat(x), reversed(range(n)))
1110
1113
return math.sumprod(coefficients, powers)
1111
1114
1115
+ def polynomial_derivative(coefficients):
1116
+ """Compute the first derivative of a polynomial.
1117
+
1118
+ f(x) = x³ -4x² -17x + 60
1119
+ f'(x) = 3x² -8x -17
1120
+ """
1121
+ # polynomial_derivative([1, -4, -17, 60]) -> [3, -8, -17]
1122
+ n = len(coefficients)
1123
+ powers = reversed(range(1, n))
1124
+ return list(map(operator.mul, coefficients, powers))
1125
+
1112
1126
def nth_combination(iterable, r, index):
1113
1127
"Equivalent to list(combinations(iterable, r))[index]"
1114
1128
pool = tuple(iterable)
@@ -1297,6 +1311,9 @@ The following recipes have a more mathematical flavor:
1297
1311
>>> all (factored(x) == expanded(x) for x in range (- 10 , 11 ))
1298
1312
True
1299
1313
1314
+ >>> polynomial_derivative([1 , - 4 , - 17 , 60 ])
1315
+ [3, -8, -17]
1316
+
1300
1317
>>> list (iter_index(' AABCADEAF' , ' A' ))
1301
1318
[0, 1, 4, 7]
1302
1319
>>> list (iter_index(' AABCADEAF' , ' B' ))
0 commit comments