TIL08. Advanced Python
1. Generators
Pythonでは、通常の関数は値を返して終了しますが、Generators関数の戻り値とは異なり、計算(完成品)を返します.Generatorはまた、奇形を生成する関数と見なすこともできる.
def generator_squares():
for i in range(3):
yield i ** 2
print("gen object=", end=""), print(generator_squares())
gen object=<generator object generator_squares at 0x10f3b0150>
yield
は、リスナー関数から値を返すために使用され、yield
が呼び出された後、next
が再び呼び出されるまで現在の状態にとどまり、next
関数が呼び出され、次の演算が実行される.gen = generator_squares()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
출력결과
0
1
4
Traceback (most recent call last):
File "generator.py", line 14, in <module>
print(gen.__next__())
StopIteration
Iter()
が呼び出された後、Next()
関数を呼び出す必要がなく、Next()
が呼び出される.for文が終わると、StopIterationも発生します.Generator関数は、実行中の
Send()
関数を介して値を渡すことができる.def generator_send():
received_value = 0
while True:
received_value = yield
print("received_value = ",end=""), print(received_value)
yield received_value * 2
gen = generator_send()
next(gen)
print(gen.send(2))
next(gen)
print(gen.send(3))
출력결과
received_value = 2
4
received_value = 3
6
generator send関数は、yield
を介して値を伝達し、receive valueに値を割り当てることができる.呼び出すたびに、メモリではなくメモリに値が格納されるため、メモリ容量に効率的です.
1.1 Lazy Evaluation
Lazy Evaluationは、計算を必要とする結果値に遅延させる遅延実行方法である.
ジェネレータ式(Generator Expression)は、四角カッコ(
send
)ではなくカッコ([]
)を使用して作成されます.リスト統合構文と同様です.import time
def print_iter(iter):
for element in iter:
print(element)
def lazy_return(num):
print("sleep 1s")
time.sleep(1)
return num
print("comprehension_list=")
comprehension_list = [ lazy_return(i) for i in L ]
print_iter(comprehension_list)
print("generator_exp=")
generator_exp = ( lazy_return(i) for i in L )
print_iter(generator_exp)
comprehension_list =
sleep 1s
sleep 1s
sleep 1s
1
2
3
generator_exp =
sleep 1s
1
sleep 1s
2
sleep 1s
3
List Compressionはreturn lazy関数を予め実行している.()
の値を生成し、1つの値を一度に出力します.Lazy Evaluationはgenerator exp関数を使用する場合にのみ値を出力します.
Lambda Expressions
Lambdaは、「匿名関数」または「Lambda式」と呼ばれるインライン関数を定義するために使用されます.
일반함수
def name(arg1, arg2 ...):
block of statement
Lambda
lambda argument1, argument2, ... argumentN : expression using arguments
一般関数とLambdaの違いは、文を返さずに式の結果を返す簡単な式であることです.これは、ロー・コールバック関数を作成できない場合や、関数で複雑な処理を行う場合に便利です.
(コールバック関数:イベントが発生したときに呼び出される関数)
def square(x):
return x ** 2
def power_3(x):
return x ** 3
def power_4(x):
return x ** 4
powers = [ square, power_3, power_4 ]
for f in powers:
print( f(2) )
Lambda 사용 할 경우
Lambdas = [
lambda x : x ** 2,
lambda x : x ** 3,
lambda x : x ** 4
]
for lambda_func in Lambdas:
print( lambda_func(2) )
ある整数の2平方、3平方など.Ramda関数を使用する場所では、関数で実装される二乗例に比べて、行内式のコードがより簡潔に使用されます.Reference
この問題について(TIL08. Advanced Python), 我々は、より多くの情報をここで見つけました https://velog.io/@pkc035/Advanced-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol