Python:空字符串被评估为' false'

时间:2016-10-25 11:18:04

标签: python base

我可能处于一种独特的情况,即将空字符串评估为true将节省几行代码。 (我理解空字符串评估为false。如下所示)

''  and print ("empty string is true")
'0' and print ("non-empty string is true")

> non-empty string is true

原因如下:

这没关系。但请查看输出。

 def baseN(num,b):
    return (num == 0) and "0" or 
           (baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])

> baseN(32,16)
> 020

更改最后一个结果(在递归结束时)以打印出空字符串,这给了我错误。

 def baseN(num,b):
    return (num == 0) and "" or 
           ( baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])

> baseN(32,16)
> File "<stdin>", line 2, in baseN
> RuntimeError: maximum recursion depth exceeded in comparison

这显然不起作用,因为(num==0) and "" (false)总是会评估为False - &gt;导致无终止的递归呼叫。

有没有办法只使用逻辑运算/表达式来修复它(没有if / else语句)?

以下内容有效。但它不会只使用逻辑运算符。

def baseN(num,b):
    if (num==0):
       return ""
    else:
        return (baseN(num // b, b) 
               + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])

baseN(32,16)

4 个答案:

答案 0 :(得分:6)

Python有一个三元运算符:

def baseN(num,b):
    return baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b] if num else "" 

答案 1 :(得分:1)

如果我正确理解了这个问题,你想要将空字符串计算为True。

在这种情况下,您可以取消空字符串并将其设为True而不是false:

>>> bool("")
False
>>> bool(not "")
True

答案 2 :(得分:1)

在Python中,空序列被认为是假的,包括字符串。如果列表非空,则列表被视为True,因此上面的代码可用于以下情况:

def baseN(num,b):
    return ''.join((num == 0) and [''] or 
        [( baseN(num // b, b) +  "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])])

就我个人而言,我认为这会让事情变得不那么容易,我会选择使用if语句。

答案 3 :(得分:0)

如果您的目标是缩短代码,那么无论如何您都可以省略else部分:

def baseN(num,b):
    if (num==0): return ""
    return (baseN(num // b, b) 
           + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])

就个人而言,我觉得这更具可读性。