专门用于for-loop
及其操作的python包装器
我写了很多很普通的FOR循环。
例如:
for x in y:
do something
...并且容易出错。例如忘记“:”或缩进概率。
我们可以将FOR循环放入def中,然后调用它,并为其提供一些东西吗? 一个有趣的练习,如果没有别的。
基本包装...
def wrapper(func,*args):
def wrapped():
return func(*args)
return wrapped
wrapper(print,"bob")
wrapper()
...which works. ie prints bob out
但是我不知道如何使以下工作有效-返回FOR函数会导致很多语法错误。
例如:
def for_1(y, do_something):
def wrapped():
return for x in y:
do_something
return wrapped
for_1(range(3),print("bob\n"))
for_1()
...而且在屏幕上3次都没有看到鲍勃。
有人可以指出我正确的方向吗?包装器不执行返回的函数。 也许为包装器使用一个类?然后有我自己的方法(??) ...或者也许将我指向以前做过此事的某人的页面。我已经研究了包装器和装饰器,但没有看到将参数传递给FOR循环函数的内容
答案 0 :(得分:1)
为什么要使其复杂?
def for_1(y, to_print):
for x in range(y):
print(to_print)
for_1(3, "bob")
输出:
bob
bob
bob
编辑:
def square(x):
print(x*x)
def for_1(y, command, param):
for x in range(y):
command(param)
for_1(1, square, 3)
输出:
9
答案 1 :(得分:1)
您可以简单地将代码重构为不要return
太早,也不必太早调用。
为此,将函数和参数拆分为for_1包装器的两个参数。 如果要返回值,请将它们收集在for循环中,并将它们作为列表返回。
def for_1(y, do_something, with_param):
for x in y:
do_something(with_param)
for_1(range(3), print, "bob")
答案 2 :(得分:0)
立即评估打印结果并传递其返回值。您要在此处传递可调用对象,并将()附加到循环内的do_something中。您可以将lambda用作传入的函数。
def for_1(y, do_something):
def wrapped():
return for x in y:
do_something() # so we call whatever is passed in to be executed at this point
return wrapped
f = for_1(range(3),lambda: print("bob\n"))
f()
# or equivalent:
def print_bob():
print("bob\n")
for_1(range(3),print_bob)