Pythonではリストの中で
様々な処理を内包することができます

元のリストを2倍する様な処理を考えた場合 
(1から5までの数値を倍にしてリストに追加) 
dataList = [1,2,3,4,5]
newData = []
for d in dataList:
  newData.append(d * 2)
print(newData)
[2, 4, 6, 8, 10]

for文ではこのようになりますが
リスト内包表記で記述するともっと簡潔にできます 
dataList = [1,2,3,4,5]
newData = [d * 2 for d in dataList]
print(newData)
[2, 4, 6, 8, 10]


リスト作成の条件にfor文を使って
リストを作成し、結果は同じでも記述が楽です

さらにif文も追加します
(1から10までの偶数を
2倍の数値にしてリストに追加する)
dataList = range(1,11)
newData = []
for d in dataList:
    if d % 2 == 0:
        newData.append(d * 2)
print(newData)
[4, 8, 12, 16, 20]

この様な条件も次のようになります
dataList = range(1,11)
newData = [d * 2 for d in dataList if d % 2 == 0]
print(newData)
[4, 8, 12, 16, 20]


ちなみに似た様な書き方でラムダ式というのがありますが
今回は割愛し後述します

前回の九九も
リスト内表記で簡潔に記述することができます
print ('\n'.join([''.join(['%3d'%(i*j) for i in range(1,10)]) for j in range(1,10)]))
  1  2  3  4  5  6  7  8  9
  2  4  6  8 10 12 14 16 18
  3  6  9 12 15 18 21 24 27
  4  8 12 16 20 24 28 32 36
  5 10 15 20 25 30 35 40 45
  6 12 18 24 30 36 42 48 54
  7 14 21 28 35 42 49 56 63
  8 16 24 32 40 48 56 64 72
  9 18 27 36 45 54 63 72 81

(windowsの場合は \ を ¥ に変えてください)
二重for文の結果(i * j)をjoinで連結し
\n をjoinして改行しています
最初のループが終わった時に改行されるようにしている所に
注意しましょう

ちなみにリスト内包表記は
速度面でも有利なようです
下記は1万回ループ処理をした結果を測ったものです
%%timeit
e_1 = []
for i in range(10000):
    e_1.append(i)
1000 loops, best of 3: 881 µs per loop

%%timeit
e_1= [i for i in range(10000)]
1000 loops, best of 3: 367 µs per loop

%%timeit は速度を測れます
リスト内包表記は速度面でも有利なため
覚えておくと便利です