Skip to content

Commit c2d1b05

Browse files
committed
Added more work
1 parent 0cc08a9 commit c2d1b05

File tree

9 files changed

+364
-0
lines changed

9 files changed

+364
-0
lines changed

formats.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/usr/bin/env python3
2+
3+
"""
4+
File: formats.py
5+
Various specialized string display formatting utilities.
6+
Test me with canned self-test or command-line argumnets.
7+
To do: add parans for negative money, and more feature.
8+
"""
9+
10+
11+
def commas(N):
12+
"""
13+
Format positive integer-like N for display with
14+
commas between digits grouping: "XXX,YYY,ZZZ"
15+
"""
16+
digits = str(N)
17+
assert(digits.isdigit())
18+
result = ''
19+
while digits:
20+
digits, last3 = digits[:-3], digits[-3:]
21+
result = (last3 + ',' + result) if result else last3
22+
return result
23+
24+
25+
def money(N, numwidth=0, currency="$"):
26+
"""
27+
Format number N for display with commas, 2 decimal digits,
28+
leading $ and sign, and optional padding: "$ -xxx,yyy.zz".
29+
numwidth=0 for no space padding, currency='' to omit symbol,
30+
and non-ASCII for others (e.g., pound=u'\xA3' or u'\u00A3').
31+
"""
32+
sign = '-' if N < 0 else ''
33+
N = abs(N)
34+
whole = commas(int(N))
35+
fract = ('%2f' % N)[-2:]
36+
number = '%s%s.%s' % (sign, whole, fract)
37+
return '%s%*s' % (currency, numwidth, number)
38+
39+
if __name__ == '__main__':
40+
def selftest():
41+
tests = 0, 1 # fails -1, 1.23
42+
tests += 12, 123, 1234, 12345, 123456, 1234567
43+
tests += 2 ** 32, 2 ** 100
44+
for test in tests:
45+
print(commas(test))
46+
47+
tests = 0, 1, -1, 1.23, 1., 1.2, 3.1341
48+
tests += 12, 123, 1234, 12345, 123456, 1234567
49+
tests += 2 ** 32, (2 ** 32 + .2342)
50+
tests += 1.2324, 1.2, 0.2345
51+
tests += -1.242, -1.2, -15.2
52+
tests += -(2 ** 32), -(2 ** 32 + 0.2324)
53+
tests += 2 ** 100, -(2 ** 100)
54+
for test in tests:
55+
print('%s [%s]' % (money(test, 17), test))
56+
57+
import sys
58+
if len(sys.argv) == 1:
59+
selftest()
60+
else:
61+
print(money(float(sys.argv[1]), int(sys.argv[2])))

mydir.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#!python
2+
"""
3+
mydir.py: a module that lists the namespaces of other module
4+
"""
5+
from __future__ import print_function
6+
7+
seplen = 60
8+
sepchr = '-'
9+
10+
def listing(module, verbose=True):
11+
sepline = sepchr * seplen
12+
if verbose:
13+
print(sepline)
14+
print('name:', module.__name__, 'file:', module.__file__)
15+
print(sepline)
16+
17+
count = 0
18+
for attr in sorted(module.__dict__): # Scan namespace keys (or enumerate)
19+
print('%02d) %s' % (count, attr), end=' ')
20+
if attr.startswith('__'):
21+
print('<built-in name>') # Skip __file__, etc
22+
else:
23+
print(getattr(module, attr)) # Same as .__dict__[attr]
24+
count += 1
25+
26+
if verbose:
27+
print(sepline)
28+
print(module.__name__, 'has %d names' % count)
29+
print(sepline)
30+
31+
if __name__ == '__main__':
32+
import mydir
33+
listing(mydir)

mymap.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
def mymap(func, *seqs):
2+
res = []
3+
for args in zip(*seqs):
4+
res.append(func(*args))
5+
return res
6+
7+
8+
# def mymap(func, *seqs):
9+
# return [func(*args) for args in zip(*seqs)]
10+
11+
print(mymap(abs, [-2, -1, 0, 1, 2]))
12+
print(mymap(pow, [1, 2], [2, 3, 4]))
13+
14+
15+
def mymap(func, *seqs):
16+
for args in zip(*seqs):
17+
yield func(*args)
18+
19+
20+
def mymap(func, *seqs):
21+
return (func(args) for args in zip(*seqs))
22+
23+
print(list(mymap(abs, [-2, -1, 0, 1, 2])))
24+
print(list(mymap(pow, [1, 2], [2, 3, 4])))

