与 python 中的解包混淆
Confusion with unpacking in python
这基本上是我正在解决的代码高尔夫问题。声明如下:
Given N, X and a line with X numbers between 0 and 9. Print all valid numbers between 0 and N inclusive. A number is valid if all of your digits are in line. If the sequence is empty, print NONE.
这是我的第一次尝试:
n,x=map(int,input().split())
d=set(input().split())
print(*[v for v in range(n+1)if not set(str(v)).difference(d)]or'NONE')
为什么 python 在这里解压字符串 'NONE'?这不应该是一个简单的短路,其中 python 如果不为空则打印解压缩列表或者完整打印完整字符串?
如果您尝试一个更简单的示例,例如:
print(*[] or 'Test')
你会看到:
T e s t
因为调用实际解析为:
print(*([] or 'Test'))
由于优先规则。否则,表达式 print((*[]) or 'Test')
甚至没有任何意义。相反,尝试:
print(*[] or ['Test'])
这会像您预期的那样工作。
显然,Starred
具有更高的优先级:
>>> import ast
>>> print(ast.dump(ast.parse("print(*[] or 'NONE')"), indent=2))
Module(
body=[
Expr(
value=Call(
func=Name(id='print', ctx=Load()),
args=[
Starred(
value=BoolOp(
op=Or(),
values=[
List(elts=[], ctx=Load()),
Constant(value='NONE')]),
ctx=Load())],
keywords=[]))],
type_ignores=[])
如您所见,Starred
应用于 BoolOp
,这是具有两个操作数的 or
运算符:列表和字符串 'NONE'
。所以你可以像这样放置括号:
print(*( [] or 'NONE'))
换句话说,解包将应用于[<your list here>] or 'NONE'
的结果。
注意:为了简洁起见,我已将您的列表理解替换为空列表 []
。
这基本上是我正在解决的代码高尔夫问题。声明如下:
Given N, X and a line with X numbers between 0 and 9. Print all valid numbers between 0 and N inclusive. A number is valid if all of your digits are in line. If the sequence is empty, print NONE.
这是我的第一次尝试:
n,x=map(int,input().split())
d=set(input().split())
print(*[v for v in range(n+1)if not set(str(v)).difference(d)]or'NONE')
为什么 python 在这里解压字符串 'NONE'?这不应该是一个简单的短路,其中 python 如果不为空则打印解压缩列表或者完整打印完整字符串?
如果您尝试一个更简单的示例,例如:
print(*[] or 'Test')
你会看到:
T e s t
因为调用实际解析为:
print(*([] or 'Test'))
由于优先规则。否则,表达式 print((*[]) or 'Test')
甚至没有任何意义。相反,尝试:
print(*[] or ['Test'])
这会像您预期的那样工作。
显然,Starred
具有更高的优先级:
>>> import ast
>>> print(ast.dump(ast.parse("print(*[] or 'NONE')"), indent=2))
Module(
body=[
Expr(
value=Call(
func=Name(id='print', ctx=Load()),
args=[
Starred(
value=BoolOp(
op=Or(),
values=[
List(elts=[], ctx=Load()),
Constant(value='NONE')]),
ctx=Load())],
keywords=[]))],
type_ignores=[])
如您所见,Starred
应用于 BoolOp
,这是具有两个操作数的 or
运算符:列表和字符串 'NONE'
。所以你可以像这样放置括号:
print(*( [] or 'NONE'))
换句话说,解包将应用于[<your list here>] or 'NONE'
的结果。
注意:为了简洁起见,我已将您的列表理解替换为空列表 []
。