{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Iterator Pattern\n", "1. Standard way to iterate over a collection\n", "1. Also Known as **Cursor Pattern**" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Collection of Employees" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Using Collections" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": true }, "outputs": [], "source": [ "from collections import Iterable, Iterator" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class EmployeesIterator(Iterator):\n", " def __init__(self, employees, head_count):\n", " self._employees = employees\n", " self._head_count = head_count\n", " self._emp_id = 0\n", " \n", " def __iter__(self):\n", " return self\n", " \n", " def __next__(self):\n", " if self._emp_id < self._head_count:\n", " self._emp_id += 1\n", " return self._employees[self._emp_id]\n", " else:\n", " raise StopIteration" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Employees(Iterable):\n", " _employees = {}\n", " _head_count = 0\n", " _emp_id = 0\n", " \n", " def add_employee(self, emp_id, employee):\n", " self._head_count += 1\n", " self._emp_id = emp_id\n", " self._employees[self._emp_id] = employee\n", " \n", " def __iter__(self):\n", " return EmployeesIterator(self._employees, self._head_count)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": true }, "outputs": [], "source": [ "test_employees = ['Ashutosh', 'Bipender', 'Sameer', 'Abhijit']\n", "\n", "employees = Employees()\n", "\n", "for i, emp in enumerate(test_employees):\n", " employees.add_employee(i + 1, emp)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ashutosh\n", "Bipender\n", "Sameer\n", "Abhijit\n" ] } ], "source": [ "for e in employees:\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using Generators" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": true }, "outputs": [], "source": [ "class Employees(Iterable):\n", " _employees = {}\n", " _head_count = 0\n", " _emp_id = 0\n", " \n", " def add_employee(self, emp_id, employee):\n", " self._head_count += 1\n", " self._emp_id = emp_id\n", " self._employees[self._emp_id] = employee\n", " \n", " def __iter__(self): # Or - return (e for e in self._employees.values())\n", " for i in range(self._head_count):\n", " yield self._employees[i + 1]" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": true }, "outputs": [], "source": [ "employees = Employees()\n", "\n", "for i, emp in enumerate(test_employees):\n", " employees.add_employee(i + 1, emp)" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\"Ashutosh\"\n", "\"Bipender\"\n", "\"Sameer\"\n", "\"Abhijit\"\n" ] } ], "source": [ "for e in employees:\n", " print(f'\"{e}\"')" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.3" } }, "nbformat": 4, "nbformat_minor": 2 }