likes
comments
collection
share

python 一行代码打印爱心

作者站长头像
站长
· 阅读数 5

1. 先放代码

print('\n'.join([''.join([('o'[(x-y) % len('o')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]))

2. 语法讲解

2.1 代码逻辑梳理

首先,为了更清晰的分析上面一行代码的逻辑关系,我们将其拆解成下面一个逻辑上更直观清晰的代码书写方式:

str = "o"
for y in range(30, -30, -1):
    for x in range(-30, 30):
        if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0:
            print(str[(x-y) % len(str)], end='')
        else:
            print(' ', end='')
    print()

芜湖,思路一下子就清晰起来来,其实绘制图形的思路就是在一个30✖️30的区域内,对于符合x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0约束的格子,按顺序填入str中的字母。

知道了绘制图形的大致流程,我们进可以对于一行代码所涉及到的一些语法以及使用技巧进行梳理了。

2.2 .join()

Python join() 方法用于将序列中的元素以指定的字符连接生成一个新的字符串,用法如下:

str = "-"
seq = ("a", "b", "c") # 字符串序列 
print str.join( seq )

这样输出的结果如下面所示:

a-b-c

通过上面的例子,我们可以清楚的了解到,str.join(seq)方法的用法是以前面的str为间隔,连接seq字符串序列中的每一个元素。

所以一行代码的第一层我们就能梳理清楚了:

'/n'.join(seq1)

后面我们来看seq1中的内容:

''.join(seq2)

seq1中又套了一层与上面类似的语法,那我们直接将注意力放在seq2中:

[('o'[(x-y) % len('o')] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(30, -30, -1)]

这里是在列表中的两层循环,外层对于y的循环是从-30到30的循环,内层是对x的从-30到30的循环,在每一位,根据判断的情况,打印o或者