前言
python中有个很酷的效果,一行代码实现一个爱心字符,虽说是一行代码,但是理解起来还是比较难的,括号太多,并且使用了python的一些快捷小技巧。比如三元表达式,列表生成式,字符串拼接以及一个心形曲线公式:(x2+y2-1)3-x2y3=0。
下面通过分解来理解这行代码,这里主要理解三元表达式,列表生成式,还有就是循环中的数字为什么是-30,30和30,-30。
三元表达式理解
三元表达式其实就是将ifelse语句一行书写,格式为:result=为真实的结果if判断条件else为假时的结果。
列表生成式理解
原理分析
最终结果是一个爱心的字符串形状,实际上先打印出60行和60列的字符串方阵,这里为了演示,先使用了一个字符串。
根据上面的效果可以看出的确是一个字符方阵,如何将这个方阵变成爱心的形状,就需要利用心形曲线公式:(x2+y2-1)3-x2y3=0。这里我们如果小于0就显示字符O,否则就显示点(.)。
爱心形状出来了,如果想要只保留爱心形状,只需要将外围一圈O写成空字符就可以了。现在还有循环中的数值范围是如何求得不清楚。
这里就涉及到解方程了,求边界的范围。
求解边界范围
通过sympy库,可以直接使用隐函数公式,不用给定一系列点就可以直接绘制出图形来,非常方便,根据图形可以看出x和y取值范围。
绘制散点图
上面求出的范围非常小,有点没想到,我们通过这个范围去绘制一个散点图试试。
理解
根据结果可以看出的确是一个个点形成的,由于点比较多,显示区间比较小,整体看上去就像一个爱心的效果了。
这里有些方法可能比较难理解,可以结合下面的两张图片理解,它们的作用就是将满足条件地点的x和y坐标分别提取出来,为后面绘图做准备。
如果不好理解,也可以采用下面这个方法,更好理解。
打印爱心字符图形
前面利用散点图的方式,绘制出了一个爱心图形,实际上是由一个个点组成的,如果将点用字符来替代,那么就可以变成字符图形了。这里的arange中的数字间隔0.1,根据你想要的点多少可以调整。
上面的0.1的间隔显得有点细长,让横向的点多一些,就可以变得圆润一点了。
将当个字符改成字符串,利用字符串的索引可以获取到不同的字符,也可以使用随机方法去选取。
解开疑惑
通过上面动手自己实现,可以知道实际上爱心的边界范围,但是单行中确是-30,30,这里是因为它的x和yj乘以了一个比较小的数进行的缩放,从而放大了它的取值范围,原理和我们上面调整arange中的间隔数字大小是一样的。
(全文完)
显示进度下载图片
如何使用python实现文本进度条?
建构主义教学的核心是什么?
python小游戏设计入门5-捡金币游戏(下)