Since the last year, one of our Awesome Users veky has been doing video code review on CheckiO. Here is a very short highlight of the most interesting and educational code:
Avoid for i in range(len(items)-1)
"This is the most unpythonic way"
There are a lot of Python functions that will help you to simplify it:
for i in range(len(items)-1):
item = items[i]
This can be written as
for i, item in enumerate(items):
and if you want to use number (i+1) instead of index you can do:
for num, item in enumerate(items, 1):
Instead of:
for i in range(len(items) -1):
item = items[i]
num = i+1
If you want to use more than one element in "for", then instead of:
for i in range(len(items)-1):
left = items[i]
right = items[i+1]
You can do:
for left, right in zip(items, items[1:]):
lru_cache - this ugly guy can become your best friend in a speed optimization process
Here is a very unoptimized solution for fibonacci number:
def stupid_fibonacci(n): if n < 2: return n else: return stupid_fibonacci(n-1) + stupid_fibonacci(n-2)
On my laptop, stupid_fibonacci(35) can take up to 1 minute but if you add lru_cache decorator:
from functools import lru_cache as memoize @memoize() def stupid_fibonacci(n): if n < 2: return n else: return stupid_fibonacci(n-1) + stupid_fibonacci(n-2)
.. then, execution will be 1000x faster.
Max arg and max val
Those are two very simple lines of code. One which gives you an element with maximal length:
max(items, key=len)
… and another that gives you a maximal length itself:
max(map(len, items))
Extracting sequence
Items = [3,1,4,6,7] min_item, *other_data, max_item = sorted(items)
This small trick works starting with python3.5. It allows you to extract values not only from the start of the sequence but also from the end of it.
*other_data, last_item = items
Some other small tricks
>>> True == False == False
False
>>> (True == False) == False
True
>>> 32.bit_length()
32.bit_length()
^
SyntaxError: invalid syntax
>>> 32 .bit_length()
Out[17]: 6