myzip.py

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
def myzip(*seqs):
2+
seqs = [list(S) for S in seqs]
3+
res = []
4+
while all(seqs):
5+
res.append(tuple(x.pop(0) for x in seqs))
6+
return res
7+
8+
9+
def mymapPad(*seqs, pad=None):
10+
seqs = [list(S) for S in seqs]
11+
res = []
12+
while any(seqs):
13+
res.append(tuple((S.pop(0) if S else pad) for S in seqs))
14+
return res
15+
16+
# Using Generator
17+
def myzip(*seqs):
18+
seqs = [list(S) for S in seqs]
19+
while all(seqs):
20+
yield tuple(x.pop(0) for x in seqs)
21+
22+
23+
def mymapPad(*seqs, pad=None):
24+
seqs = [list(S) for S in seqs]
25+
while any(seqs):
26+
yield tuple((S.pop(0) if S else pad) for S in seqs)
27+
28+
# Using min and max len
29+
def myzip(*seqs):
30+
minlen = min(len(S) for S in seqs)
31+
return [tuple(S[i] for S in seqs) for i in range(minlen)]
32+
33+
def mymapPad(*seqs, pad=None):
34+
maxlen = max(len(S) for S in seqs)
35+
index = range(maxlen)
36+
return [tuple((S[i] if len(S) > i else pad) for S in seqs) for i in index]
37+
38+
# Using Generator
39+
def myzip(*seqs):
40+
minlen = min(len(S) for S in seqs)
41+
return (tuple(S[i] for S in seqs) for i in range(minlen))
42+
43+
def mymapPad(*seqs, pad=None):
44+
maxlen = max(len(S) for S in seqs)
45+
index = range(maxlen)
46+
return (tuple((S[i] if len(S) > i else pad) for S in seqs) for i in index)
47+
48+
# Clever implementation from python manual
49+
def myzip(*seqs):
50+
iters = list(map(iter, seqs))
51+
while iters:
52+
res = [next(i) for i in iters]
53+
yield tuple(res)
54+
55+
S1, S2 = 'abc', 'xyz123'
56+
print(myzip(S1, S2))
57+
print(mymapPad(S1, S2))
58+
print(mymapPad(S1, S2, pad=99))

permute.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
def permute(seq):
2+
if not seq:
3+
yield seq
4+
else:
5+
for i in range(len(seq)):
6+
rest = seq[:i] + seq[i+1:]
7+
for x in permute(rest):
8+
yield seq[i:i+1] + x
9+
10+
def permute1(seq):
11+
if not seq:
12+
return [seq]
13+
else:
14+
res = []
15+
for i in range(len(seq)):
16+
rest = seq[:i] + seq[i+1:]
17+
for x in permute(rest):
18+
res.append(seq[i:i+1] + x)
19+
return resn
20+
21+
for i in permute('maths'):
22+
print(i)

scramble.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
L, S = [1, 2, 3], 'spam'
2+
# for i in range(len(S)):
3+
# S = S[1:] + S[:1]
4+
# print(S, end=' ')
5+
6+
# simple function
7+
def scramble(seq):
8+
res = []
9+
for i in range(len(seq)):
10+
X = seq[1:] + seq[:1]
11+
res.append(X)
12+
return res
13+
14+
15+
def scramble1(seq):
16+
return [seq[1:] + seq[:1] for i in range(len(seq))]
17+
18+
# above wait caller to wait until all list is done
19+
20+
# generator function
21+
def scramble2(seq):
22+
for i in range(len(seq)):
23+
yield seq[1:] + seq[:1]
24+
25+
def scramble3(seq):
26+
return (seq[1:] + seq[:1] for i in range(len(seq)))
27+

