一行Python代码

Life is short, just use Python.

自从08年接触Python,就有爱不释手的感觉,逐渐地,有些不忍地疏远了Perl 和Shell编程,因为python 的优雅么? 不全是,主要是可以高效开发吧。

高效,那一行代码可以干什么呢?

有趣

我孩子的英文名叫andy,也许当初教他写程序的时候,如果先秀一下这行代码,可能就更能激起他对代码的兴趣了。

>>> 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 里执行它,会输出一个字符拼成的爱心。

LoveAndy

字符图形还是很有趣的,有一个著名的图像叫mandelbrot。Mandelbrot图像中的每个位置都对应于公式N=x+y*i 中的一个复数,高中学过复数的都还应该有印象。每个位置用参数N来表示,它是x*x+y*y的平方根。如果这个值大于或等于2,则这个数字对应的位置值是0。如果参数N的值小于2,就把N的值改为NN-N(N=(xx-yy-x)+(2xy-y)i)),并再次测试这个新N值。wiki百科给出的图像是这样的:

Mandelbrot

让我们用一行代码画一个Mandelbrot:

>>> 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==0else 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)])

高效

对于随手小工具而言,更是Python的拿手好戏。

一行代码打印九九乘法表:

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

输出:

乘法表

一行代码计算出1-1000之间的素数

print(*(i for i in range(2, 1000) if all(tuple(i%j for j in range(2, int(i**.5))))))

一行代码可以输出前100项斐波那契数列的值:

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 xrange(100) ]]

一行代码实现阶乘,而且还带交互:

>>> reduce ( lambda x,y:x*y,  range(1,input()+1))103628800

一行代码实现摄氏度与华氏度之间的转换器:

>>> print((lambda i:i not in [1,2] and "Invalid input!" or i==1 and (lambda f:f<-459.67 and "Invalid input!" or f)(float(input("Please input a Celsius temperature:"))*1.8+32) or i==2 and (lambda c:c<-273.15 and "Invalid input!" or c)((float(input("Please input a Fahrenheit temperature:"))-32)/1.8))(int(input("1,Celsius to Fahrenheit\n2,Fahrenheit to Celsius\nPlease input 1 or 2\n"))))1,Celsius to Fahrenheit2,Fahrenheit to Celsius Please input 1 or 21Please input a Celsius temperature:2882.4>>>

至于字符串排序和快速排序更是手到擒来。

