From a2d8a98d7f6eb4dabeea5f7d37e37bb6a2ca554c Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 26 Feb 2019 22:37:33 +0300 Subject: [PATCH 01/14] Add files via upload --- RangeEnhancedIterator_Generator.py | 90 ++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100644 RangeEnhancedIterator_Generator.py diff --git a/RangeEnhancedIterator_Generator.py b/RangeEnhancedIterator_Generator.py new file mode 100644 index 0000000..33fb4e5 --- /dev/null +++ b/RangeEnhancedIterator_Generator.py @@ -0,0 +1,90 @@ +class IteratorEnhancedRange: + + def __init__(self, *args): + #Arguments are: start (default = 0), end (no default, required argument), step (default = 1) + self.args = args + for arg in args: + if not (type(arg) == int or type(arg) == float): + raise Exception("Arguments must be numeric") + if len(args) == 1: + self.start = 0 + self.end = self.args[0] + self.step = 1 + elif len(args) == 2: + self.start = self.args[0] + self.end = self.args[1] + self.step = 1 + elif len (args) == 3: + if self.args[2] == 0: + raise Exception("Unable to range with step = 0") + self.start = self.args[0] + self.end = self.args[1] + self.step = self.args[2] + else: + raise Exception("IteratorEnhancedRange requires at least one, but no more than three arguments") + self.startediter = False + + def __iter__(self): + return self + + def __next__(self): + if (self.step/abs(self.step))*self.start >= (self.step/abs(self.step))*self.end: + raise StopIteration + else: + if self.startediter is False: + self.startediter = True + return self.start + else: + if (self.step/abs(self.step))*(self.start + self.step) >= (self.step/abs(self.step))*self.end: + raise StopIteration + else: + self.start += self.step + return self.start + + def __call__(self): + return self + + +class GeneratorEnhancedRange: + + def __init__(self, *args): + #Arguments are: start (default = 0), end (no default, required argument), step (default = 1) + self.args = args + for arg in args: + if not (type(arg) == int or type(arg) == float): + raise Exception("Arguments must be numeric") + if len(args) == 1: + self.start = 0 + self.end = self.args[0] + self.step = 1 + elif len(args) == 2: + self.start = self.args[0] + self.end = self.args[1] + self.step = 1 + elif len (args) == 3: + if self.args[2] == 0: + raise Exception("Unable to range with step = 0") + self.start = self.args[0] + self.end = self.args[1] + self.step = self.args[2] + else: + raise Exception("GeneratorEnhancedRange requires at least one, but no more than three arguments") + self.startediter = False + + def __iter__(self): + return GeneratorEnhancedRange.gener(self) + + def gener(self): + if (self.step/abs(self.step))*self.start < (self.step/abs(self.step))*self.end: + if self.startediter is False: + self.startediter = True + yield self.start + else: + while (self.step/abs(self.step))*(self.start + self.step) < (self.step/abs(self.step))*self.end: + self.start += self.step + yield self.start + + def __call__(self): + return self + + From 68aa9acb92edd3846a173f8b24fa0e4a0ec105de Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 26 Feb 2019 23:10:06 +0300 Subject: [PATCH 02/14] Update README.md --- README.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 1422e2b..e50bcd5 100644 --- a/README.md +++ b/README.md @@ -1 +1,8 @@ -# PythonHW_Iterator_Generator \ No newline at end of file +### PythonHW_Iterator_Generator + +#### Contains Python 3 code for classes IteratorEnhancedRange and GeneratorEnhancedRange. +#### Both work similar to standard Python range function, except they are able work with float arguments +#### Both classes require at least one argument. All arguments are positional: +#### start (default = 0), end (no default, required argument), step (default = 1) +#### One specified argument (x) is interpreted as (0, x, 1) +#### Two arguments are interpreted as start and end, respectively From b095ad326d8cdeef24810863a44de6de2fda0c8c Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 26 Feb 2019 23:10:56 +0300 Subject: [PATCH 03/14] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e50bcd5..d6f91a1 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ ### PythonHW_Iterator_Generator #### Contains Python 3 code for classes IteratorEnhancedRange and GeneratorEnhancedRange. -#### Both work similar to standard Python range function, except they are able work with float arguments +#### Both work similar to standard Python range(int) function, except they are able work with float arguments #### Both classes require at least one argument. All arguments are positional: #### start (default = 0), end (no default, required argument), step (default = 1) #### One specified argument (x) is interpreted as (0, x, 1) From b0c5bd2c00fb07920a3f2425194b6bbcdc17efac Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 26 Feb 2019 23:12:34 +0300 Subject: [PATCH 04/14] Create __init__.py --- __init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 __init__.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ + From a0dd06da5ba750b69e22f562379300c26f7acad3 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 26 Feb 2019 23:13:12 +0300 Subject: [PATCH 05/14] Create __init__.py --- tests/__init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 tests/__init__.py diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1 @@ + From d539f597e08e147dcfa52c54dd9c33de30767e97 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Wed, 27 Feb 2019 00:03:30 +0300 Subject: [PATCH 06/14] Add files via upload --- tests/Tests_RangeEnhancedGenerator.py | 48 +++++++++++++++++++++++++++ tests/Tests_RangeEnhancedIterator.py | 44 ++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 tests/Tests_RangeEnhancedGenerator.py create mode 100644 tests/Tests_RangeEnhancedIterator.py diff --git a/tests/Tests_RangeEnhancedGenerator.py b/tests/Tests_RangeEnhancedGenerator.py new file mode 100644 index 0000000..4da4b2c --- /dev/null +++ b/tests/Tests_RangeEnhancedGenerator.py @@ -0,0 +1,48 @@ + +# coding: utf-8 + +# In[ ]: + + +import unittest +import RangeEnhancedIterator_Generator +from RangeEnhancedIterator_Generator import GeneratorEnhancedRange + + +class GeneratorTests(unittest.TestCase): + + def setUp(self): + print ('Setup called') + + def test_on_range_w_one_arg(self): + example = GeneratorEnhancedRange(2) + s = [] + for i in range(10): + for i in example(): + s.append(i) + self.assertEqual(s, [0, 1]) + + def test_on_range_w_two_args(self): + example = GeneratorEnhancedRange(2,5) + s = [] + for i in range(10): + for i in example(): + s.append(i) + self.assertEqual(s, [2, 3, 4]) + + def test_on_range_w_three_args(self): + example = GeneratorEnhancedRange(2, 7, 2) + s = [] + for i in range(10): + for i in example(): + s.append(i) + self.assertEqual(s, [2, 4, 6]) + + def tearDown(self): + print ('Tear down called') + + +if __name__ == '__main__': + unittest.main() + + diff --git a/tests/Tests_RangeEnhancedIterator.py b/tests/Tests_RangeEnhancedIterator.py new file mode 100644 index 0000000..fa1cc3a --- /dev/null +++ b/tests/Tests_RangeEnhancedIterator.py @@ -0,0 +1,44 @@ + +# coding: utf-8 + +# In[ ]: + + +import unittest +import RangeEnhancedIterator_Generator +from RangeEnhancedIterator_Generator import IteratorEnhancedRange + + +class IteratorTests(unittest.TestCase): + + def setUp(self): + print ('Setup called') + + def test_on_range_w_one_arg(self): + example = IteratorEnhancedRange(2) + self.assertEqual(next(example), 0) + self.assertEqual(next(example), 1) + self.assertRaises(StopIteration, next, example) + + def test_on_range_w_two_args(self): + example = IteratorEnhancedRange(2,5) + self.assertEqual(next(example), 2) + self.assertEqual(next(example), 3) + self.assertEqual(next(example), 4) + self.assertRaises(StopIteration, next, example) + + def test_on_range_w_three_args(self): + example = IteratorEnhancedRange(2, 7, 2) + self.assertEqual(next(example), 2) + self.assertEqual(next(example), 4) + self.assertEqual(next(example), 6) + self.assertRaises(StopIteration, next, example) + + def tearDown(self): + print ('Tear down called') + + +if __name__ == '__main__': + unittest.main() + + From 45c890a3e156c1f5c445bcd159effb4e59350371 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Sun, 10 Mar 2019 21:40:53 +0300 Subject: [PATCH 07/14] Update README.md --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d6f91a1..34e43fe 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ ### PythonHW_Iterator_Generator -#### Contains Python 3 code for classes IteratorEnhancedRange and GeneratorEnhancedRange. -#### Both work similar to standard Python range(int) function, except they are able work with float arguments -#### Both classes require at least one argument. All arguments are positional: -#### start (default = 0), end (no default, required argument), step (default = 1) -#### One specified argument (x) is interpreted as (0, x, 1) -#### Two arguments are interpreted as start and end, respectively +Contains Python 3 code for classes IteratorEnhancedRange and GeneratorEnhancedRange. + +Both work similar to standard Python range(int) function, except they are able work with float arguments. +Both classes require at least one argument. All arguments are positional: +start (default = 0), end (no default, required argument), step (default = 1). +One specified argument (x) is interpreted as (0, x, 1). +Two arguments are interpreted as start and end, respectively. From 36ab96632c50ec70c58f0e020525ea8ee14f34e3 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 12 Mar 2019 21:06:34 +0300 Subject: [PATCH 08/14] Removed bool flag and changed init for generator --- RangeEnhancedIterator_Generator.py | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/RangeEnhancedIterator_Generator.py b/RangeEnhancedIterator_Generator.py index 33fb4e5..a12f303 100644 --- a/RangeEnhancedIterator_Generator.py +++ b/RangeEnhancedIterator_Generator.py @@ -23,10 +23,10 @@ def __init__(self, *args): else: raise Exception("IteratorEnhancedRange requires at least one, but no more than three arguments") self.startediter = False - + def __iter__(self): return self - + def __next__(self): if (self.step/abs(self.step))*self.start >= (self.step/abs(self.step))*self.end: raise StopIteration @@ -40,7 +40,7 @@ def __next__(self): else: self.start += self.step return self.start - + def __call__(self): return self @@ -54,37 +54,31 @@ def __init__(self, *args): if not (type(arg) == int or type(arg) == float): raise Exception("Arguments must be numeric") if len(args) == 1: - self.start = 0 + self.start = - 1 self.end = self.args[0] self.step = 1 elif len(args) == 2: - self.start = self.args[0] + self.start = self.args[0] - 1 self.end = self.args[1] self.step = 1 elif len (args) == 3: if self.args[2] == 0: raise Exception("Unable to range with step = 0") - self.start = self.args[0] + self.start = self.args[0] - self.args[2] self.end = self.args[1] self.step = self.args[2] else: raise Exception("GeneratorEnhancedRange requires at least one, but no more than three arguments") self.startediter = False - + def __iter__(self): return GeneratorEnhancedRange.gener(self) - + def gener(self): - if (self.step/abs(self.step))*self.start < (self.step/abs(self.step))*self.end: - if self.startediter is False: - self.startediter = True - yield self.start - else: - while (self.step/abs(self.step))*(self.start + self.step) < (self.step/abs(self.step))*self.end: - self.start += self.step - yield self.start - + while (self.step/abs(self.step))*(self.start + self.step) < (self.step/abs(self.step))*self.end: + self.start += self.step + yield self.start + def __call__(self): return self - From 4af24ca7868717211362a2a5d9e7ef33aab114a8 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 12 Mar 2019 21:14:48 +0300 Subject: [PATCH 09/14] Test changed according to Reviewer's comments --- tests/Tests_RangeEnhancedGenerator.py | 42 +++++---------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/tests/Tests_RangeEnhancedGenerator.py b/tests/Tests_RangeEnhancedGenerator.py index 4da4b2c..4af40af 100644 --- a/tests/Tests_RangeEnhancedGenerator.py +++ b/tests/Tests_RangeEnhancedGenerator.py @@ -1,48 +1,20 @@ - -# coding: utf-8 - -# In[ ]: - - import unittest -import RangeEnhancedIterator_Generator from RangeEnhancedIterator_Generator import GeneratorEnhancedRange class GeneratorTests(unittest.TestCase): - def setUp(self): - print ('Setup called') - def test_on_range_w_one_arg(self): - example = GeneratorEnhancedRange(2) - s = [] - for i in range(10): - for i in example(): - s.append(i) - self.assertEqual(s, [0, 1]) - + self.assertEqual([n for n in GeneratorEnhancedRange(2)], [0, 1]) + def test_on_range_w_two_args(self): - example = GeneratorEnhancedRange(2,5) - s = [] - for i in range(10): - for i in example(): - s.append(i) - self.assertEqual(s, [2, 3, 4]) - + self.assertEqual([n for n in GeneratorEnhancedRange(2, 5)], [2, 3, 4]) + def test_on_range_w_three_args(self): - example = GeneratorEnhancedRange(2, 7, 2) - s = [] - for i in range(10): - for i in example(): - s.append(i) - self.assertEqual(s, [2, 4, 6]) - - def tearDown(self): - print ('Tear down called') + self.assertEqual([n for n in GeneratorEnhancedRange(2, 7, 2)], [2, 4, 6]) if __name__ == '__main__': unittest.main() - - + + From 88873a6c3a598060a6d2ec85bdbcabfcff7ca828 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 12 Mar 2019 21:16:13 +0300 Subject: [PATCH 10/14] Removed Jupiter debris --- tests/Tests_RangeEnhancedIterator.py | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tests/Tests_RangeEnhancedIterator.py b/tests/Tests_RangeEnhancedIterator.py index fa1cc3a..51ae3b5 100644 --- a/tests/Tests_RangeEnhancedIterator.py +++ b/tests/Tests_RangeEnhancedIterator.py @@ -1,11 +1,4 @@ - -# coding: utf-8 - -# In[ ]: - - import unittest -import RangeEnhancedIterator_Generator from RangeEnhancedIterator_Generator import IteratorEnhancedRange From bad986b2ecf57aaa0ed282808d3398be38b1f3fd Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 12 Mar 2019 21:35:00 +0300 Subject: [PATCH 11/14] Minor style changes --- RangeEnhancedIterator_Generator.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/RangeEnhancedIterator_Generator.py b/RangeEnhancedIterator_Generator.py index a12f303..b933d50 100644 --- a/RangeEnhancedIterator_Generator.py +++ b/RangeEnhancedIterator_Generator.py @@ -14,7 +14,7 @@ def __init__(self, *args): self.start = self.args[0] self.end = self.args[1] self.step = 1 - elif len (args) == 3: + elif len(args) == 3: if self.args[2] == 0: raise Exception("Unable to range with step = 0") self.start = self.args[0] @@ -28,14 +28,14 @@ def __iter__(self): return self def __next__(self): - if (self.step/abs(self.step))*self.start >= (self.step/abs(self.step))*self.end: + if (self.step / abs(self.step)) * self.start >= (self.step / abs(self.step)) * self.end: raise StopIteration else: if self.startediter is False: self.startediter = True return self.start else: - if (self.step/abs(self.step))*(self.start + self.step) >= (self.step/abs(self.step))*self.end: + if (self.step / abs(self.step)) * (self.start + self.step) >= (self.step / abs(self.step)) * self.end: raise StopIteration else: self.start += self.step @@ -61,7 +61,7 @@ def __init__(self, *args): self.start = self.args[0] - 1 self.end = self.args[1] self.step = 1 - elif len (args) == 3: + elif len(args) == 3: if self.args[2] == 0: raise Exception("Unable to range with step = 0") self.start = self.args[0] - self.args[2] @@ -75,7 +75,7 @@ def __iter__(self): return GeneratorEnhancedRange.gener(self) def gener(self): - while (self.step/abs(self.step))*(self.start + self.step) < (self.step/abs(self.step))*self.end: + while (self.step / abs(self.step)) * (self.start + self.step) < (self.step / abs(self.step)) * self.end: self.start += self.step yield self.start From 02b0ed811df8601e408443c661830d62efbe4480 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Tue, 12 Mar 2019 21:36:17 +0300 Subject: [PATCH 12/14] Removed unnecessary code --- tests/Tests_RangeEnhancedIterator.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/tests/Tests_RangeEnhancedIterator.py b/tests/Tests_RangeEnhancedIterator.py index 51ae3b5..05907de 100644 --- a/tests/Tests_RangeEnhancedIterator.py +++ b/tests/Tests_RangeEnhancedIterator.py @@ -3,9 +3,6 @@ class IteratorTests(unittest.TestCase): - - def setUp(self): - print ('Setup called') def test_on_range_w_one_arg(self): example = IteratorEnhancedRange(2) @@ -27,9 +24,6 @@ def test_on_range_w_three_args(self): self.assertEqual(next(example), 6) self.assertRaises(StopIteration, next, example) - def tearDown(self): - print ('Tear down called') - if __name__ == '__main__': unittest.main() From cece13de2212381b989ccd2f3dacb8fffd5fddd0 Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Wed, 13 Mar 2019 15:56:29 +0300 Subject: [PATCH 13/14] Added additional tests --- tests/Tests_RangeEnhancedIterator.py | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/tests/Tests_RangeEnhancedIterator.py b/tests/Tests_RangeEnhancedIterator.py index 05907de..1a6e2d7 100644 --- a/tests/Tests_RangeEnhancedIterator.py +++ b/tests/Tests_RangeEnhancedIterator.py @@ -24,8 +24,26 @@ def test_on_range_w_three_args(self): self.assertEqual(next(example), 6) self.assertRaises(StopIteration, next, example) + def test_on_nonnumeric_args(self): + with self.assertRaises(Exception, msg = "Arguments must be numeric"): + example = IteratorEnhancedRange(5, "o", -1) + + def test_on_zero_step(self): + with self.assertRaises(Exception, msg = "Unable to range with step = 0"): + example = IteratorEnhancedRange(5, 6, 0) + + def test_on_wrong_number_of_args(self): + with self.assertRaises(Exception, + msg = "IteratorEnhancedRange requires at least one, but no more than three arguments"): + example = IteratorEnhancedRange() + with self.assertRaises(Exception, + msg = "IteratorEnhancedRange requires at least one, but no more than three arguments"): + example = IteratorEnhancedRange(2, 7, 2, 0) + + def tearDown(self): + print ('Tear down called') + if __name__ == '__main__': unittest.main() - From ffd96ece7811a7f7eb8b7bdfe8df4e8a4e56314c Mon Sep 17 00:00:00 2001 From: StudentMAGe <43290436+StudentMAGe@users.noreply.github.com> Date: Wed, 13 Mar 2019 16:01:49 +0300 Subject: [PATCH 14/14] Added several additional tests --- tests/Tests_RangeEnhancedGenerator.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/Tests_RangeEnhancedGenerator.py b/tests/Tests_RangeEnhancedGenerator.py index 4af40af..e24ebba 100644 --- a/tests/Tests_RangeEnhancedGenerator.py +++ b/tests/Tests_RangeEnhancedGenerator.py @@ -12,6 +12,22 @@ def test_on_range_w_two_args(self): def test_on_range_w_three_args(self): self.assertEqual([n for n in GeneratorEnhancedRange(2, 7, 2)], [2, 4, 6]) + + def test_on_nonnumeric_args(self): + with self.assertRaises(Exception, msg = "Arguments must be numeric"): + example = GeneratorEnhancedRange(5, "o", -1) + + def test_on_zero_step(self): + with self.assertRaises(Exception, msg = "Unable to range with step = 0"): + example = GeneratorEnhancedRange(5, 6, 0) + + def test_on_wrong_number_of_args(self): + with self.assertRaises(Exception, + msg = "GeneratorEnhancedRange requires at least one, but no more than three arguments"): + example = GeneratorEnhancedRange() + with self.assertRaises(Exception, + msg = "GeneratorEnhancedRange requires at least one, but no more than three arguments"): + example = GeneratorEnhancedRange(2, 7, 2, 0) if __name__ == '__main__':