timer.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
"""
2+
Homegrown timing tools for function calls.
3+
Does total time, best-of time and best-of-totals time
4+
"""
5+
6+
import time
7+
import sys
8+
9+
if sys.version_info[0] >= 3 and sys.version_info[1] >= 3:
10+
timer = time.perf_counter
11+
else:
12+
timer = time.clock if sys.platform[:3] == 'win' else time.time
13+
14+
15+
def total(reps, func, *pargs, **kargs):
16+
"""
17+
Total time to run func() reps times.
18+
Return (total time, last result)
19+
"""
20+
replist = list(range(reps)) # Hoist out, eqvalize 2.x, 3.x
21+
start = timer()
22+
for i in replist:
23+
ret = func(*pargs, **kargs)
24+
elapsed = timer() - start
25+
return (elapsed, ret)
26+
27+
28+
def bestof(reps, func, *pargs, **kargs):
29+
"""
30+
Quickest func() among reps runs.
31+
Return (best time, last result)
32+
"""
33+
best = 2 ** 32 # 136 years seems large enough
34+
for i in range(reps):
35+
start = timer()
36+
ret = func(*pargs, **kargs)
37+
elapsed = timer() - start
38+
if elapsed < best:
39+
best = elapsed
40+
return (best, ret)
41+
42+
43+
44+
def bestoftotal(reps1, reps2, func, *pargs, **kargs):
45+
"""
46+
Best of totals:
47+
(best of reps1 runs of (total of reps2 runs of func))
48+
"""
49+
return bestof(reps1, total, reps2, func, *pargs, **kargs)

timer2.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# File timer2.py (2.x and 3.x)
2+
"""
3+
total(spam, 1, 2, a=3, b=4, _reps=1000) calls and times span(1, 2, a=3, b=4)
4+
_reps times, and return total time for all runs, and final result.
5+
6+
bestof(spam, 1, 2, a=3, b=4, _reps=1000) runs best-of-N timer to attempt to
7+
filter out the system load variation, and return best result among _reps tests.
8+
9+
bestoftotal(spam, 1, 2, a=3, b=4, _reps1=5, _reps=1000) runs best-of-totals
10+
test, which take the best among _reps1 run of (the total of _reps runs);
11+
"""
12+
13+
import time
14+
import sys
15+
16+
if sys.version_info[0] >= 3 and sys.version_info[1] >= 3:
17+
timer = time.perf_counter
18+
else:
19+
timer = time.clock if sys.platform[:3] == 'win' else time.time
20+
21+
22+
def total(func, *pargs, **kargs):
23+
_reps = kargs.pop('_reps', 1000)
24+
repslist = list(range(_reps))
25+
26+
start = timer()
27+
for i in repslist:
28+
ret = func(*pargs, **kargs)
29+
elapsed = timer() - start
30+
return (elapsed, ret)
31+
32+
33+
def bestof(func, *pargs, **kargs):
34+
_reps = kargs.pop('_reps', 1000)
35+
repslist = list(range(_reps))
36+
37+
best = 2 ** 32
38+
for i in repslist:
39+
start = timer()
40+
ret = func(*pargs, **kargs)
41+
elapsed = timer() - start
42+
if elapsed < best:
43+
best = elapsed
44+
return (best, ret)
45+
46+
47+
def bestoftotal(func, *pargs, **kargs):
48+
_reps1 = kargs.pop('_reps1', 5)
49+
return min(total(func, *pargs, **kargs) for i in range(_reps1))

timer3.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# File timer3.py
2+
"""
3+
Same usage as timer2.py, but uses 3.x keyword-only default arguments
4+
istead of dict pops for simpler code. No need to hoist range() out of tests
5+
in 3.x: always a generator in 3.x, and this can't run on 2.x
6+
"""
7+
8+
import time
9+
import sys
10+
11+
if sys.version_info[0] >= 3 and sys.version_info[1] >= 3:
12+
timer = time.perf_counter
13+
else:
14+
timer = time.clock if sys.platform[:3] == 'win' else time.time
15+
16+
17+
def total(func, *pargs, _reps=1000, **kargs):
18+
repslist = list(range(_reps))
19+
20+
start = timer()
21+
for i in repslist:
22+
ret = func(*pargs, **kargs)
23+
elapsed = timer() - start
24+
return (elapsed, ret)
25+
26+
27+
def bestof(func, *pargs, _reps=1000, **kargs):
28+
repslist = list(range(_reps))
29+
30+
best = 2 ** 32
31+
for i in repslist:
32+
start = timer()
33+
ret = func(*pargs, **kargs)
34+
elapsed = timer() - start
35+
if elapsed < best:
36+
best = elapsed
37+
return (best, ret)
38+
39+
40+
def bestoftotal(func, *pargs, _reps1=5, **kargs):
41+
return min(total(func, *pargs, **kargs) for i in range(_reps1))

0 commit comments

Comments
 (0)