用单行编写Python代码
我可以把下面的代码写成一行吗?
t=int(input())
while t:
t-=1
n=int(input())
a=i=0
while not(n&1<<i):
i+=1
while n&1<<i:
n^=1<<i
a=a*2+1
i+=1
print(n^1<<i)+a/2
如果不行,那我怎么才能把这段代码写得尽量少呢?
(顺便说一下,我可以把它缩减到6行,能不能再少一点)
我的解决方案t=int(input())
while t:
t-=1;n=int(input());a=i=0
while not(n&1<<i):i+=1
while n&1<<i:n^=1<<i;a=a*2+1;i+=1
print(n^1<<i)+a/2
谢谢
2 个回答
0
在Python中,不建议经常把代码行缩减成一行,因为这样会失去Python著名的简单和清晰的特点。而且,很多时候你也不能把代码行缩减,因为缩进的层级是用来定义代码块结构和嵌套关系的。
不过,如果你真的想要一个简化版:
print "s0"
while True:
print "s1"; print "s2"
while True: print "s3"
while True: print "s4"; print "s5"; print "s6"
print "s7"
(这里为了简单起见,你的表达式被替换成了True
)
3
因为Python的列表推导式
是完全可计算的,并且不需要换行,所以任何程序都可以写成Python的一行代码。
如果你强行设置一些任意的限制(比如“语句的顺序”——这到底是什么意思?是执行顺序吗?还是在源代码中第一次出现的顺序?),那么答案是:你可以去掉一些换行,但不是全部。
比如说,你可以这样写:
if x:
do_stuff()
你也可以这样:
if x: do_stuff()
再比如:
x = 23
y = 42
你可以这样:
x,y = 23, 42
还有:
do_stuff()
do_more_stuff()
你可以这样做:
do_stuff; do_more_stuff()
如果你真的非常非常需要,你可以用exec
把一个多行的Python程序压缩成一行,这样你的程序就变成了:
exec('''t=int(input())\nwhile t:\n t-=1;n=int(input());a=i=0\n while not(n&1<<i):i+=1\n while n&1<<i:n^=1<<i;a=a*2+1;i+=1\n print(n^1<<i)+a/2\n''')
但是如果你在“真正”的代码中这样做,比如说,不只是为了好玩,那就会有麻烦。