Python:评估为 'false' 的空字符串
Python: Empty string evaluated to 'false'
我可能处于一种独特的情况下,将空字符串评估为 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 -> 导致未终止的递归调用。
有没有办法只使用逻辑 operations/expressions(不使用 if/else 语句)来修复它?
以下将起作用。但它不会只使用逻辑运算符。
def baseN(num,b):
if (num==0):
return ""
else:
return (baseN(num // b, b)
+ "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
baseN(32,16)
如果我对问题的理解正确,您想将空字符串评估为 True。
在那种情况下,您可以只取反一个空字符串并将其设为 True 而不是 false:
>>> bool("")
False
>>> bool(not "")
True
在Python 中,空序列被认为是 False,包括字符串。但是,如果列表非空,则列表被认为是 True,因此您上面的代码在以下情况下可以工作:
def baseN(num,b):
return ''.join((num == 0) and [''] or
[( baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])])
我个人认为这会降低可读性,我会改用 if 语句。
Python 有一个三元运算符:
def baseN(num,b):
return baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b] if num else ""
如果您只是想获得更短的代码,您可以省略 else
部分(如果您仍然要返回的话):
def baseN(num,b):
if (num==0): return ""
return (baseN(num // b, b)
+ "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
就我个人而言,我觉得这更易读。
我可能处于一种独特的情况下,将空字符串评估为 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 -> 导致未终止的递归调用。
有没有办法只使用逻辑 operations/expressions(不使用 if/else 语句)来修复它?
以下将起作用。但它不会只使用逻辑运算符。
def baseN(num,b):
if (num==0):
return ""
else:
return (baseN(num // b, b)
+ "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
baseN(32,16)
如果我对问题的理解正确,您想将空字符串评估为 True。
在那种情况下,您可以只取反一个空字符串并将其设为 True 而不是 false:
>>> bool("")
False
>>> bool(not "")
True
在Python 中,空序列被认为是 False,包括字符串。但是,如果列表非空,则列表被认为是 True,因此您上面的代码在以下情况下可以工作:
def baseN(num,b):
return ''.join((num == 0) and [''] or
[( baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])])
我个人认为这会降低可读性,我会改用 if 语句。
Python 有一个三元运算符:
def baseN(num,b):
return baseN(num // b, b) + "0123456789abcdefghijklmnopqrstuvwxyz"[num % b] if num else ""
如果您只是想获得更短的代码,您可以省略 else
部分(如果您仍然要返回的话):
def baseN(num,b):
if (num==0): return ""
return (baseN(num // b, b)
+ "0123456789abcdefghijklmnopqrstuvwxyz"[num % b])
就我个人而言,我觉得这更易读。