"".join((lambda x:(x.sort(),x)[1])(list('string’))) qsort = lambda arr: len(arr) > 1 and  qsort(filter(lambda x: x<=arr[0], arr[1:] )) + arr[0:1] + qsort(filter(lambda x: x>arr[0], arr[1:] )) or arr

内涵

看一看下面一行python代码,可能就要晕了:

这是《跟孩子一起学编程》一书中,为了激发孩子编程兴趣,让孩子练习的代码——猜数游戏,它的真实面貌是大致这样的:

def guess_my_number(n):    while True:        user_input = raw_input("Enter a positive integer to guess: ")        if len(user_input)==0 or not user_input.isdigit():            print "Not a positive integer!"        else:            user_input = int(user_input)            if user_input > n:                print "Too big ! Try again!"            elif user_input < n:                print "Too small ! Try again!"            else:                print "You win!"                return Trueguess_my_number(42)

实际上,只要理解了函数式编程,使用神奇的Lambda,配合列表推导以及复杂一点的判断语句,任何的python 代码都可以转换成一行代码的。

例如,取一个列表里的随机数

import random as rnd print rnd.choice([2,3, 5,7, 11,13,17])

转换成Lambda 可以是:

print (lambda rnd: rnd.choice([1, 2, 3, 10]))(__import__('random'))

这些代码出了觉得好玩,主要是可以帮助我们了解某些Python的特性技艺,尤其是神奇的Lambda 用法

延展

当然,还有其他好玩的地方,输入下面这一行

import antigravity

它打开了浏览器,展示网站上的漫画和相关内容:

python 打开浏览器

我们可以把python的文件打包,做成库的形式,然后import进来,是一种偷换概念和改变前提的一行代码。例如,为了与windows 传输文件,在Mac上临时搭个ftp服务器:

$ python -m pyftpdlib

这当然要依赖pyftpdlib 这个库了,机器上没有,pip  install pyftpdlib 就可以了。

如果一行代码中允许分号存在,那就只是牺牲可读性而已了,基本上是无所不能。

在线的时候,获取公网IP地址的一行代码:

python -c "import socket; sock=socket.create_connection(('ns1.dnspod.net',6666)); print sock.recv(16); sock.close()"

一行代码就可以轻易写个小游戏了,来模拟一下golf击球。

python -c "import math as m;a,v=eval(input());[print('%03d'%x+' '*m.floor(0.5+x*m.tan(a)-x*x/(v*m.cos(a)))+'o') for x in range(102)]"

输入角度和力量大小如(0.8,80),就能得到一条字符描画的抛物线了。

增加上while 等语句,画一个没完没了的墙纸python -c "while 1:import random;print(random.choice('╱╲'), end='')"

maze wall

最后, Zen of Python 以一行代码来结束吧。

$ python -c "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!

参考资料:
http://www.zhihu.com/question/37046157
https://onelinepy.herokuapp.com/
https://github.com/csvoss/onelinerizer


作为组织的一员,推荐一下中生代技术的公众号。

(0)

相关推荐

  • 25 条超棒的 Python 一行代码

    自从用Python编写第一行代码以来,就被它的简单性.出色的可读性和特别流行的一行代码所吸引. 在下面,我将给大家介绍并解释一些Python一行程序. 可能有些你还不知道,但对你未来的Python项目 ...

  • 如何在 Python 中使用断点调试

    实际上没人能一次就写出完美的代码,除了我.但是世界上只有一个我. -- 林纳斯·托瓦兹(Linux 之父) 既然不是神,写代码自然免不了要修改.修改代码的过程被称作调试,又叫 debug. 刚接触编程 ...

  • python——基本输入和输出

    Python的开发环境很多,我用的是它自带的IDLE,个人觉得挺好用的. 单击这个IDLE,就可以启动IDLE,打开是这个样子的: 但在这个交互式编程界面,只能输入一行,执行一行,输入一行,再执行一行 ...

  • 一行 Python 代码实现并行,骚技能!

    当我用Python写第一行代码的那一天,我着迷于简单性,流行性及其著名的单行代码. 1.交换两个变量 # a = 4 b = 5a,b = b,a# print(a,b) >> 5,4 让 ...

  • 神操作!一行Python代码搞定一款游戏?厉害了程序员!

    Python大本营 昨天 一行代码能干啥? 这一款的迷宫游戏厉害了 迷宫游戏,不知道大家有没有玩过,以前非常风靡,各种大小的迷宫设计,尤其是Web版的迷宫早些年的时候非常流行,但是Python一行代码 ...

  • 一行Python代码中自动化文本处理

    磐创AI推荐搜索 AI学习路线 TensorFlow2.0 资源   磐创AI分享   作者 | Satyam Kumar 编译 | VK 来源 | Towards Data Science 自然语言 ...

  • 厉害!一行 Python 代码实现并行

    转自:caspar segmentfault.com/a/1190000000414339 Python 在程序并行化方面多少有些声名狼藉.撇开技术上的问题,例如线程的实现和 GIL,我觉得错误的教学 ...

  • 不需要一行 Python 代码,也可以自动获取数据

    今天给大伙介绍一下 RPA,有时候你可能会使用代码去编写自动化相关的操作,不过对于一些在 GUI 上的的重复操作,实际上可以直接使用机器人流程自动化,监视使用者在软件 GUI 里面的工作,然后直接在这 ...

  • Python 代码转 Latex 公式,这个开源库用一行代码帮你搞定

    转自 | 机器之心 数学是数据科学和机器学习的重要基础,数学运算的结果对于机器学习项目而言是至关重要的.在编写代码时,我们常常需要定义数学公式的计算形式.像 S=r^2 这样简单的数学公式,大概不会出 ...

  • Python代码块缩进的讲解

    https://www.ixigua.com/6729075318239265287

  • 最基础的Python知识学会这些已足够你开始写Python代码了

    https://m.toutiao.com/is/eD2TWLh/ (Python不用大括号标识代码结构使用空白符和缩进来标识代码块)上述最后两行代码就是while循环体,就是因为它们紧随while语 ...

  • 如何写出清晰又优雅的Python代码?我们给你这26条建议

    大数据DT 提供大数据.AI等领域干货学习资源的「宝藏号」,跟50万技术人共同成长,一起玩转大数据.Python.数据分析.数据科学.人工智能!还会有各种好玩又奇葩的数据解读,边学习边吃瓜! 538篇 ...