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関数を使用する場所では、関数で実装される二乗例に比べて、行内式のコードがより簡潔に使用されます.