python用一行代码编写一个回声程序_如何用Python写一行“优雅的”代码?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值