Things I learned from Video Code Review with veky

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:]):

Video

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.

Video

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))

Video

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

Video

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
Created: Jan. 24, 2017, 11:09 a.m.
11