Python資格取得への道のり 10日目
・リスト内包表記
タプルに入っているものをリストに入れるには下記のコードが必要。
t = (1, 2, 3, 4, 5)
l = []
for i in t:
l.append(i)
print(l)
#[1, 2, 3, 4, 5]
リスト内包表記はこれを1行でかける。
r= [i for i in t]
print('r:', r)
#r: [1, 2, 3, 4, 5]
他にもこんな感じで書ける。
t = (1, 2, 3, 4, 5)
l = []
for i in t:
if i % 2 == 0:
l.append(i)
print(l)
r= [i for i in t if i % 2 ==0]
print('r:', r)
#[2, 4]
#r: [2, 4]
forを2つにしても書ける
t = (1, 2, 3, 4, 5)
t2 = (5, 6, 7, 8, 9, 10)
r = []
for i in t:
for j in t2:
r.append(i * j)
print(r)
r = [i * j for i in t for j in t2]
print(r)
#[5, 6, 7, 8, 9, 10, 10, 12, 14, 16, 18, 20, 15, 18, 21, 24, 27, 30, 20, 24, 28, 32, 36, 40, 25, 30, 35, 40, 45, 50]
#[5, 6, 7, 8, 9, 10, 10, 12, 14, 16, 18, 20, 15, 18, 21, 24, 27, 30, 20, 24, 28, 32, 36, 40, 25, 30, 35, 40, 45, 50]
ただ、リスト内包表記はforが1つでさらに条件文(例えば、ifなど)がある場合は読みやすいが、forが2つ続くと読みにくくなるため今まで通りに書く方が良い
あえて使いまくるのはNG
・辞書包括表記
リストにあるものを辞書に入れたい場合、zip関数を使用して下記のようなコードが書ける。
w = ['mon', 'tue', 'wed']
n = ['coffee', 'milk', 'water']
d = {}
for x, y in zip(w, n):
d[x] = y
print(d)
#{'mon': 'coffee', 'tue': 'milk', 'wed': 'water'}
これも1行で表現ができる
d = {x: y for x, y in zip(w, n)}
print(d)
#{'mon': 'coffee', 'tue': 'milk', 'wed': 'water'}
辞書に格納したい場合は、キー:値である「x: y」で問題ない
・集合内包表記
連続した数字を集合に入れる場合は、下記のような例のコードとなる。
s = set ()
for i in range(10):
s.add(i)
print(s)
#{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
これも1行でコードを書くことができる。
s = {i for i in range(10)}
print('s=', s)
#s= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
気をつけるべきは{}を使用している点set()の括弧内に入れていくのではないので注意
リスト内包表記と同様、条件文も追加ができる
s = set ()
for i in range(10):
if i % 2 == 0:
s.add(i)
print(s)
s = {i for i in range(10) if i % 2 == 0}
print('s=', s)
#{0, 2, 4, 6, 8}
#s= {0, 2, 4, 6, 8}
・ジェネレーター内包表記
ジェネレーターのコード例を下記に1つ
def g():
for i in range(10):
yield i
g = g()
print(type(g))
print(next(g))
print(next(g))
#<class 'generator'>
#0
#1
これに対して内包表記すると
g = (i for i in range(10))
print(type(g))
print(next(g))
print(next(g))
#<class 'generator'>
#0
#1
ただ、この「g = (i for i in range(10))」を「g = tuple(i for i in range(10))」にするとどうなるのか、タイプ以外の出力結果にも注目
def g():
for i in range(10):
yield i
g = g()
g = tuple(i for i in range(10))
print(type(g))
print(g)
#<class 'tuple'>
#(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
このようにタプルとなり、数値もタプルの状態で入る。
※print(next(g))からprint(g)となっているので、そこにも注意
ジェンレータは()
タプルはtuple()
・名前空間とスコープ
animal = 'cat'
print(animal)
#cat
この場合、animalという変数はグローバル変数
animal = 'cat'
def f():
animal = 'dog'
print('after', animal)
f()
print('global', animal)
#after dog
#global cat
このようにdefの中でanimalを宣言して、新たな値を入れている。
この場合のanimalという変数はローカル変数となり、最後のプリントで出力されるのはグローバル変数の方である。
ただ、ここに1文追加するとエラーが返される。
animal = 'cat'
def f():
print(animal)
animal = 'dog'
print('after', animal)
f()
print('global', animal)
#エラー
追加したのはdefを宣言した直後の「print(animal)」。
なぜエラーになるのか。これは上から2つ目のprintでどちらの変数を見ていいのか判断がつかないためである。
グローバル変数の値を表示するのと、ローカル変数の値を宣言することは同時にできないので注意が必要。
もしdefの関数内でグローバル変数を変更したい場合はこう書く。
animal = 'cat'
def f():
global animal
animal = 'dog'
print('after', animal)
f()
print('global', animal)
#after dog
#global dog
またpythonにはローカル変数を出力することができる。
例えば
animal = 'cat'
def f():
animal = 'dog'
print('local', locals())
f()
print('global', animal)
#local {'animal': 'dog'}
#global cat
これを「animal = 'dog'」を消すとこうなる。
#local {}
#global cat
では、グローバル変数はどう表示されるのか。
animal = 'cat'
print('global', globals())
#global {'__name__': '__main__', '__doc__': None, '__package__': None, '__loader__': <_frozen_importlib_external.SourceFileLoader object at 0x7fae6175c460>, '__spec__': None, '__annotations__': {}, '__builtins__': <module 'builtins' (built-in)>, '__file__': '/Users/shimo/pythonProject/python_programming/lesson.py', '__cached__': None, 'animal': 'cat'}
最後に「'animal': 'cat'」と記載があるので、宣言されたものは追加されていく。グローバル変数が現状どうなっているのかを確認する際はこちらを使っていくと良い。
今日はここまで。
セクション5も大詰め。残りは2つの講義を残し、「モジュール」そして「オブジェクト」「クラス」に入っていきます。
そこまできたら、模試を反復し、試験を受けてきます。
見えてきました
明日は「例外処理」から!