2020-02-26 17:32:29

一行Python代码能实现什么奇葩功能?

17 / 0 / 0 / 0

作者: Crossin的编程教室 来源: Crossin的编程教室

如果只允许你写一行代码,你能够实现什么样的功能?今天我们来看看这 16 行丧(gan)心(de)病(piao)狂(liang)代码。

输出Mandelbrot图像

mandelbrot 图像中文名叫曼德勃罗图像。Mandelbrot 图像中的每个位置都对应于公式 N=x+y*i 中的一个复数。其实数部分是 x,虚数部分是 y,i 是 -1 的平方根。图像中各个位置的 x 和 y 坐标对应于虚数的 x 和 y 部分。百度百科给出的图形是这样的。

看不懂?没关系,我们直接来看效果。(左右滑动查看所有代码)

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)]))  

九九乘法表

还记得我们熟记于心的九九乘法表吗?来,我们来巩固下,我们用一行代码打印出来。(左右滑动查看所有代码)

print('\n'.join([' '.join(['%s*%s=%-2s' % (y, x, x*y) for y in range(1, x+1)]) for x in range(1, 10)]))

一行打印心型图案

不会表白?一行代码告诉你!

print('\n'.join([''.join([('AndyLove'[(x-y)%8]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(15,-15,-1)]))  

美丽的螺旋

你觉得上面的心型图案不够浪漫?那么试试下面这个美丽的螺旋?在 Python 编译器中输入下面的代码。(左右滑动查看所有代码)

exec("""\nfrom turtle import *\nfor i in range(500): \n    forward(i)\n    left(91)\n""")  

看下执行过程中的部分动态图。

再截图一张大图看下,是不是很漂亮、很炫酷!

这个画图库用的是 turtle 库。

计算出1-100之间的素数

素数又称质数。一个大于 1 的自然数,除了 1 和它自身外,不能整除其他自然数的数叫做素数;

print(' '.join([str(item) for item in filter(lambda x: not [x % i for i in range(2, x) if x % i == 0], range(2, 101))]))

结果是:

一行代码输出斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为『兔子数列』,这个数列从第 3 项开始,每一项都等于前两项之和。

print([x[0] for x in [(a[i][0], a.append([a[i][1], a[i][0]+a[i][1]])) for a in ([[1, 1]], ) for i in range(30)]])

看下执行结果:

一行代码实现快排算法

快速排序是一种经典而高效的排序算法。

quickSort = lambda array: array if len(array) <= 1 else quickSort([item for item in array[1:] if item <= array[0]]) + [array[0]] + quickSort([item for item in array[1:] if item > array[0]])  
array = [9, 11, 88, 32, 8]  
print(quickSort(array))

打印 Python 之禅

你们知道 Python 之禅么?知道『人生苦短,我用 Python』这句经典的出处么?用下面一行代码就可以打印 Python 之禅。(左右滑动查看所有代码)

>>> import this  
The Zen of Python, by Tim Peters  

Beautiful is better than ugly.  
Explicit is better than implicit.  
Simple is better than complex.  
Complex is better than complicated.  
Flat is better than nested.  
Sparse is better than dense.  
Readability counts.  
Special cases aren't special enough to break the rules.  
Although practicality beats purity.  
Errors should never pass silently.  
Unless explicitly silenced.  
In the face of ambiguity, refuse the temptation to guess.  
There should be one-- and preferably only one --obvious way to do it.  
Although that way may not be obvious at first unless you're Dutch.  
Now is better than never.  
Although never is often better than *right* now.  
If the implementation is hard to explain, it's a bad idea.  
If the implementation is easy to explain, it may be a good idea.  
Namespaces are one honking great idea -- let's do more of those!

给大家一个参考的翻译:

优美胜于丑陋。
显式胜于隐式。
简单胜于复杂。
复杂胜于难懂。
扁平胜于嵌套。
稀疏胜于紧密。
可读性应当被重视。
尽管实用性会打败纯粹性,特例也不能凌驾于规则之上。
不要忽略任何错误,除非你确认要这么做
面对不明确的定义,拒绝猜测的诱惑。
找到一种最好唯一的一种方法去解决问题。
虽然一开始这种方法并不是显而易见,因为你不是 Python 之父。
做好过不做,但没有思考的做还不如不做
如果实现很难说明,那它是个坏想法。
如果实现容易解释,那它有可能是个好想法。
命名空间是个绝妙的想法,请多加利用。

看漫画

导入一个包就能看漫画,执行代码后系统会自动打开漫画的页面。

import antigravity  

给大家一个参考的翻译:

上图:
“你在飞!怎么做到的?”
“Python!”

下左:

“我昨晚学习了 Python,一切都是那么简单”

“运行 HELLO WORLD 只需要 print “Hello World!””

下中:
“我还是不明白……动态类型,还是空格?”

“来加入我们吧,编程又再次变得有趣起来了,Python 是一个全新的世界”

“但你是怎么飞起来的?”

下右:

“我只是输入了 import antigravity”

“就这样?”

“我还对药品柜中的所有东西进行了采样比较”(暗指他对比过多种编程语言,但还是觉得 Python 最简单)

“但我想这就是 Python.”

单线迷宫

cmd 命令下输入下列代码实现单线迷宫。

python -c "while 1:import random;print(random.choice('|| __'), end='')"

一行代码开启 web 服务

使用此命令,建立一个内网可以快速访问的 WEB 服务。

python -m http.server 8080  

输入 http://localhost:8080/ 网站就可以访问的 WEB 服务了。

迷你老虎机

用随机的 unicode 字符打样出来,完美模拟了老虎机的效果,按回车键停止。请看下面动态图。

python -c "import random;p=lambda:random.choice('7♪♫♣♠♦♥◄☼☽');[print('|'.join([p(),p(),p()]),end='\r') for i in range(8**5)]”  

一行代码解决八皇后问题

什么是八皇后问题?我们看下百度百科的解释:八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 96 种方案。1854 年在柏林的象棋杂志上不同的作者发表了40 种不同的解,后来有人用图论的方法解出 92 种结果。计算机发明后,有多种计算机语言可以解决此问题。

用下列代码可以列出所有结果,共 92 种。

[__import__('sys').stdout.write('\n'.join('.' * i + 'Q' + '.' * (8-i-1) for i in vec) + "\n========\n") for vec in __import__('itertools').permutations(range(8)) if 8 == len(set(vec[i]+i for i in range(8))) == len(set(vec[i]-i for i in range(8)))]  

将多维数组转化为一维

一行代码将多维数组转化为一维数组。

print([i for item in ab for i in item])  

给出一个多维数值 ab,通过这个方法变成一维数组。

ab = [[1, 2, 3], [5, 8], [7, 8, 9]]  
print([i for item in ab for i in item])  

# 结果  
[1, 2, 3, 5, 8, 7, 8, 9]

求解 2 的 1000 次方的各位数之和

2 的 1000 次方的值很大,把结果每位数都加起来等于多少呢?

print(sum(map(int, str(2**1000))))  

# 结果   
1366

祝福

最后,送给各位:爱你三千遍!

print("I Love You!\n" * 3000)

你觉得还有哪些好玩的、有意思的一行代码实现的功能,欢迎留言!

PS: 如本文对您有疑惑,可加QQ:1752338621 进行讨论。

0 条评论

0
0
官方
微信
官方微信
Q Q
咨询
意见
反馈
返回
顶部