#!/usr/bin/python3

#print([(x, x**2) for x in range(1, 11)])

# this is okay - runs the print function, which returns None
L = [print(x, x**2) for x in range(1, 11)]
#print(L) # note that L was 10 None's

L = range(1, 11)
# not allowed to do -
#[L[i] = L[i]**2 for i in range(0, 10)]
L = [L[i]**2 for i in range(0, 10)]
# equivalent to ...
# L_new = []
# for i in range(0, 10):
#   L_new.append(L[i]**2)
# L = L_new
print(L)

print([x for x in range(1, 101) if x % 5 == 0])

print([(x, y) for x in range(0, 5) for y in ['a', 'b', 'c']])
# equivalent to...
# L_new = []
# for x in range(0, 5):
#    L_new.append([(x, y) for y in ['a', 'b', 'c']])
# equivalent to...
# L_new = []
# for x in range(0, 5):
#    L_new2 = []
#    for y in ['a', 'b', 'c']:
#       L_new2.append((x,y))
#    L_new.append(L_new2)

def isPrime(x):
    if x < 2: return False
    elif x == 2: return True
    elif x % 2 == 0: return False
    else:
        i = 3
        while i*i <= x:
            if x % i == 0: return False
            i += 2
        return True
[print(x) for x in range(1, 101) if isPrime(x)]