Beautiful is better than ugly. ------Python之禅
01【引子】
我们知道,Python是一门简单、易学的编程语言,“Python之禅”里面很多想法融入到这门语言的方方面面。
Python之禅
你可以通过“import this”来了解"Python之禅"哦!
但是,小伙伴们,它真的简单吗?
保持简单
让我们来看一看Python写的下面一段:
print('\n'.join([''.join([('love'[(x-y)%len('love')] 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)]))
是不是很难懂
哪个小伙伴能轻松读懂这句话呢?
02【这句话干了什么?】
我们先不分析,将这句话粘贴到编译器中看看结果吧(将编译器字体设置为非等宽字体)!
程序运行结果
对,你没看错,情人节的礼物先到了!
情人节的礼物
短短的一行代码打印出了如此复杂的图案!这是怎么回事?
03【列表推导式】
熟悉Python的小伙伴肯定一眼就能看出来,这里使用了列表推导式(List Comprehensions),它是Python内置的非常简单却强大的,可以用来创建列表的推导式。
上面例子中其实是将我们生成的列表通过join()函数连接成了字符串的效果。
先来看一个简单的例子
print([i ** 2 for i in range(10)])
>>>
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
这个例子是将0-9的平方数打印出来。上面的例子其实等价于
lst = []
for i in range(10):
lst.append(i)
print(lst)
无形中节省了4行代码。上面那一句中print()函数里包裹的我们称之为列表推导式。它大概长这样:
[表达式 for 迭代变量 in 可迭代对象]
或者加入判断,比如,我们想挑出0-9平方数里面大于50的数并打印。
print([i ** 2 for i in range(10) if i ** 2 > 50])
加入判断后,格式应该是这样的:
[表达式 for 迭代变量 in 可迭代对象 if 条件语句]
04【字典推导式】
这个列表推导式不仅仅适用于列表,其他可迭代对象,如字典等都可以使用类似的方法。只不过名称要稍微变一下哦。列表叫列表推导式,那字典就叫字典推导式咯,看下面的例子。
字典同样适用
dic = {1:'Alex', 2:'boby', 3:'cerry', 4:'Dallen', 5:'evea'}
如果我们想打印输出时将字典中的值都改为标题格式(第一个字母大写),如何处理呢?
tmp_dic = {}
for key in dic.keys():
tmp_dic[key] = dic.get(key, None).title()
print(tmp_dic)
使用字典推导式就相对简单一点了,就一句话。如下
print({i:j.title() for i, j in zip(dic.keys(), dic.values())})
05【列表推导式还有哪些骚操作呢?】
最近在网上整理了一些Python一句话能实现的一些案例。大家参考下!
一句话打印输出26个字母
print(''.join([chr(i) for i in range(97,123)]))
打印输出26个字母
一句话打印乘法口诀
print('\n'.join([' '.join(["%2s x%2s = %2s"%(j,i,i*j) for j in range(1,i+1)]) for i in range(1,10)]))
一句话打印乘法口诀
一句话打印一个迷宫
print(''.join(__import__('random').choice('\u2571\u2572') for i in range(50*24)))
一句话打印迷宫
06【写在最后】
看了这些一句话产出的东西,大家肯定觉得头大了,不知所以然,或许只有作者理解其中的意思。因此,这里建议大家涉及多个循环嵌套的列表推导式,还是脚踏实地,一步一步写比较好,不然时间长了自己都不认识了(或者自己再去理解得花费很长时间),这跟Python之禅中“Beautiful is better than ugly.”是冲突的。
娱乐即可
上面的内容,大家娱乐下就好了,能理解当然更好,祝大家新年快乐!
觉得好看不要吝啬您的赞,您的评论点赞是我写下去的动力,喜欢Python的小伙伴关注我,后续推出更加精彩的内容,[emm]你也可以关注我往期的内容哦!
本文作者原创,转载请私信作者!