def count_odd(integers):
def iter_(lst, count):
return iter_(rest(lst), count + is_odd(first(lst))) if lst else count
return iter_(integers, 0)
def is_odd(integer):
"""Whether the `integer` is odd."""
return integer % 2 != 0
def first(lst):
"""Get the first element from the `lst` list.
Return `None` if there are no elements.
"""
return lst[0] if lst else None
def rest(lst):
"""Return `lst` list without the first element."""
return lst[1:]
Python , .
:
count_odd([1,2,3])
iter_([1,2,3], 0)
iter_([2,3], 0 + is_odd(1)) if [1,2,3] else 0
iter_([2,3], 0 + True)
iter_([2,3], 1)
iter_([3], 1 + is_odd(2)) if [2,3] else 1
iter_([3], 1 + False)
iter_([3], 1)
iter_([], 1 + is_odd(3)) if [3] else 1
iter_([], 2)
iter_(rest([]), 2 + is_odd(first([])) if [] else 2
2
" " , lambda:; trampoline() . :
import functools
def trampoline(function):
"""Resolve delayed calls."""
@functools.wraps(function)
def wrapper(*args):
f = function(*args)
while callable(f):
f = f()
return f
return wrapper
def iter_(lst, count):
return (lambda:iter_(rest(lst), count+is_odd(first(lst)))) if lst else count
@trampoline
def count_odd(integers):
return iter_(integers, 0)
:
count_odd([1,2,3])
iter_([1,2,3], 0)
lambda:iter_(rest(lst), count+is_odd(first(lst)))
iter_([2,3], 0+is_odd(1))
lambda:iter_(rest(lst), count+is_odd(first(lst)))
iter_([3], 1+is_odd(2))
lambda:iter_(rest(lst), count+is_odd(first(lst)))
iter_([], 1+is_odd(3))
2