首先,读者可以移步先看一篇博客:Python期末测试 - qq_43549984的博客 - CSDN博客blog.csdn.net
其中代码的“画风”像这样:
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
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;第二,对“主流”学习没什么帮助,属于“歪门邪道”,装×用的。笔者也就是在考试的时候会提交这种代码,其他时候只会将其作为注释写在旁边自娱自乐而已。