python 一行代码打印小海龟
1. 先放代码
print('\n'.join([''.join(['*' if abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0 else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40))<2 else ' ' for x in range(-80,20)]) for y in range(-20,20)]))
2. 语法讲解
2.1 代码逻辑梳理
思路照旧,直接看一行代码的实现,大家都会觉得逻辑耦合的过紧了,这样非常不利于我们梳理清楚其实现的逻辑,所以这里给出一个我们更容易梳理清楚的代码版本:
for y in range(-20,20):
for x in range(-80,20):
if abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0 else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40))<2:
print('*',end='')
else:
print(' ' ,end='')
print()
相信通过这个版本,大家对于这次一行代码究竟做了什么,已经了然于胸了。
依旧是熟悉的两层循环以及if-else判断,与之前最大的不同,是if判断的条件变成了一串又长又复杂的东西abs((lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0 else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40))<2
,这也是我们今天要解释的重点,lambda表达式
。
2.2 lambda表达式
在Python中有两种函数,一种是def定义的函数,另一种是lambda函数,也就是大家常说的匿名函数,即不依靠def来创建函数的另一种方式。
lambda表达式有以下两种适用方式:
# 创建一个变量后使用
square2 = lambda n: n ** 2
print(square2(2)) # 4
# 直接使用
(lambda n: n ** 2)# 4
好了,有了基本的认识,我们来看一看上面的lambda表达式:
(lambda a:lambda z,c,n:a(a,z,c,n))(lambda s,z,c,n:z if n==0 else s(s,z*z+c,c,n-1))(0,0.02*x+0.05j*y,40)
依旧很逆天...但是没有关系,我们来一点点的梳理:
首先,对于lambda a而言,我们将它理解成下面的形式:
(lambda a:xxx)(lambda s,z,c,n:xxx)(0,0.02*x+0.05j*y,40)
即对于lambda a 而言,(lambda s,z,c,n:xxx)就是对应传入的参数a,所以就可以进行下面的转化:
# (lambda a:lambda z,c,n:a(a,z,c,n))
(lambda z,c,n:(lambda s,z,c,n:xxx)((lambda s,z,c,n:xxx),z,c,n))(0,0.02*x+0.05j*y,40)
(0,0.02*x+0.05j*y,40)
就是lambda z,c,n
的三个参数,即z,c,n参数都是我们给定的,剩下的lambda a 就是一个递归的过程,截止条件是n==0
。
转载自:https://juejin.cn/post/7127687759598682143