From a3d3368d9f024052632dc87b5d52e26a223c7869 Mon Sep 17 00:00:00 2001 From: Kyle K Date: Sat, 1 Apr 2017 03:34:41 -0500 Subject: interator / generators exmaples --- .gitignore | 1 + generators.py | 34 ++++++++++++++++++++++++++++++++++ iterator.py | 26 ++++++++++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 .gitignore create mode 100644 generators.py create mode 100644 iterator.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ diff --git a/generators.py b/generators.py new file mode 100644 index 0000000..cdc0597 --- /dev/null +++ b/generators.py @@ -0,0 +1,34 @@ + +# here is a simple generator +# a 'yield' returns an expression which then gets invoked in for loop, a num by itself is an expression +def gen1(): + yield 1 + yield 2 + yield 3 # at this point python's list implemention will raise StopIteration since were at last yield + +a = [i for i in gen1()] +print(a) + + +# following example depicts how Comprehensions are syntactically almost the same except the use of () instead of [] + +gen2 = ("{0} is even".format(i) for i in range(0, 10) if i % 2 == 0) +print(gen2.__next__()) # get a value +print(list(gen2)) # loop till the end +#print(gen2.__next__()) # this would error, generator can only be looped once + +# output +# +# 0 is even +# ['2 is even', '4 is even', '6 is even', '8 is even'] + + + +# here is a Generator version of string reversal from interator.py + +def reverseString2(data): + for index in range(len(data) - 1, -1, -1): + yield data[index] + +for c in reverseString2('barfoo'): + print(c) diff --git a/iterator.py b/iterator.py new file mode 100644 index 0000000..2b1e14e --- /dev/null +++ b/iterator.py @@ -0,0 +1,26 @@ +# this class implements an iterator +# python needs to be told when to stop iterating, this is done by raising StopIteration exception + +class ReverseString(): + def __init__(self, data): + self.data = data + self.index = len(data) + + def __iter__(self): + return self + + def __next__(self): + if self.index == 0: + raise StopIteration + self.index -= 1 + return self.data[self.index] + + +def main(): + foo = ReverseString('foobar') + for c in foo: + print(c) + + +if __name__ == "__main__": + main() -- cgit v1.2.3