pocketpy/tests/43_closure.py
2024-11-17 19:09:20 +08:00

64 lines
908 B
Python

# only one level nested closure is implemented
def f0(a, b):
def f1():
return a + b
return f1
a = f0(1, 2)
b = f0(3, 4)
assert a() == 3
assert b() == 7
def f0(a, b):
def f1():
a = 5 # use this first
return a + b
return f1
a = f0(1, 2)
assert a() == 7
def f3(x, y):
return lambda z: x + y + z
a = f3(1, 2)
assert a(3) == 6
# closure ex
def f(n):
def g(x):
if x==n:
return n
return g(x+1)
return g(0)
assert f(10) == 10
# class closure
class A:
def g(self, x):
def f(y):
return x + y
return f
assert A().g(1)(2) == 3
# closure with yield
def g(x):
def fx(y):
yield x
yield y
return x + y
return fx
gen = g(1)(2)
assert next(gen) == 1
assert next(gen) == 2
try:
next(gen)
assert False
except StopIteration as e:
assert e.value == 3