2017-09-08 44 views
1

Think Python,第二版,作者将条件表达式定义为”根据条件,具有两个值之一的表达式“。但是我反映了它之后,我一直认为定义的准确性可能是值得怀疑。下面是其使用条件表达式编写的函数:是“根据条件具有两个值中的一个的表达式”。条件表达式的精确定义? “

def get_sign(n): 
    """Returns 1 if n is a positive number, -1 if n is a negative number, 
    or 0 if n is a zero 
    """ 
    return 1 if n > 0 else -1 if n < 0 else 0 

这里条件表达式为1 if n > 0 else -1 if n < 0 else 0。大概还有两个意见:

  • 表达有可能值之一,即1-1,或0

  • 该值取决于两个条件,即n > 0n < 0

那么,作者的定义是否准确,为什么?为什么不呢?是“一个表达式,其值取决于一个或多个条件,并且具有多个值之一(至少两个)。”更准确的定义条件表达式,为什么和为什么不呢?

+4

对于每个条件表达式,只有2个结果。恰恰是第一个表达式的结果之一是另一个条件表达式。 – Carcigenicate

+1

根据条件评估两个子域中的一个子域的表达式。 –

+0

@StevenRumbalski这是一个非常好的定义!它有助于清除这个想法。谢谢。 –

回答

6

您仍然有两个结果。这两个结果中的一个本身依赖于另一个条件表达式不会改变这一点。

我这里加括号来说明我的观点:

1 if n > 0 else (-1 if n < 0 else 0) 

这样表达的结果是这两个选项之一:

  1. 1
  2. -1 if n < 0 else 0

第二个表达本身就是另一个条件l表达。第一个值也只是一个表达式,一旦你对它进行评估,它就有一个值;唯一的区别是它产生一个简单的文字值。所有这些对顶级条件表达式都没有影响,它只处理两个结果。

请注意,只有一个表达式被实际评估。如果其中一个表达式有副作用(在表达式之外改变状态),或者在内存或处理时间方面“昂贵”,则这很重要。例如:

import time 

def sleep10secs(): 
    time.sleep(10) 
    return 'slow' 

print('instant' if True else sleep10secs()) 

将打印instant瞬间,该功能sleep10secs()不叫。