diff --git a/01-data-model/first.py b/01-data-model/first.py new file mode 100644 index 0000000..3cd8388 --- /dev/null +++ b/01-data-model/first.py @@ -0,0 +1,28 @@ +from frenchdeck import FrenchDeck, Card + +beer_card = Card('7', 'diamonds') +print(beer_card) +deck = FrenchDeck() +print(len(deck)) +print(deck[:3]) +print(deck[12::13]) +print(Card('Q', 'hearts') in deck) +print(Card('Z', 'clubs') in deck) +for card in deck: # doctest: +ELLIPSIS + print(card) + +for card in reversed(deck): # doctest: +ELLIPSIS + print(card) +for n, card in enumerate(deck, 1): # doctest: +ELLIPSIS + print(n, card) + +suit_values = dict(spades=3, hearts=2, diamonds=1, clubs=0) +def spades_high(card): + rank_value = FrenchDeck.ranks.index(card.rank) + return rank_value * len(suit_values) + suit_values[card.suit] + +print(spades_high(Card('2', 'clubs'))) +print(spades_high(Card('A', 'spades'))) +for card in sorted(deck, key=spades_high): # doctest: +ELLIPSIS + print(card) + diff --git a/01-data-model/second.py b/01-data-model/second.py new file mode 100644 index 0000000..776f4e2 --- /dev/null +++ b/01-data-model/second.py @@ -0,0 +1,11 @@ +from vector2d import Vector + +v1 = Vector(2,3) +v2 = Vector(4,5) + +print(v1+v2) +print(v1*3) +print(3*v1) + + + diff --git a/01-data-model/vector2d.py b/01-data-model/vector2d.py index 178f498..7049bc9 100644 --- a/01-data-model/vector2d.py +++ b/01-data-model/vector2d.py @@ -22,3 +22,5 @@ def __add__(self, other): def __mul__(self, scalar): return Vector(self.x * scalar, self.y * scalar) + + diff --git a/05-1class-func/cl_func_1.py b/05-1class-func/cl_func_1.py new file mode 100644 index 0000000..8d774c1 --- /dev/null +++ b/05-1class-func/cl_func_1.py @@ -0,0 +1,10 @@ +from clip_annot import clip +from inspect import signature +sig = signature(clip) +print(sig.return_annotation) + +for param in sig.parameters.values(): + note = repr(param.annotation).ljust(13) + print(note, ':', param.name, '=', param.default) + +max_len = 80 diff --git a/05-1class-func/cl_func_2.py b/05-1class-func/cl_func_2.py new file mode 100644 index 0000000..f08b6fc --- /dev/null +++ b/05-1class-func/cl_func_2.py @@ -0,0 +1,6 @@ +from clip import clip +print(clip.__defaults__) + +print(clip.__code__) +print(clip.__code__.co_varnames) +print(clip.__code__.co_argcount) diff --git a/05-1class-func/cl_func_3.py b/05-1class-func/cl_func_3.py new file mode 100644 index 0000000..9cdd55d --- /dev/null +++ b/05-1class-func/cl_func_3.py @@ -0,0 +1,6 @@ +from clip import clip +from inspect import signature +sig = signature(clip) + +for name, param in sig.parameters.items(): + print(param.kind, ':', name, '=', param.default) diff --git a/05-1class-func/clip_annot_signature.rst b/05-1class-func/clip_annot_signature.rst deleted file mode 100644 index 6f41aac..0000000 --- a/05-1class-func/clip_annot_signature.rst +++ /dev/null @@ -1,10 +0,0 @@ ->>> from clip_annot import clip ->>> from inspect import signature ->>> sig = signature(clip) ->>> sig.return_annotation - ->>> for param in sig.parameters.values(): -... note = repr(param.annotation).ljust(13) -... print(note, ':', param.name, '=', param.default) - : text = -'int > 0' : max_len = 80 diff --git a/05-1class-func/clip_introspection.rst b/05-1class-func/clip_introspection.rst deleted file mode 100644 index aae210a..0000000 --- a/05-1class-func/clip_introspection.rst +++ /dev/null @@ -1,9 +0,0 @@ ->>> from clip import clip ->>> clip.__defaults__ -(80,) ->>> clip.__code__ # doctest: +ELLIPSIS - ->>> clip.__code__.co_varnames -('text', 'max_len', 'end', 'space_before', 'space_after') ->>> clip.__code__.co_argcount -2 diff --git a/05-1class-func/clip_signature.rst b/05-1class-func/clip_signature.rst deleted file mode 100644 index 43a5cb4..0000000 --- a/05-1class-func/clip_signature.rst +++ /dev/null @@ -1,12 +0,0 @@ ->>> from clip import clip ->>> from inspect import signature ->>> sig = signature(clip) ->>> sig # doctest: +ELLIPSIS - ->>> str(sig) -'(text, max_len=80)' ->>> for name, param in sig.parameters.items(): -... print(param.kind, ':', name, '=', param.default) -... -POSITIONAL_OR_KEYWORD : text = -POSITIONAL_OR_KEYWORD : max_len = 80 diff --git a/06-dp-1class-func/dp_func_1.py b/06-dp-1class-func/dp_func_1.py new file mode 100644 index 0000000..3559327 --- /dev/null +++ b/06-dp-1class-func/dp_func_1.py @@ -0,0 +1,15 @@ +from classic_strategy import LineItem, FidelityPromo, LargeOrderPromo, BulkItemPromo, Customer, Order, Promotion + +joe = Customer('John Doe', 0) # <1> +ann = Customer('Ann Smith', 1100) +cart = [LineItem('banana', 4, .5), # <2> + LineItem('apple', 10, 1.5), + LineItem('watermellon', 5, 5.0)] +print(Order(joe, cart, FidelityPromo())) +print(Order(ann, cart, FidelityPromo())) +banana_cart = [LineItem('banana', 30, .5), LineItem('apple', 10, 1.5)] +print(Order(joe, banana_cart, BulkItemPromo())) # <6> + +long_order = [LineItem(str(item_code), 1, 1.0) for item_code in range(10)] +print(Order(joe, long_order, LargeOrderPromo())) +print(Order(joe, cart, LargeOrderPromo())) diff --git a/06-dp-1class-func/dp_func_2.py b/06-dp-1class-func/dp_func_2.py new file mode 100644 index 0000000..74b52e5 --- /dev/null +++ b/06-dp-1class-func/dp_func_2.py @@ -0,0 +1,19 @@ +from strategy_best import Customer, LineItem, Order, best_promo, fidelity_promo, bulk_item_promo, large_order_promo + +joe = Customer('John Doe', 0) # <1> +ann = Customer('Ann Smith', 1100) +cart = [LineItem('banana', 4, .5), # <2> + LineItem('apple', 10, 1.5), + LineItem('watermellon', 5, 5.0)] +print(Order(joe, cart, fidelity_promo)) +print(Order(ann, cart, fidelity_promo)) +banana_cart = [LineItem('banana', 30, .5), LineItem('apple', 10, 1.5)] +print(Order(joe, banana_cart, bulk_item_promo)) # <6> + +long_order = [LineItem(str(item_code), 1, 1.0) for item_code in range(10)] +print(Order(joe, long_order, large_order_promo)) +print(Order(joe, cart, large_order_promo)) + +print(Order(joe, long_order, best_promo)) +print(Order(joe, banana_cart, best_promo)) +print(Order(ann, cart, best_promo)) \ No newline at end of file diff --git a/06-dp-1class-func/dp_func_3.py b/06-dp-1class-func/dp_func_3.py new file mode 100644 index 0000000..51e5cec --- /dev/null +++ b/06-dp-1class-func/dp_func_3.py @@ -0,0 +1,19 @@ +from strategy_best2 import Customer, LineItem, Order, best_promo, fidelity_promo, bulk_item_promo, large_order_promo + +joe = Customer('John Doe', 0) # <1> +ann = Customer('Ann Smith', 1100) +cart = [LineItem('banana', 4, .5), # <2> + LineItem('apple', 10, 1.5), + LineItem('watermellon', 5, 5.0)] +print(Order(joe, cart, fidelity_promo)) +print(Order(ann, cart, fidelity_promo)) +banana_cart = [LineItem('banana', 30, .5), LineItem('apple', 10, 1.5)] +print(Order(joe, banana_cart, bulk_item_promo)) # <6> + +long_order = [LineItem(str(item_code), 1, 1.0) for item_code in range(10)] +print(Order(joe, long_order, large_order_promo)) +print(Order(joe, cart, large_order_promo)) + +print(Order(joe, long_order, best_promo)) +print(Order(joe, banana_cart, best_promo)) +print(Order(ann, cart, best_promo)) \ No newline at end of file diff --git a/06-dp-1class-func/dp_func_4.py b/06-dp-1class-func/dp_func_4.py new file mode 100644 index 0000000..2837f53 --- /dev/null +++ b/06-dp-1class-func/dp_func_4.py @@ -0,0 +1,15 @@ +from strategy_best3 import Customer, LineItem, Order, best_promo + +joe = Customer('John Doe', 0) # <1> +ann = Customer('Ann Smith', 1100) +cart = [LineItem('banana', 4, .5), # <2> + LineItem('apple', 10, 1.5), + LineItem('watermellon', 5, 5.0)] + +banana_cart = [LineItem('banana', 30, .5), LineItem('apple', 10, 1.5)] + +long_order = [LineItem(str(item_code), 1, 1.0) for item_code in range(10)] + +print(Order(joe, long_order, best_promo)) +print(Order(joe, banana_cart, best_promo)) +print(Order(ann, cart, best_promo)) \ No newline at end of file diff --git a/06-dp-1class-func/oper_1.py b/06-dp-1class-func/oper_1.py new file mode 100644 index 0000000..8f09bb6 --- /dev/null +++ b/06-dp-1class-func/oper_1.py @@ -0,0 +1,14 @@ +from operator import itemgetter + +def sort_by_key(sequence, key): + return sorted(sequence, key=key) + +if __name__ == "__main__": + from multiprocessing import Pool + + items = [([(1,2),(4,1)], itemgetter(1)), + ([(5,3),(2,7)], itemgetter(0))] + + with Pool(5) as p: + result = p.starmap(sort_by_key, items) + print(result) \ No newline at end of file diff --git a/07-closure-deco/average_2.py b/07-closure-deco/average_2.py new file mode 100644 index 0000000..7ffa760 --- /dev/null +++ b/07-closure-deco/average_2.py @@ -0,0 +1,18 @@ + + +def make_averager(): + count = 0 + sum = 0 + + def averager(new_value): + nonlocal count, sum + count += 1 + sum += new_value + return sum/count + + return averager + +avg = make_averager() +print(avg(10)) +print(avg(11)) +print(avg(12)) \ No newline at end of file diff --git a/07-closure-deco/average_driver.py b/07-closure-deco/average_driver.py new file mode 100644 index 0000000..8940a64 --- /dev/null +++ b/07-closure-deco/average_driver.py @@ -0,0 +1,10 @@ +from average import make_averager + +avg = make_averager() +print(avg(10)) +print(avg(11)) +print(avg(12)) +print(avg.__code__.co_varnames) +print(avg.__code__.co_freevars) +print(avg.__closure__) # doctest: +ELLIPSIS +print(avg.__closure__[0].cell_contents) diff --git a/07-closure-deco/clockdeco_2.py b/07-closure-deco/clockdeco_2.py new file mode 100644 index 0000000..4fc4d89 --- /dev/null +++ b/07-closure-deco/clockdeco_2.py @@ -0,0 +1,36 @@ +# clockdeco.py + +import time +import functools + +def clock(func): + @functools.wraps(func) + def clocked(*args, **kwargs): + t0 = time.time() + result = func(*args, **kwargs) + elapsed = time.time() - t0 + name = func.__name__ + arg_lst = [] + if args: + arg_lst.append(', '.join(repr(arg) for arg in args)) + if kwargs: + pairs = ['%s=%r' % (k,w) for k, w in sorted(kwargs.items())] + arg_lst.append(', '.join(pairs)) + arg_str = ', '.join(arg_lst) + print('[%0.8fs] %s(%s) -> %r ' % (elapsed, name, arg_str, result)) + return result + return clocked + +@clock +def snooze(seconds): + time.sleep(seconds) + +@clock +def factorial(n): + return 1 if n < 2 else n*factorial(n-1) + +if __name__=='__main__': + print('*' * 40, 'Calling snooze(.123)') + snooze(.123) + print('*' * 40, 'Calling factorial(6)') + print('6! =', factorial(6)) diff --git a/07-closure-deco/clockdeco_cls.py b/07-closure-deco/clockdeco_cls.py index 5b19119..cff8681 100644 --- a/07-closure-deco/clockdeco_cls.py +++ b/07-closure-deco/clockdeco_cls.py @@ -1,5 +1,6 @@ # clockdeco_param.py +from clockdeco import clock """ >>> snooze(.1) # doctest: +ELLIPSIS [0.101...s] snooze(0.1) -> None @@ -39,5 +40,10 @@ def snooze(seconds): for i in range(3): snooze(.123) + print(snooze(.1)) # doctest: +ELLIPSIS + print(clock('{name}: {elapsed}')(time.sleep)(.2) ) # doctest: +ELLIPSIS + print(clock('{name}({args}) dt={elapsed:0.3f}s')(time.sleep)(.2)) # END CLOCKDECO_CLS +##""" + diff --git a/07-closure-deco/fb_d1.py b/07-closure-deco/fb_d1.py new file mode 100644 index 0000000..ec38f67 --- /dev/null +++ b/07-closure-deco/fb_d1.py @@ -0,0 +1,15 @@ +from strategy_best4 import Customer, LineItem, Order, best_promo + +joe = Customer('John Doe', 0) # <1> +ann = Customer('Ann Smith', 1100) +cart = [LineItem('banana', 4, .5), # <2> + LineItem('apple', 10, 1.5), + LineItem('watermellon', 5, 5.0)] + +banana_cart = [LineItem('banana', 30, .5), LineItem('apple', 10, 1.5)] + +long_order = [LineItem(str(item_code), 1, 1.0) for item_code in range(10)] + +print(Order(joe, long_order, best_promo)) +print(Order(joe, banana_cart, best_promo)) +print(Order(ann, cart, best_promo)) \ No newline at end of file diff --git a/07-closure-deco/generic.py b/07-closure-deco/generic.py index f9ad7e0..f1bc61e 100644 --- a/07-closure-deco/generic.py +++ b/07-closure-deco/generic.py @@ -49,4 +49,8 @@ def _(seq): return '
    \n
  • ' + inner + '
  • \n
