无法定义所需的功能

时间:2016-04-15 05:30:24

标签: python python-2.7 function

我正在阅读一本蟒蛇书,我得到了一个问题:

  

定义一个名为" do_four"的新函数。它接受一个函数对象   和一个值并调用该函数四次,将值作为a传递   参数。在这个问题上应该只有两个陈述   功能,而不是四个。

我试过但现在我想它应该打印16次,但每个功能的主体应该有2个声明。我的代码是

def hello1(a, g):
    a(g)
    a(g)

def hello2(ar):
    print (ar)
    print (ar)

hello1(hello2, "hello")
print("")

def do_four(a, g):
    hello1(a, g)
    hello1(a, g)

do_four(hello2, "hjh")
print("")

def hello3(a, g):
    print (a, g)
    print (a, g)

hello3(do_four, "aad")

我得到了这个输出:

hello
hello
hello
hello

hjh
hjh
hjh
hjh
hjh
hjh
hjh
hjh

<function do_four at 0x1056a9840> aad
<function do_four at 0x1056a9840> aad

有人可以解释我错过了什么,以及我该怎么做?

P.S。 - 我现在不想使用循环。我正在学习各种功能。

7 个答案:

答案 0 :(得分:7)

描述所要求的是这样的

def some_func(arg):
    print(arg)

def do_four(fun, arg):
    for _ in range(0, 4):
        fun(arg)

然后它被称为

do_four(some_func, "foo")

此解决方案使用循环。不确定为什么你厌恶循环,这明确地说明了描述

  

这个函数的主体应该只有两个语句,而不是四个。

如果你真的想在没有循环的情况下这样做(我真的不明白为什么),那么do_four就像

def do_four(fun, arg):
    fun(arg)
    fun(arg)
    fun(arg)
    fun(arg)

修改

如果你真的想在没有循环的情况下这样做,并且每个函数只需要2个语句,那么你可以做...

def do_two(fun, arg);
    fun(arg)
    fun(arg)

def do_four(fun, arg):
    do_two(fun, arg)
    do_two(fun, arg)

答案 1 :(得分:2)

正如user2357112所说,你需要使用一个循环:

def do_four(fun, value):
    for _ in range(4):
        fun(value)

编辑:没有循环,你可以做这个黑客:

def do_four(fun, value):
    [fun(value), fun(value), fun(value), fun(value)]

但这是一个 非常丑陋的 黑客。你需要学习如何使用循环,而不是如何编写臭代码。

答案 2 :(得分:0)

这个问题想要你编写一个可以这样调用的函数:

do_four( say_hello, "you" )

当你试图以相反的方式写它时。你正在学习功能 - 好!理解功能是你可以传递给其他功能的东西,这是解决这个问题的关键,也可能是你应该从这个练习中采取的方法。

答案 3 :(得分:0)

使用递归:

def do_four(fn, arg, n=4):
    if n:
        do_four(fn, arg, n-1) or fn(arg)

或使用1行身体

def do_four(fn, arg, n=4):
    not n or do_four(fn, arg, n-1) or fn(arg)

答案 4 :(得分:0)

如果您只想要两个语句,那么使用模数:

for index in range(4):
    if index%2 == 0:
        print("foo")

这给出了:

foo
foo

所以在你的情况下:

def some_func(arg):
    print(arg)

def do_four(fun, arg):
    for index in range(0, 4):
        if index%2 == 0:
            fun(arg)

希望这可以提供帮助。问候Chri

修改 Sry,我没有回答这个问题(一个函数中的两个语句)

答案 5 :(得分:0)

您可以将递归与可选参数一起使用以避免循环,但这需要函数内至少3个语句:

def do_four (func, arg, repeat=4):
    if repeat > 0:
        func(arg)
        do_four(func, arg, repeat-1)

答案 6 :(得分:0)

尝试使用此代码:

mongoimport -j 4 -d blog -c posts --drop posts.json