坚持打印并返回

时间:2015-10-11 09:51:53

标签: python python-2.7 printing return

def isItEven2(n):

    if (n%2 == 0):
      print('true it is even')
    else:
      print('false it is not even')

def isInCenter2(n):

      if (n>100):
        print('true it is center')
      else:
        print('false it is not center')

def seatLocation2(n):

    if isItEven2(n) and not isInCenter2(n):
          print 'check1'
          return "Right"
    elif not isItEven2(n) and not isInCenter2(n):
          print 'check2'
          return "Left"
    else:
      return "Center"

def seatLocation3(n):

    if not isInCenter2(n) and isItEven2(n):
        print 'check1'
        return "Right"
    elif not isInCenter2(n) and not isItEven2(n):
        print 'check2'
        return "Left"
    else:
        return "Center"

seatLocation2(n)seatLocation3(n)表现不同,有人能告诉我为什么seatLocation2(n)和seatLocation3(n)的输出有所不同吗?真的花了很多时间来搞清楚。

以下是示例输出

致电seatLocation2(2)时的输出:

true it is even
true it is even
false it is not center
check2

并在致电seatLocation3(2)时输出:

false it is not center    
true it is even 
false it is not center
true it is even
check2
Out[1043]: 'Left'

我知道我使用了print,所以我得到None值,所以最好使用return将值传递给其他函数。我只想解释执行过程中遵循的步骤。

3 个答案:

答案 0 :(得分:1)

您需要从TrueFalse函数返回一些内容(isItEven2 / isInCenter2)。

def isItEven2(n):
    if (n%2 == 0):
      print('true it is even')
      return True
    else:
      print('false it is not even')
      return False
def isInCenter2(n):
  if (n>100):
    print('true it is center')
    return True
  else:
    print('false it is not center')
    return False

答案 1 :(得分:0)

当您从函数返回None时,它将被解释为False。在您的情况下,无论' n'的价值如何,函数的第二个条件&seat;座位2(n)'和seatlocation3(n)将被执行,因为你不是两个' isItEven'和' isItCenter'。这足以解释代码流。

代码流将精确地遵循以下步骤:

  1. 函数seatlocation2(n)被称为

  2. 在if条件中调用isItEven()函数,结果为False(因为没有),因此条件不会被执行。

  3. 它到了elif区域,它不需要' ofItEven()转换' False'返回值为' True&#39 ;;然后调用isInCenter()返回False; '不'其中是真的。 '和'两者都是真的。这会导致第二个条件始终执行,因为您的函数始终返回None。
  4. 当前逻辑流

    已废弃所有其他条件

答案 2 :(得分:0)

理解两种seatLocation方法的执行差异的关键点是理解两个概念:

  • 具有return语句的方法将返回None,在条件中评估为False
  • 如果可能,条件会短路。也就是说,如果您有condition1 and condition2,而condition1为负数,则永远不会费心找出condition2是什么,因为最终结果将始终为负数

好的,在你的代码中,函数总是返回None(或False可以这么说),所以当单步执行seatLocation2(2)时,我们得到:< / p>

  • 检查if isItEven2(2) and not isInCenter(2)
    • 它会调用isItEven2(2)来打印&#34;这是偶数&#34;
    • 但它返回None,这是假的,因此它会突破if
  • 检查elif not isItEven2(2) and not isInCenter2(2)
    • 它会调用not isItEven2(2)来打印&#34;这是偶数&#34;
    • 但它返回None这是假的,但它被否定(not)所以仍然可以成为True
    • 它调用not isInCenter2(2)打印&#34;假它不是中心&#34;
    • 但它返回None这是假的,但是否定(not)为真
  • 所以我们输入if
    • print&#34; check2&#34; (并返回&#34;左和#34;您从样本输出中省略)

另一方面,如果我们按照seatLocation3(2)进行操作,则会出现这样的情况:

  • 检查if not isInCenter2(2) and isItEven2(2)
    • 调用not isInCenter2(2)打印&#34;假它不在中心&#34;
    • 但返回被忽略的None,因此我们必须继续进行测试
    • 调用isItEven2(2)打印&#34;如果它是偶数&#34;
    • 但返回`None&#34;这是假的,我们打破了if
  • 检查elif not isInCenter2(2) and not isItEven2(2)
    • 调用not isInCenter2(2)打印&#34;假它不在中心&#34;
    • 但返回被忽略的None,因此我们必须继续进行测试
    • 调用not isItEven2(2)打印&#34;如果它是偶数&#34;
    • 但返回`None&#34;这是假的,否定为真,所以整体表达是真的
  • 所以我们再次输入if块
    • 并打印&#34; check2&#34;,并返回&#34;左&#34;

所以他们确实表现得相同,这意味着你的两个函数都会返回None,但是由于你左边或右边的not不一样,看起来他们行为不端。但是当你有类似False and ...的东西时,做布尔短路,第二部分永远不会被执行。