显示IF语句的该函数与IF语句的工作方式不同

时间:2012-01-21 19:06:38

标签: python-3.x

这是一个我无法解决的家庭作业问题:

问题开始

Q3。让我们尝试编写一个与if语句完全相同的函数:

def if_function(condition, true_result, false_result):

    """Return true_result if condition is a true value, and false_result otherwise."""

    if condition:
        return true_result
    else:
        return false_result

在所有情况下,此函数实际上与if语句不同。为了证明这一点,写函数c,t和f使得其中一个函数返回数字1,但另一个函数不返回:

def with_if_statement():

    if c():
        return t()
    else:
        return f()

def with_if_function():

    return if_function(c(), t(), f())

问题结束

这是我想到的:

如果c()为true,则

with_if_statement()不计算f(),但是在检查c()是否为真之前,with_if_function()会计算所有3。

所以,我想到在c()中分配一个全局变量,并在f()中改变它的值

继承我的代码(不起作用):

def c():

    try:
        global x
    except NameError:
        x=1
    if x==1:
        return True
    else:
        return False

def t():

    if x==1:
        return (1)
    else:
        return (0)

def f():

    global x
    x=2
    if x==1:
        return (1)
    else:
        return (0)

任何人都可以帮我找出答案吗?谢谢..!

2 个答案:

答案 0 :(得分:2)

global语句不应抛出NameError(因此您不会在x=1中运行c()。我会尝试使用异常重写您的代码而不使用,他们没有必要解决这个问题并且使它变得比它需要的更复杂。使用全局变量并在函数中产生副作用肯定是正确的方法。

答案 1 :(得分:2)

def if_function(condition, true_result, false_result):
    """Return true_result if condition is a true value, and
    false_result otherwise.

    >>> if_function(True, 2, 3)
    2
    >>> if_function(False, 2, 3)
    3
    >>> if_function(3==2, 3+2, 3-2)
    1
    >>> if_function(3>2, 3+2, 3-2)
    5
    """
    if condition:
        return true_result
    else:
        return false_result


def with_if_statement():
    """
    >>> with_if_statement()
    1
    """
    if c():
        return t()
    else:
        return f()

def with_if_function():
    return if_function(c(), t(), f())

这个问题要求写下3个函数:ctf,以便with_if_statement返回1with_if_function不会返回1(它可以做任何其他事情)

一开始,问题似乎很荒谬,因为从逻辑上讲,with_if_statementwith_if_function是相同的。但是,如果我们从解释器视图中看到这两个函数,它们就不同了。

函数with_if_function使用一个调用表达式,该表达式保证在将if_function应用于结果参数之前评估其所有操作数子表达式。因此,即使c返回False,也会调用函数t。相比之下,如果with_if_statement返回False,则t将永远不会调用c。(此段落来自UCB网站)。

def c():
    return True

def t():
    return 1

def f():
    '1'.sort() # anything breaks the program is OK