1
0

430_closure.py 908 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. # only one level nested closure is implemented
  2. def f0(a, b):
  3. def f1():
  4. return a + b
  5. return f1
  6. a = f0(1, 2)
  7. b = f0(3, 4)
  8. assert a() == 3
  9. assert b() == 7
  10. def f0(a, b):
  11. def f1():
  12. a = 5 # use this first
  13. return a + b
  14. return f1
  15. a = f0(1, 2)
  16. assert a() == 7
  17. def f3(x, y):
  18. return lambda z: x + y + z
  19. a = f3(1, 2)
  20. assert a(3) == 6
  21. # closure ex
  22. def f(n):
  23. def g(x):
  24. if x==n:
  25. return n
  26. return g(x+1)
  27. return g(0)
  28. assert f(10) == 10
  29. # class closure
  30. class A:
  31. def g(self, x):
  32. def f(y):
  33. return x + y
  34. return f
  35. assert A().g(1)(2) == 3
  36. # closure with yield
  37. def g(x):
  38. def fx(y):
  39. yield x
  40. yield y
  41. return x + y
  42. return fx
  43. gen = g(1)(2)
  44. assert next(gen) == 1
  45. assert next(gen) == 2
  46. try:
  47. next(gen)
  48. assert False
  49. except StopIteration as e:
  50. assert e.value == 3