4.9. Patterns

4.9.1. Rationale

  • Python for loop is equivalent to forEach in other languages

  • Other languages for loop is Python's while (sic!)

For:

for (int i = 0; i <= 10; i++)  # C/C++/Java
for (var i = 0; i <= 10; i++)  # JavaScript

i = 0
while i <= 10:  #  Python
    i += 1

ForEach Index:

for (let idx in collection)         # JavaScript
for idx in range(len(collection))   # Python

ForEach Element:

for (var element : collection)   # Java
for (let element of collection)  # JavaScript
for element in collection        # Python
for i in range(0,10)             # Python

Code Complexity vs. Programmer Experience:

../../_images/idiom-patterns-programmer-exp.png

Time Complexity: https://wiki.python.org/moin/TimeComplexity

4.9.2. Loop Patterns

>>> data = ['a', 'b', 'c']
>>> i = 0
>>> result = []
>>>
>>> while i < len(data):
...     x = data[i]
...     result.append(x.upper())
...     i += 1
>>>
>>> print(result)
['A', 'B', 'C']
>>> data = ['a', 'b', 'c']
>>> result = []
>>>
>>> for x in data:
...     result.append(x.upper())
>>>
>>> print(result)
['A', 'B', 'C']
>>> data = ['a', 'b', 'c']
>>> result = [x.upper() for x in data]
>>>
>>> print(result)
['A', 'B', 'C']

4.9.3. Range

>>> i = 0
>>>
>>> while i < 5:
...     i += 1
>>> for i in range(5):
...     pass

4.9.4. ForEach

>>> DATA = ['a', 'b', 'c']
>>>
>>> for i in range(len(DATA)):
...     value = DATA[i]
>>> DATA = ['a', 'b', 'c']
>>>
>>> for value in DATA:
...     pass

4.9.5. Sum

>>> DATA = [1, 2, 3]
>>> result = 0
>>>
>>> for i in range(len(DATA)):
...     result += DATA[i]
>>> DATA = [1, 2, 3]
>>> result = sum(DATA)

4.9.6. Enumerate

>>> DATA = ['a', 'b', 'c']
>>> i = 0
>>>
>>> while i < len(DATA):
...     value = DATA[i]
...     i += 1
>>> DATA = ['a', 'b', 'c']
>>>
>>> for i, value in enumerate(DATA):
...     pass

4.9.7. Zip

>>> header = ['a', 'b', 'c']
>>> values = [1, 2, 3]
>>> result = {}
>>>
>>> for i in range(len(header)):
...     key = header[i]
...     val = values[i]
...     result[key] = value
>>> header = ['a', 'b', 'c']
>>> values = [1, 2, 3]
>>>
>>> result = zip(header, values)
>>> dict(result)
{'a': 1, 'b': 2, 'c': 3}

4.9.8. List Comprehension

>>> DATA = ['a', 'b', 'c']
>>> result = list()
>>>
>>> for x in DATA:
...     result.append(x)
...
>>> result
['a', 'b', 'c']
>>> DATA = ['a', 'b', 'c']
>>>
>>> result = [x for x in DATA]
>>> result
['a', 'b', 'c']

4.9.9. Set Comprehension

>>> DATA = ['a', 'b', 'c']
>>> result = set()
>>>
>>> for x in DATA:
...     result.add(x)
>>> DATA = ['a', 'b', 'c']
>>> result = {x for x in DATA}

4.9.10. Dict Comprehension

>>> DATA = {'a': 1, 'b': 2, 'c': 3}
>>> result = dict()
>>>
>>> for key, value in DATA.items():
...     result[key] = value
>>> DATA = {'a': 1, 'b': 2, 'c': 3}
>>> result = {k:v for k,v in DATA.items()}

4.9.11. Map

>>> def func(x):
...     return float()
...
>>> DATA = [1, 2, 3]
>>> result = (func(x) for x in DATA)
>>> def func(x):
...     return float()
...
>>> DATA = [1, 2, 3]
>>> result = map(func, DATA)

4.9.12. Filter

>>> def func(x):
...     return x % 2 == 0
...
>>> DATA = [1, 2, 3]
>>> result = (x for x in DATA if func(x))
>>> def func(x):
...     return x % 2 == 0
...
>>> DATA = [1, 2, 3]
>>> result = filter(func, DATA)

4.9.13. For Else

>>> DATA = [1, 2, 3]
>>> FIND = 10
>>> found = False
>>>
>>> for value in DATA:
...     if value == FIND:
...         print('Found')
...         found = True
...         break
...
>>> if not found:
...     print('Not Found')
Not Found
>>> DATA = [1, 2, 3]
>>> FIND = 10
>>>
>>> for value in DATA:
...     if value == FIND:
...         print('Found')
...         break
... else:
...     print('Not Found')
Not Found

4.9.14. While Else

>>> DATA = [1, 2, 3]
>>> FIND = 10
>>> found = False
>>>
>>> while i < len(DATA):
...     value = DATA[i]
...     i += 1
...     if value == FIND:
...         print('Found')
...         found = True
...         break
...
>>> if not found:
...     print('Not Found')
Not Found
>>> DATA = [1, 2, 3]
>>> FIND = 10
>>>
>>> while i < len(DATA):
...     value = DATA[i]
...     i += 1
...     if value == FIND:
...         print('Found')
...         break
... else:
...     print('Not Found')
Not Found

4.9.15. Str Startswith

>>> data = 'virginica'
>>> data[:1] == 'v'
True
>>> data[:3] == 'vir' or data[:2] == 've'
True
>>> data = 'virginica'
>>> data.startswith('v')
True
>>> data.startswith(('vir', 've'))
True

4.9.16. Str Endswith

>>> data = 'virginica'
>>> data[-3:] == 'osa'
False
>>> data[-3:] == 'osa' or data[-2:] == 'ca'
True
>>> data = 'setosa'
>>> data.endswith('osa')
True
>>> data.endswith(('osa', 'ca'))
True

4.9.17. Str Join Newline

>>> data = ['line1', 'line2', 'line3']
>>> result = [line+'\n' for line in data]
>>> data = ['line1', 'line2', 'line3']
>>> result = '\n'.join(data)

4.9.18. Others

  • all()

  • any()

  • iter()

  • next()

4.9.19. Functools

4.9.20. Itertools

  • https://docs.python.org/3/library/itertools.html

  • More information in Itertools

  • itertools.from itertools import *

  • itertools.count(start=0, step=1)

  • itertools.cycle(iterable)

  • itertools.repeat(object[, times])

  • itertools.accumulate(iterable[, func, *, initial=None])

  • itertools.chain(*iterables)

  • itertools.compress(data, selectors)

  • itertools.islice(iterable, start, stop[, step])

  • itertools.starmap(function, iterable)

  • itertools.product(*iterables, repeat=1)

  • itertools.permutations(iterable, r=None)

  • itertools.combinations(iterable, r)

  • itertools.combinations_with_replacement(iterable, r)

  • itertools.groupby(iterable, key=None)