python関数の再帰性と生成器を深く理解する
一、何が再帰ですか?
関数が独自の呼び出しを含む場合、関数は再帰的です。再帰的にアルゴリズムとしてプログラム設計言語において広く応用されており、通常は大きな複雑な問題を元の問題と似たような規模の小さい問題に転化して解決しています。再帰戦略は少量のプログラムで解決過程に必要な複数回の計算を記述できます。プログラムのコード量を大幅に低減しました。例えば、1−9の9桁の数字の積を計算するなら、直感的なアルゴリズムは1*2*3*5*6*7*8*9であり、1−100万の積を計算するなら、直感的なアルゴリズムは実現しにくいが、再帰的には簡単に実現できる。例を見てください
以下では、例を用いて再帰的な実行過程を見てみよう。
ジェネレータはyield文を持つ関数です。関数またはサブルーチンは一回だけ返しますが、一つのジェネレータは実行を一時停止し、中間の結果を返して、一つの値を使用者に返して実行を一時停止します。ジェネレータのnext()メソッドが呼び出されたときは、場所を離れて正確に続行されます。
以下の例を参照してください
これらの簡単な例は、ジェネレータがどのように動作しているかを少し分かります。next()を除いて次の生成値を取得し、ユーザーは値をジェネレータ[send()に戻し、ジェネレータに異常を投げ、ジェネレータの終了を要求する。
以下はこれらの特性を示す簡単な例である。
関数が独自の呼び出しを含む場合、関数は再帰的です。再帰的にアルゴリズムとしてプログラム設計言語において広く応用されており、通常は大きな複雑な問題を元の問題と似たような規模の小さい問題に転化して解決しています。再帰戦略は少量のプログラムで解決過程に必要な複数回の計算を記述できます。プログラムのコード量を大幅に低減しました。例えば、1−9の9桁の数字の積を計算するなら、直感的なアルゴリズムは1*2*3*5*6*7*8*9であり、1−100万の積を計算するなら、直感的なアルゴリズムは実現しにくいが、再帰的には簡単に実現できる。例を見てください
def fact(n):#
if n<=1:
return 1
else:
return n * fact(n-1)
print (fact(7))
結果:5040以下では、例を用いて再帰的な実行過程を見てみよう。
def calc(n):
print(n)
if n/2 > 1:
res = calc(n/2)
return n
calc(8)
結果:
8
4.0
2.0
この例を見てください。
def calc(n):
print(n)
if n/2 > 1:
res = calc(n/2)
print('res:',res)
print("N:",n)
return n
calc(8)
結果:
8
4.0
2.0
N: 2.0
res: 2.0
N: 4.0
res: 4.0
N: 8
二、ジェネレータジェネレータはyield文を持つ関数です。関数またはサブルーチンは一回だけ返しますが、一つのジェネレータは実行を一時停止し、中間の結果を返して、一つの値を使用者に返して実行を一時停止します。ジェネレータのnext()メソッドが呼び出されたときは、場所を離れて正確に続行されます。
以下の例を参照してください
def func():
print('11111111')
yield [1]
print(2222222222)
yield 2
print(3333333333)
yield 3
ret=func()
r1=ret.__next__()
print(r1)
r2=ret.__next__()
print(r2)
r3=ret.__next__()
print(r3)
結果:
11111111
[1]
2222222222
2
3333333333
3
pythonのforサイクルはnext()呼び出しとStopIterationに対する処理があるので、一つのforサイクルを使って、手動反復ではなく一つのジェネレータ(またはそのようなもののローズマリー)を通るのはいつも簡潔で綺麗です。例:
def func():
print('11111111')
yield [1]
print(2222222222)
yield 2
print(3333333333)
yield 3
ret=func()
for i in ret:
print(i)
結果は前と同じです。これらの簡単な例は、ジェネレータがどのように動作しているかを少し分かります。next()を除いて次の生成値を取得し、ユーザーは値をジェネレータ[send()に戻し、ジェネレータに異常を投げ、ジェネレータの終了を要求する。
以下はこれらの特性を示す簡単な例である。
def counter(start_at=0):
count = start_at
while True:
val = (yield count) if val is not None:
count = val
else:
count += 1
ジェネレータは初期化された値を持っていて、ジェネレータ[next()]に対して毎回呼び出して1でカウントします。ユーザはこの値をリセットすることを選択できます。もし彼らが新しい値でsend()を呼び出したいなら、next()を呼び出すのではありません。このジェネレータは永遠に動作しますので、終了したい場合は、close()メソッドを呼び出します。このコードを相互に実行すれば、次のように出力されます。
>>> count = counter(5)
>>> count.next()
5
>>> count.next()
6
>>> count.send(9)
9
>>> count.next()
10
>>> count.close()
>>> count.next()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
以上のように、python関数の再帰と生成器を深く理解しました。小編が皆さんに提供した内容を全部共有しました。参考にしていただければと思います。よろしくお願いします。