.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "auto_examples/basics/iterator_vs_iterable.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note Click :ref:`here ` to download the full example code or to run this example in your browser via Binder .. rst-class:: sphx-glr-example-title .. _sphx_glr_auto_examples_basics_iterator_vs_iterable.py: ============================ 1.16 iterator vs iterable ============================ .. important:: This lesson is still under development. .. GENERATED FROM PYTHON SOURCE LINES 11-15 An ``iterable`` is any object which can be looped over. An ``iterable`` can be turned into ``iterator`` after applying ``iter`` function on it. An ``iterator`` is an object upon which ``next`` method can be applied. (Note: This is not a complete definition but without OOP, I suppose this will work) .. GENERATED FROM PYTHON SOURCE LINES 17-22 .. code-block:: default provinces = ["Sindh", "Balochistan", "Janubi Pubjab", "Hazara", "Pakhtunkhwa"] for prov in provinces: print(prov) .. rst-class:: sphx-glr-script-out .. code-block:: none Sindh Balochistan Janubi Pubjab Hazara Pakhtunkhwa .. GENERATED FROM PYTHON SOURCE LINES 23-27 .. code-block:: default # uncomment following line # next(provinces) # -> TypeError: 'list' object is not an iterator .. GENERATED FROM PYTHON SOURCE LINES 28-32 As the error explicitly states, ``provinces`` is not ``iterator``. so we can not apply ``next`` method on it. However, we can convert it into ``iterator`` after applying ``iter`` method on it. .. GENERATED FROM PYTHON SOURCE LINES 34-38 .. code-block:: default prov_iterator = iter(provinces) next(prov_iterator) .. rst-class:: sphx-glr-script-out .. code-block:: none 'Sindh' .. GENERATED FROM PYTHON SOURCE LINES 39-40 but what is ``next`` good for? .. GENERATED FROM PYTHON SOURCE LINES 42-48 .. code-block:: default # uncomment following 2 lines #for i in range(len(provinces)): # print(next(prov_iterator)) .. GENERATED FROM PYTHON SOURCE LINES 49-50 we get ``StopIteration`` exception after we have iterated through all the items of list .. GENERATED FROM PYTHON SOURCE LINES 52-53 Let's create the iterator again and run this code. .. GENERATED FROM PYTHON SOURCE LINES 55-60 .. code-block:: default prov_iterator = iter(provinces) for i in range(len(provinces)): print(next(prov_iterator)) .. rst-class:: sphx-glr-script-out .. code-block:: none Sindh Balochistan Janubi Pubjab Hazara Pakhtunkhwa .. GENERATED FROM PYTHON SOURCE LINES 61-62 Now try `next` on `prov_iterator` once again .. GENERATED FROM PYTHON SOURCE LINES 64-68 .. code-block:: default # uncomment following line # next(prov_iterator) .. GENERATED FROM PYTHON SOURCE LINES 69-71 So we can get next item from an iterator until it has returned all items from the iterable. .. GENERATED FROM PYTHON SOURCE LINES 73-76 .. code-block:: default print(type(prov_iterator)) .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 77-78 Let's create an iterator from `tuple` .. GENERATED FROM PYTHON SOURCE LINES 80-85 .. code-block:: default provinces = ("Sindh", "Balochistan", "Janubi Pubjab", "Hazara", "Pakhtunkhwa") prov_iterator = iter(provinces) print(type(prov_iterator)) .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 86-87 Do we need a better way to check if an object is iterator or not? .. GENERATED FROM PYTHON SOURCE LINES 89-92 ``isinstance`` ---------------- can also be used if some object is of a particular type or not. .. GENERATED FROM PYTHON SOURCE LINES 94-97 .. code-block:: default isinstance(2.5, float) .. rst-class:: sphx-glr-script-out .. code-block:: none True .. GENERATED FROM PYTHON SOURCE LINES 98-101 .. code-block:: default isinstance(2.5, str) .. rst-class:: sphx-glr-script-out .. code-block:: none False .. GENERATED FROM PYTHON SOURCE LINES 102-106 .. code-block:: default from collections.abc import Iterator, Iterable isinstance(prov_iterator, Iterable) .. rst-class:: sphx-glr-script-out .. code-block:: none True .. GENERATED FROM PYTHON SOURCE LINES 107-110 .. code-block:: default isinstance(prov_iterator, Iterator) .. rst-class:: sphx-glr-script-out .. code-block:: none True .. GENERATED FROM PYTHON SOURCE LINES 111-124 .. code-block:: default sequences = { list: ["Islamabad", "Tehran", "Istambul"], str: "Islamabad", tuple: ("Islamabad", "Tehran", "Istambul"), dict: {"Islamabad": '', "Tehran": '', "Istambul": ''}, int: 2, float: 2.5 } for _type, obj in sequences.items(): print(isinstance(obj, _type)) .. rst-class:: sphx-glr-script-out .. code-block:: none True True True True True True .. GENERATED FROM PYTHON SOURCE LINES 125-129 .. code-block:: default for obj in sequences.values(): print(isinstance(obj, Iterable), isinstance(obj, Iterator)) .. rst-class:: sphx-glr-script-out .. code-block:: none True False True False True False True False False False False False .. GENERATED FROM PYTHON SOURCE LINES 130-138 .. code-block:: default for obj in sequences.values(): if isinstance(obj, Iterable): obj = iter(obj) print(isinstance(obj, Iterable), isinstance(obj, Iterator)) else: print("{} can not be converted into iterator because it is not iterable".format(obj)) .. rst-class:: sphx-glr-script-out .. code-block:: none True True True True True True True True 2 can not be converted into iterator because it is not iterable 2.5 can not be converted into iterator because it is not iterable .. GENERATED FROM PYTHON SOURCE LINES 139-149 The key takeaways from above two cells are following: * So ``list``, ``str``, ``tuple`` and ``dict`` are iterables as such and not iterators. However they can be converted into ``iterators`` after applying `next` method on it. * Every ``iterator`` is also and ``iterable`` but all iterables are not iterators. * In order to be able to create ``iterator`` from an object, it must be ``iterable`` first. Floats and integers are not iterable so can not be converted into iterators as well. .. GENERATED FROM PYTHON SOURCE LINES 151-152 As an ``iterator`` is also ``iterable`` so it can also be used on right side of ``for`` loop. .. GENERATED FROM PYTHON SOURCE LINES 154-158 .. code-block:: default for prov in prov_iterator: print(prov) .. rst-class:: sphx-glr-script-out .. code-block:: none Sindh Balochistan Janubi Pubjab Hazara Pakhtunkhwa .. GENERATED FROM PYTHON SOURCE LINES 159-164 If you run the above cell again, it will not print anything because the iterator is already exhausted. Not all methods that can be applied on an ``iterable`` can also be applied on ``iterator``. For example the ``len`` method can not be applied on `iterator`. .. GENERATED FROM PYTHON SOURCE LINES 166-170 .. code-block:: default # uncomment following line # len(prov_iterator) .. GENERATED FROM PYTHON SOURCE LINES 171-172 we can however find the number of items in an iterator after converting it into list .. GENERATED FROM PYTHON SOURCE LINES 174-178 .. code-block:: default prov_iterator = iter(provinces) len(list(prov_iterator)) .. rst-class:: sphx-glr-script-out .. code-block:: none 5 .. GENERATED FROM PYTHON SOURCE LINES 179-182 The methods ``next`` and ``iter`` for iterator and iterable actually come from ``__next__`` and ``__iter__`` methods which reside inside corresponding class. Since OOP concepts are not discussed in this course, so these methods are also not discussed. .. rst-class:: sphx-glr-timing **Total running time of the script:** ( 0 minutes 0.006 seconds) .. _sphx_glr_download_auto_examples_basics_iterator_vs_iterable.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: binder-badge .. image:: images/binder_badge_logo.svg :target: https://mybinder.org/v2/gh/AtrCheema/python-seekho/master?urlpath=lab/tree/notebooks/auto_examples/basics/iterator_vs_iterable.ipynb :alt: Launch binder :width: 150 px .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: iterator_vs_iterable.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: iterator_vs_iterable.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_