' # END HTMLIZE - +print(htmlize({1, 2, 3})) +print(htmlize(abs)) +print(htmlize('Heimlich & Co.\n- a game')) +print(htmlize(42)) # <3> +print(htmlize(['alpha', 66, {3, 2, 1}])) # <4> diff --git a/07-closure-deco/global_x_local.py b/07-closure-deco/global_x_local.py new file mode 100644 index 0000000..0504943 --- /dev/null +++ b/07-closure-deco/global_x_local.py @@ -0,0 +1,33 @@ +def f1(a): + print(a) + print(b) +# f1(3) +b = 6 +f1(3) + + +def f2(a): + print(a) + print(b) + b = 9 + + +def f3(a): + global b + print(a) + print(b) + b = 9 + +f3(6) + +def f4(b): + def f5(a): + nonlocal b + print(a) + print(b) + b = 7 + return f5 + +... +f5b = f4(8) +f5b(2) \ No newline at end of file diff --git a/08-obj-ref/bus.py b/08-obj-ref/bus.py index fba657c..5f16059 100644 --- a/08-obj-ref/bus.py +++ b/08-obj-ref/bus.py @@ -1,16 +1,4 @@ -""" ->>> import copy ->>> bus1 = Bus(['Alice', 'Bill', 'Claire', 'David']) ->>> bus2 = copy.copy(bus1) ->>> bus3 = copy.deepcopy(bus1) ->>> bus1.drop('Bill') ->>> bus2.passengers -['Alice', 'Claire', 'David'] ->>> bus3.passengers -['Alice', 'Bill', 'Claire', 'David'] - -""" # BEGIN BUS_CLASS class Bus: @@ -27,3 +15,12 @@ def pick(self, name): def drop(self, name): self.passengers.remove(name) # END BUS_CLASS + + +import copy +bus1 = Bus(['Alice', 'Bill', 'Claire', 'David']) +bus2 = copy.copy(bus1) +bus3 = copy.deepcopy(bus1) +bus1.drop('Bill') +print(bus2.passengers) +print(bus3.passengers) \ No newline at end of file diff --git a/08-obj-ref/cheese.py b/08-obj-ref/cheese.py index 48a899c..0402eb6 100644 --- a/08-obj-ref/cheese.py +++ b/08-obj-ref/cheese.py @@ -1,21 +1,3 @@ -""" ->>> import weakref ->>> stock = weakref.WeakValueDictionary() ->>> catalog = [Cheese('Red Leicester'), Cheese('Tilsit'), -... Cheese('Brie'), Cheese('Parmesan')] -... ->>> for cheese in catalog: -... stock[cheese.kind] = cheese -... ->>> sorted(stock.keys()) -['Brie', 'Parmesan', 'Red Leicester', 'Tilsit'] ->>> del catalog ->>> sorted(stock.keys()) -['Parmesan'] ->>> del cheese ->>> sorted(stock.keys()) -[] -""" # BEGIN CHEESE_CLASS class Cheese: @@ -26,3 +8,16 @@ def __init__(self, kind): def __repr__(self): return 'Cheese(%r)' % self.kind # END CHEESE_CLASS + + +import weakref +stock = weakref.WeakValueDictionary() +catalog = [Cheese('Red Leicester'), Cheese('Tilsit'), + Cheese('Brie'), Cheese('Parmesan')] +for cheese in catalog: + stock[cheese.kind] = cheese +print(sorted(stock.keys())) +del catalog +print(sorted(stock.keys())) +del cheese +print(sorted(stock.keys())) diff --git a/08-obj-ref/haunted_bus.py b/08-obj-ref/haunted_bus.py index a38bab1..85fca73 100644 --- a/08-obj-ref/haunted_bus.py +++ b/08-obj-ref/haunted_bus.py @@ -1,35 +1,4 @@ -""" ->>> bus1 = HauntedBus(['Alice', 'Bill']) ->>> bus1.passengers -['Alice', 'Bill'] ->>> bus1.pick('Charlie') ->>> bus1.drop('Alice') ->>> bus1.passengers -['Bill', 'Charlie'] ->>> bus2 = HauntedBus() ->>> bus2.pick('Carrie') ->>> bus2.passengers -['Carrie'] ->>> bus3 = HauntedBus() ->>> bus3.passengers -['Carrie'] ->>> bus3.pick('Dave') ->>> bus2.passengers -['Carrie', 'Dave'] ->>> bus2.passengers is bus3.passengers -True ->>> bus1.passengers -['Bill', 'Charlie'] - - ->>> dir(HauntedBus.__init__) # doctest: +ELLIPSIS -['__annotations__', '__call__', ..., '__defaults__', ...] ->>> HauntedBus.__init__.__defaults__ -(['Carrie', 'Dave'],) ->>> HauntedBus.__init__.__defaults__[0] is bus2.passengers -True - -""" + # BEGIN HAUNTED_BUS_CLASS class HauntedBus: @@ -45,3 +14,24 @@ def drop(self, name): self.passengers.remove(name) # END HAUNTED_BUS_CLASS +bus1 = HauntedBus(['Alice', 'Bill']) +print(bus1.passengers) +bus1.pick('Charlie') +bus1.drop('Alice') +print(bus1.passengers) +bus2 = HauntedBus() +bus2.pick('Carrie') +print(bus2.passengers) + +bus3 = HauntedBus() +print(bus3.passengers) + +bus3.pick('Dave') +print(bus2.passengers) +bus2.passengers is bus3.passengers +print(bus1.passengers) + + +dir(HauntedBus.__init__) # doctest: +ELLIPSIS +HauntedBus.__init__.__defaults__ +HauntedBus.__init__.__defaults__[0] is bus2.passengers diff --git a/08-obj-ref/twilight_bus.py b/08-obj-ref/twilight_bus.py index 2b20d5e..ab44423 100644 --- a/08-obj-ref/twilight_bus.py +++ b/08-obj-ref/twilight_bus.py @@ -1,11 +1,4 @@ -""" ->>> basketball_team = ['Sue', 'Tina', 'Maya', 'Diana', 'Pat'] ->>> bus = TwilightBus(basketball_team) ->>> bus.drop('Tina') ->>> bus.drop('Pat') ->>> basketball_team -['Sue', 'Maya', 'Diana'] -""" + # BEGIN TWILIGHT_BUS_CLASS class TwilightBus: @@ -24,3 +17,9 @@ def drop(self, name): self.passengers.remove(name) # <3> # END TWILIGHT_BUS_CLASS + +basketball_team = ['Sue', 'Tina', 'Maya', 'Diana', 'Pat'] +bus = TwilightBus(basketball_team) +bus.drop('Tina') +bus.drop('Pat') +print(basketball_team) diff --git a/09-pythonic-obj/vector2d_v0.py b/09-pythonic-obj/vector2d_v0.py index 5024f0f..d0342c8 100644 --- a/09-pythonic-obj/vector2d_v0.py +++ b/09-pythonic-obj/vector2d_v0.py @@ -1,31 +1,4 @@ -""" -A 2-dimensional vector class -# BEGIN VECTOR2D_V0_DEMO - - >>> v1 = Vector2d(3, 4) - >>> print(v1.x, v1.y) # <1> - 3.0 4.0 - >>> x, y = v1 # <2> - >>> x, y - (3.0, 4.0) - >>> v1 # <3> - Vector2d(3.0, 4.0) - >>> v1_clone = eval(repr(v1)) # <4> - >>> v1 == v1_clone # <5> - True - >>> print(v1) # <6> - (3.0, 4.0) - >>> octets = bytes(v1) # <7> - >>> octets - b'd\\x00\\x00\\x00\\x00\\x00\\x00\\x08@\\x00\\x00\\x00\\x00\\x00\\x00\\x10@' - >>> abs(v1) # <8> - 5.0 - >>> bool(v1), bool(Vector2d(0, 0)) # <9> - (True, False) - -# END VECTOR2D_V0_DEMO -""" # BEGIN VECTOR2D_V0 from array import array @@ -62,3 +35,19 @@ def __abs__(self): def __bool__(self): return bool(abs(self)) # <10> # END VECTOR2D_V0 + + +v1 = Vector2d(3, 4) +print(v1.x, v1.y) # <1> +x, y = v1 # <2> +print(x, y) +print(v1) +v1 = Vector2d(3.0, 4.0) +v1_clone = eval(repr(v1)) # <4> +v1 == v1_clone # <5> +print(v1) +octets = bytes(v1) # <7> +print(octets) +print(abs(v1)) +print(bool(v1), bool(Vector2d(0, 0))) # <9> + diff --git a/09-pythonic-obj/vector2d_v1.py b/09-pythonic-obj/vector2d_v1.py index 6484efd..6ffda26 100644 --- a/09-pythonic-obj/vector2d_v1.py +++ b/09-pythonic-obj/vector2d_v1.py @@ -74,3 +74,18 @@ def frombytes(cls, octets): # <2> memv = memoryview(octets[1:]).cast(typecode) # <4> return cls(*memv) # <5> # END VECTOR2D_V1 + +v1 = Vector2d(3, 4) +print(v1.x, v1.y) +x, y = v1 +print(v1) +v1_clone = eval(repr(v1)) +print(v1 == v1_clone) +print(v1) +octets = bytes(v1) +print(octets) +print(abs(v1)) +print(bool(v1), bool(Vector2d(0, 0))) +v1_clone = Vector2d.frombytes(bytes(v1)) +print(v1_clone) +print(v1 == v1_clone) diff --git a/09-pythonic-obj/vector2d_v2.py b/09-pythonic-obj/vector2d_v2.py index 2a9dcf5..7e24476 100644 --- a/09-pythonic-obj/vector2d_v2.py +++ b/09-pythonic-obj/vector2d_v2.py @@ -121,3 +121,56 @@ def frombytes(cls, octets): memv = memoryview(octets[1:]).cast(typecode) return cls(*memv) # END VECTOR2D_V2 + + +v1 = Vector2d(3, 4) +print(v1.x, v1.y) +x, y = v1 +print(v1) +v1_clone = eval(repr(v1)) +print(v1) +octets = bytes(v1) +print(octets) + +print(abs(v1)) +print(bool(v1), bool(Vector2d(0, 0))) +v1_clone = Vector2d.frombytes(bytes(v1)) + >>> v1_clone + Vector2d(3.0, 4.0) + >>> v1 == v1_clone + True + + +Tests of ``format()`` with Cartesian coordinates: + + >>> format(v1) + '(3.0, 4.0)' + >>> format(v1, '.2f') + '(3.00, 4.00)' + >>> format(v1, '.3e') + '(3.000e+00, 4.000e+00)' + + +Tests of the ``angle`` method:: + + >>> Vector2d(0, 0).angle() + 0.0 + >>> Vector2d(1, 0).angle() + 0.0 + >>> epsilon = 10**-8 + >>> abs(Vector2d(0, 1).angle() - math.pi/2) < epsilon + True + >>> abs(Vector2d(1, 1).angle() - math.pi/4) < epsilon + True + + +Tests of ``format()`` with polar coordinates: + + >>> format(Vector2d(1, 1), 'p') # doctest:+ELLIPSIS + '<1.414213..., 0.785398...>' + >>> format(Vector2d(1, 1), '.3ep') + '<1.414e+00, 7.854e-01>' + >>> format(Vector2d(1, 1), '0.5fp') + '<1.41421, 0.78540>' + +""" diff --git a/14-it-generator/aritprog_v1.py b/14-it-generator/aritprog_v1.py index 6019d14..59de2af 100644 --- a/14-it-generator/aritprog_v1.py +++ b/14-it-generator/aritprog_v1.py @@ -19,7 +19,7 @@ >>> from decimal import Decimal >>> ap = ArithmeticProgression(0, Decimal('.1'), .3) >>> list(ap) - [Decimal('0.0'), Decimal('0.1'), Decimal('0.2')] + [Decimal('0'), Decimal('0.1'), Decimal('0.2')] # END ARITPROG_CLASS_DEMO """ diff --git a/14-it-generator/aritprog_v2.py b/14-it-generator/aritprog_v2.py index 03e42a4..4466f8a 100644 --- a/14-it-generator/aritprog_v2.py +++ b/14-it-generator/aritprog_v2.py @@ -14,7 +14,7 @@ >>> from decimal import Decimal >>> ap = aritprog_gen(0, Decimal('.1'), .3) >>> list(ap) - [Decimal('0.0'), Decimal('0.1'), Decimal('0.2')] + [Decimal('0'), Decimal('0.1'), Decimal('0.2')] """ diff --git a/15-context-mngr/mirror.py b/15-context-mngr/mirror.py index 67782ff..c23770c 100644 --- a/15-context-mngr/mirror.py +++ b/15-context-mngr/mirror.py @@ -8,10 +8,10 @@ >>> from mirror import LookingGlass >>> with LookingGlass() as what: # <1> - ... print('Alice, Kitty and Snowdrop') # <2> + ... print('Alice, Kitty and Snowdrop') ... print(what) ... - pordwonS dna yttiK ,ecilA # <3> + pordwonS dna yttiK ,ecilA YKCOWREBBAJ >>> what # <4> 'JABBERWOCKY' diff --git a/15-context-mngr/mirror_gen.py b/15-context-mngr/mirror_gen.py index 379e8ab..cd2b103 100644 --- a/15-context-mngr/mirror_gen.py +++ b/15-context-mngr/mirror_gen.py @@ -28,7 +28,7 @@ >>> manager # doctest: +ELLIPSIS >>> monster = manager.__enter__() # <2> - >>> monster == 'JABBERWOCKY' # <3> + >>> monster == 'JABBERWOCKY' eurT >>> monster 'YKCOWREBBAJ' diff --git a/15-context-mngr/mirror_gen_exc.py b/15-context-mngr/mirror_gen_exc.py index 9dcc560..5273fc4 100644 --- a/15-context-mngr/mirror_gen_exc.py +++ b/15-context-mngr/mirror_gen_exc.py @@ -35,6 +35,7 @@ >>> manager # doctest: +ELLIPSIS >...x0 ta tcejbo reganaMtxetnoCrotareneG_.biltxetnoc< >>> manager.__exit__(None, None, None) # <4> + False >>> monster 'JABBERWOCKY'