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. 语法讲解

之前我们已经学会了用一行代码打印爱心的操作了,并且在这个过程中学习了.join()语法以及列表中的循环操作,今天,我们就通过打印一只小海龟,来重温这些用法,并且引入一个之前没有使用到的语法lambda表达式

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表达式

PS:.join()以及列表循环的解释可以参考一行代码打印爱心

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

猜你喜欢

转载自juejin.im/post/7127687759598682143
今日推荐