python⽤⼀⾏代码编写⼀个回声程序_如何⽤Python写⼀⾏“优
雅的”代码?
⾸先,读者可以移步先看⼀篇博客:Python期末测试 - qq_43549984的博客 - CSDN博客b log.csdn
其中代码的“画风”像这样:
def func3(lst,i=0,d=0):return None if len(lst)<2 else func3(sorted(lst),1,sorted(lst)[1]-sorted(lst)[0]) if i==0 else True if
i==len(lst) else False if lst[i]-lst[i-1]!=d else func3(lst,i+1,d)
是不是感觉眼睛都快看瞎了?
没办法,就是要短,为了⼀⾏,不择⼿段。
这种不管什么函数只写⼀⾏代码,第⼀个单词就是return的风格是笔者在⼤⼀的Python考试中甚是钟爱的⼀种,因为看起来很“优美”,对吧,嘻嘻嘻。
那么,这种“⼀⾏”的代码究竟如何去压缩呢?
⽅法⼀:多重嵌套
类似于return x if a else y的句式,多写⼏层,把逻辑关系都套进去,原本⼏⾏的语句并成⼀⾏,代码⾃然就变短了。例如:
def foo(m,n):
if m<=0 or n<=0:
return None
python新手代码图案如何保存head=(int(str(m)[0])+n)%10
ans=int(str(head)+str(m)[1:])
return ans
改写后为
def foo(m,n):return int(str((int(str(m)[0])+n)%10)+str(m)[1:]) if m>0 and n>0 else None
对于这种逻辑关系不复杂的函数,改写还是⾮常容易的。
⽅法⼆:内置函数加列表解析式
有的时候,答案是分步多个⽣成的,因此⽆法将函数表⽰成简单的逻辑结构,这⾥就需要借助Python⾥丰富的内置函数了。⽐如sum()函数,或者max()函数(这⾥的max函数竟然可以传多个参数进去,⽤C++的我……),join()函数,等等。把这些函数再放在列表解析式当中,就可以⽣成⼀系列值了。例如:
def foo(v,lst):
if v<0:
return None
li=[]
for i in lst:
ans=0
for x in str(i):
ans+=int(x)
if ans/len(str(i))>=v:
li.append(i)
li.sort(reverse=True)
return li
改写后为:
def foo(v,lst):return sorted([i for i in lst if sum(int(x) for x in str(i))/len(str(i))>=v],reverse=True) if v>=0 else None
此外,有的时候主程序⾥需要将列表⾥的值⼀个⼀个print出来,这时可能就需要借助解包符号*,此处不再详述。
⽅法三:函数迭代
都说会⽤函数迭代的⼈才能算编程⼊了门,其实函数迭代如果仅仅是⽤于改写的话还是很容易学的,
例如以下函数:
def foo(n,f):
ans=0
while n:
ans+=n%f
n//=f
return ans
改写成迭代形式为:
def fsum(n,f,ans=0):return ans if n==0 else fsum(n//f,f,ans+n%f)
这⾥只要把握住函数每次循环的逻辑关系就能轻松的改写函数了。
除了以上三种⽅法,还可以借助lambda函数(当然如果能写成⼀⾏基本就是lambda函数了)、设置函
数默认参数(需要的参数以外的变量可以在函数参数⾥初始化)等⽅式来完成改写,此处并未到什么好的例⼦,暂不详述。
⽤了以上⽅法就可以改写⼤部分的函数了,但也只是⼤部分,开篇笔者博客⾥的代码也有⼀些题⽬是⽤了好⼏⾏才写成的,如果有⼤佬愿意来改写,⼗分感谢。
以上的⽅法都只是笔者的浅陋知识,并没有⽤到什么⾼深的技术,就是拿来玩耍的。⽽且,我⼀直在说“改写”,意思就是,不建议第⼀次写就直接写成⼀⾏。毕竟第⼀,容易写错,不利于debug;第⼆,对“主流”学习没什么帮助,属于“歪门邪道”,装×⽤的。笔者也就是在考试的时候会提交这种代码,其他时候只会将其作为注释写在旁边⾃娱⾃乐⽽已。