あつおさんがPEP572でフィボナッチ数列を作って遊んでいたので、僕も遊んでみた。
Python 3.8.0a1時点の話です。
はじめてのPEP 572書いた
— Atsuo Ishimoto (@atsuoishimoto) February 5, 2019
>>> [((p1+p2), (p3:=p1), (p1:=p2), (p2:=p3+p2))[0] for x in (range(2, 10), (p1:=1), (p2:=1))[0]]
[2, 3, 5, 8, 13, 21, 34, 55]
ちょっと改善
— Atsuo Ishimoto (@atsuoishimoto) February 5, 2019
>>> [((p3:=p1), (p1 + (p1:=p2)), (p2:=p3+p2))[1] for x in (range(2, 10), (p1:=1), (p2:=1))[0]]
[2, 3, 5, 8, 13, 21, 34, 55]
これでいいのか
— Atsuo Ishimoto (@atsuoishimoto) February 5, 2019
>>> [(((p3:=p1) + (p1:=p2)), (p2:=p3+p2))[0] for x in (range(2, 10), (p1:=1), (p2:=1))[0]]
[2, 3, 5, 8, 13, 21, 34, 55]
#PEP572Fib
— Hiroki KIYOHARA (@hirokiky) February 5, 2019
>>> [(p3 := (p1 + p2)) and (p1 := p2) and (p2 := p3) for _ in (p1 := (p2 := 1)) and range(10)]
[2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
どや [((p3:=p1) + (p1:=p2))+0*(p2:=p3+p2) for x in (range(1+(p1:=1)+1, 10+(p2:=1)))]
— Atsuo Ishimoto (@atsuoishimoto) February 5, 2019
[(p2 := (p1 + (p1:=p2))) for x in (range(1+(p1:=1)+1, 10+(p2:=1)))]
— Hiroki KIYOHARA (@hirokiky) February 5, 2019
我ながら [(p2 := (p1 + (p1:=p2))) for _ in ...]
はよく出来てるなと思った。
あと、PEP572のnamed assignmentは使ってみると意外と制限があるので、思ったよりも良いなと思った。
ただこの動きは直感的にはビックリした。
>>> a = 1 >>> b = 2 >>> a + (a := b) 3 >>> a 2 >>> b 2
あつおさんのブログも見てね