著者:飯尾 淳
本連載では「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}')  |