5

我正在尝试用 Python 编写forwhile循环——函数式编程风格。

我认为for构造很好,但while不起作用,它会无限运行。

# for loop
lst = [1, 2, 3]
def fun(e):
   return e
print map(fun, lst)


# while loop
i = 1
def whileloop():
    global i
    print i
    i = i+1
while_FP = lambda: ((i < 5) and whileloop()) or while_FP()
while_FP()
4

3 回答 3

8

FP 风格不使用全局状态(全局变量)并最小化副作用(例如 IO)。While-loop 喊叫看起来像这样:

fp_while = lambda pred, fun, acc: (lambda val: fp_while(pred, fun, val) if pred(val) else val)(fun(acc))

print fp_while(lambda x: x < 5, lambda x: x + 1, 1)

如果您需要副作用:

def add_and_print(x):
   print x
   return x + 1

fp_while(lambda x: x < 5, add_and_print, 1)
于 2012-06-11T13:53:02.867 回答
1

如果迭代次数过多,使用@aleksei-astynax-pirogov 回答的递归将导致递归错误。相反,您可以隐藏函数内部状态的副作用。

def fp_while(pred, fun, acc):
    v = acc
    while(pred(v)):
        v = fun(v)
    return v 

使用示例:

fp_while(lambda x: x < 5, lambda x: x + 1, 1)
print(fp_while(lambda x: x < 5, lambda x: x + 1, 1))
# outputs 5

使用生成器方法

下面的生成器方法将允许您在每次迭代时存储状态

def fp_while_generator(pred, fun, acc):
    v = acc
    while(pred(v)):
        yield v
        v = fun(v)
    yield v # remove this if you do not want the last value that fails the check

使用示例:

my_while_generator = fp_while_generator(lambda x: x < 5, lambda x: x + 1, 1)
print([i for i in my_while_generator])
# outputs [1,2,3,4,5]

有关生成器的更多信息 https://realpython.com/introduction-to-python-generators/

于 2020-08-06T15:38:28.553 回答
-1

可能你需要:

i = 1
def whileloop():
    global i
    print i
    i = i+1
    return True

while_FP = lambda: ((i < 5) and whileloop()) and while_FP()
while_FP()

从功能的角度来看and,如果左侧是 ,则评估右侧字段True。您也可以使用重写它or。顺便说一句,使用全局变量不是一个好习惯。

于 2012-06-11T13:45:24.660 回答