April 2023
Intermediate to advanced
452 pages
7h 21m
Japanese
itertoolsを使って、複雑なジェネレータを定義する方法は? Python以外の言語の経験者がPythonを学び始めると、forループの書き方が違うことに衝撃を受けます。つまり、次のように書く代わりに、
# 他の言語の場合
for (i=0; i<N; i++) {
do_work(i);
}
rangeという関数を使って次のように書きます。
# Pythonの場合
for i in range(N):
do_work(i)
Pythonのサンプルコードでは、rangeという関数を呼び出して、forループに必要なデータを作成しているようです。直感的には、1から100,000,000までの数字をループさせようとすると、その配列の作成に時間がかかってしまいそうです。そういうときこそ、ジェネレータの出番です。ジェネレータでは、この種の関数を遅延評価できるので、性能に影響を受けることなく、読みやすいコードを書くことができます。
この概念を理解するために、フィボナッチ数を計算する関数を、リストを埋める方法とジェネレータを使う方法で実装してみましょう。
def fibonacci_list(num_items): numbers = [] a, b = 0, 1 while len(numbers) < num_items: numbers.append(a) a, b = b, a + b return numbers def fibonacci_gen(num_items): ...
Read now
Unlock full access