python画树叶-如何理解python一行代码实现一个爱心字符画?

前言

d29637746398ccb4d4e85f67923e01ed649.png

python中有个很酷的效果,一行代码实现一个爱心字符,虽说是一行代码,但是理解起来还是比较难的,括号太多,并且使用了python的一些快捷小技巧。比如三元表达式,列表生成式,字符串拼接以及一个心形曲线公式:(x2+y2-1)3-x2y3=0。

下面通过分解来理解这行代码,这里主要理解三元表达式,列表生成式,还有就是循环中的数字为什么是-30,30和30,-30。

16f75035620de8fdef5844471218fc66c01.png

三元表达式理解

三元表达式其实就是将if else语句一行书写,格式为:result = 为真时的结果 if 判断条件 else 为假时的结果。

7ee21e0e18cad9a375ff7ef7bb58f4e5b1d.png

列表生成式理解

dbdc5a2677c731c6d14c21ae776ff696b8e.png

原理分析

最终结果是一个爱心的字符串形状,实际上先打印出60行和60列的字符串方阵,这里为了演示,先使用了一个字符串。

de41cc0af3ad77923c2db70cd4f5460227f.png

根据上面的效果可以看出的确是一个字符方阵,如何将这个方阵变成爱心的形状,就需要利用心形曲线公式:(x2+y2-1)3-x2y3=0。这里我们如果小于0 就显示 字符 O,否则就显示 点(.)。

a3e8c62d9eb2e00083a52667b486a10e8f8.png

爱心形状出来了,如果想要只保留爱心形状,只需要将外围一圈O写成空字符就可以了。现在还有循环中的数字范围是如何求的不清楚。

这里就涉及到解方程了,求边界的范围。

求解边界范围

通过sympy库,可以直接使用隐函数公式,不用给定一系列点就可以直接绘制出图形来,非常方便,根据图形可以 看出x和y取值范围。

07dbdf206eed52ba0cdab6e2545a8be4e3a.png

bca71b88c93db62a7eb3467ccf886712c3c.png

绘制散点图

上面求出的范围非常小,有点没想到,我们通过这个范围去绘制一个散点图试试。

3201b77cb3038ac2c1a8659b992e3cd26de.png

58b903bffa7867e10f1b622bd4f0253ce6c.png

bbaa34811babaca2cd0f2b3b69aafec7f41.png

理解

根据结果可以看出的确是一个个点形成的,由于点比较多,显示区间比较小,整体看上去就像一个爱心的效果了。

这里有些方法可能比较难理解,可以结合下面的两张图片理解,它们的作用就是将满足条件的点的x和y坐标分别提取出来,为后面绘图做准备。

44cd56842346b1b4cbe82cc15a9b8bd8f19.png

4b02bc14b772eab4872a480ad1ac720bdd5.png

如果不好理解,也可以采用下面这个方法,更好理解。

c856b35b2a2a4e3e4898e2443b1a46e1b5e.png

打印爱心字符图形

前面利用散点图的方式,绘制出了一个爱心图形,实际上是由一个个点组成的,如果将点用字符来替代,那么就可以变成字符图形了。这里的arange中的数字间隔0.1,根据你想要的点多少可以调整。

4aa7e15357a6b365b45b4b8f7d5c9e1d886.png

67d844a829a5abd025355682de0f1915921.png

上面的0.1的间隔显得有点细长,让横向的点多一些,就可以变的圆润一点了。

58c205e9a8c1097b8b9a7c95885dff6f484.png

将单个字符改成字符串,利用字符串的索引可以获取到不同的字符,也可以使用随机方法去选取。

aadf3da6161ec8f252fdb5573c496b5ae49.png

解开疑惑

通过上面动手自己实现,可以知道实际上爱心的边界范围,但是单行中确是-30,30,这里是因为它的x和yj乘以了一个比较小的数进行的缩放,从而放大了它的取值范围,原理和我们上面调整arange中的间隔数字大小是一样的。

46d91b4cdccbcd9e3b7a4328f6c89383fac.png

(全文完)

长按二维码,加关注!叶子陪你玩

37d0f5055556312fc845da1eaea6a821d3e.jpg

欢迎转载,转载请注明出处!

欢迎关注公众微信号:叶子陪你玩编程 分享自己的python学习之路

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值