著者:飯尾 淳
本連載では「Pythonを昔から使っているものの、それほど使いこなしてはいない」という筆者が、いろいろな日常業務をPythonで処理することで、立派な「蛇使い」に育つことを目指します。その過程を温かく見守ってください。皆さんと共に勉強していきましょう。第3回は、Pythonの言語機能である「ジェネレータ」に親しむための活用例を紹介します。
シェルスクリプトマガジン Vol.73は以下のリンク先でご購入できます。
図2 「jugem.txt」の内容を行単位で反転して表示するPythonコード
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env python def readJugemu(): with open('jugemu.txt', 'r') as f: return f.readlines() lines = readJugemu() for l in lines: print(l.rstrip()[::-1]) |
図5 lines変数を使わないコード例
1 2 3 4 5 6 7 8 |
#!/usr/bin/env python def readJugemu(): with open('jugemu.txt', 'r') as f: return f.readlines() for l in readJugemu(): print(l.rstrip()[::-1]) |
図6 ジェネレータを使用したPythonコード「reverse2.py」
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env python def readJugemu(): with open('jugemu.txt', 'r') as f: for line in f: yield line for l in readJugemu(): print(l.rstrip()[::-1]) |
図7 関数readJugemu()が返すデータの種類を調べるPythonコード「test.py」
1 2 3 4 5 6 7 8 |
#!/usr/bin/env python def readJugemu(): with open('jugemu.txt', 'r') as f: return f.readlines() lines = readJugemu() print(type(lines)) |
図8 ジェネレータ関数readJugemu()が返すデータの種類を調べるPythonコード「test2.py」
1 2 3 4 5 6 7 8 9 |
#!/usr/bin/env python def readJugemu(): with open('jugemu.txt', 'r') as f: for line in f: yield line lines = readJugemu() print(type(lines)) |
図9 ジェネレータ関数readJugemu()をfor文で使用するPythonコード「reverse3.py」
1 2 3 4 5 6 7 8 9 10 11 |
#!/usr/bin/env python def readJugemu(): with open('jugemu.txt', 'r') as f: for line in f: print('readJugemu') yield line for l in readJugemu(): print('main: ', end='') print(l.rstrip()[::-1]) |
図11 ハノイの塔の解を求めるPythonコード「hanoi.py」
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/env python def hanoi(n, src, via, dst): if n <= 1: yield src, dst else: yield from hanoi(n-1, src, dst, via) yield src, dst yield from hanoi(n-1, via, src, dst) for src, dst in hanoi(3, 'A', 'B', 'C'): print(f'{src}->{dst}') |
図12 yield from構文を使わない場合のコード
1 2 3 4 5 6 7 8 9 10 11 12 |
#!/usr/bin/env python def hanoi(n, src, via, dst): if n <= 1: yield src, dst else: for s, d in hanoi(n-1, src, dst, via): yield s, d yield src, dst for s, d in hanoi(n-1, via, src, dst): yield s, d for src, dst in hanoi(3, 'A', 'B', 'C'): print(f'{src}->{dst}') |