この記事では、Pythonで文字列を効率的に扱うためのジェネレータとイテレータの基本的な使い方とその応用について解説します。具体的なコード例やその詳細な解説、さらには実用的な応用例をいくつかご紹介します。
目次
ジェネレータとイテレータの基本
ジェネレータとイテレータは、Pythonで大量のデータを効率的に扱う際に非常に有用な概念です。特に、メモリを節約しながら文字列を検索、編集、整形する際に役立ちます。
ジェネレータの基本
ジェネレータは、イテレータを作成する一つの方法です。`yield`キーワードを使って、関数が一時停止し、後で続きから実行できるようにします。
def my_generator():
yield 'a'
yield 'b'
yield 'c'
この例では、`my_generator`関数は`’a’`, `’b’`, `’c’`という3つの文字を順に返します。
イテレータの基本
イテレータは、`__iter__()`と`__next__()`メソッドを実装したオブジェクトです。これにより、`for`ループで使用できます。
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
文字列とジェネレータ・イテレータ
文字列はイミュータブル(変更不可)なデータ型であるため、大量の文字列データを扱う場合、ジェネレータやイテレータが非常に役立ちます。
文字列の分割
文字列を単語に分割する簡単なジェネレータの例です。
def split_words(text):
word = ""
for char in text:
if char == " ":
yield word
word = ""
else:
word += char
yield word
文字列のフィルタリング
指定した文字だけを取り出すジェネレータの例です。
def filter_chars(text, allowed_chars):
for char in text:
if char in allowed_chars:
yield char
応用例
CSVファイルの処理
CSVファイルを行ごとに読み込み、特定のカラムだけを取り出す例です。
import csv
def read_csv_column(filename, column_name):
with open(filename, mode='r') as file:
csv_reader = csv.DictReader(file)
for row in csv_reader:
yield row[column_name]
ファイルのテキスト検索
テキストファイル内で特定の文字列を検索する例です。
def search_text_in_file(filename, query):
with open(filename, 'r') as file:
for line in file:
if query in line:
yield line.strip()
非同期処理との組み合わせ
非同期処理とジェネレータを組み合わせて、効率的に大量のAPIリクエストを処理する例です。
import asyncio
import httpx
async def fetch_urls(urls):
async with httpx.AsyncClient() as client:
for url in urls:
res = await client.get(url)
yield res.text
まとめ
Pythonで文字列を効率的に扱うためのジェネレ
ータとイテレータの使い方を解説しました。これらの概念を理解して活用することで、メモリ使用量を削減しながら、より効率的なコードを書くことが可能です。
コメント