git://www.github.com/csvoss/onelinerizer.git
git clone http://www.github.com/csvoss/onelinerizer
$ svn co --depth empty http://www.github.com/csvoss/onelinerizer
Checked out revision 1.
$ cd repo
$ svn up trunk
将任何 python 文件转换为具有相同功能的单个代码行。
不允许换行符不允许使用任何分号,或者。
在 onelinepy.herokuapp.com现场演示。 !
$ git clone https://github.com/csvoss/onelinerizer
$ cd onelinerizer
$ python main.py target_file.py --debug
$ python target_file_ol.py
前 :
x =3y =4print (x < y <5)
:
(lambda__builtin__: (lambda__print, __y, d: [[__print(d.x<d.y<5) for d.y in [(4)]][0] for d.x in [(3)]][0])(__builtin__.__dict__['print'],(lambdaf: (lambdax: x(x))(lambday: f(lambda*args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))
这一行看起来很复杂,因为我们需要一些技巧来导入打印功能,支持 while
和 if
等更复杂的特性。 但是,对于这样一个简单的程序,你可以认为它是以这种方式工作的:
(lambdax: (lambday: print(x<y<5))(4))(3)
前 :
deff(x): return x+5print f(13)
:
(lambda__builtin__: (lambda__print, __y, d: [__print(d.f(13)) for d.f in [(lambdax:[(d.x+5) for d.x in [(x)]][0])]][0])(__builtin__.__dict__['print'],(lambdaf: (lambdax: x(x))(lambday: f(lambda*args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))
。或者,如果你想考虑更简化的事情:
(lambdaf: print(f(13)))(lambdax: x+5)
前 :
defguess_my_number(n): whileTrue: user_input =raw_input("Enter a positive integer to guess: ") iflen(user_input)==0ornot 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!"returnTrueguess_my_number(42)
:
(lambda__builtin__: (lambda__print, __y, d: [(lambda___: None)(d.guess_my_number(42)) for d.guess_my_number in [(lambdan:[(__y(lambda__this: (lambdad: (lambda__after: [(lambda__after: (lambda___: __after(d))(__print('Not a positive integer!')) if (d.len(d.user_input)==0or (not d.user_input.isdigit())) else [(lambda__after: (lambda___: __after(d))(__print('Too big! Try again!')) if d.user_input>d.n else (lambda__after: (lambda___: __after(d))(__print('Too small! Try again!')) if d.user_input<d.n else (lambda___: d.True)(__print('You win!')))(lambdad: __after(d)))(lambdad: __after(d)) for d.user_input in [(d.int(d.user_input))]][0])(lambdad: __this(d)) for d.user_input in [(d.raw_input('Enter a positive integer to guess: '))]][0] if d.Trueelse __after(d))(lambdad: None))))(d) for d.n in [(n)]][0])]][0])(__builtin__.__dict__['print'],(lambdaf: (lambdax: x(x))(lambday: f(lambda*args: y(y)(*args)))),type('StateDict',(),__builtin__.__dict__)()))(__import__('__builtin__'))
对,对不起,但是另一方面,为什么不?
这将违背本练习的精神。 pass pass abuse lambda函数表达式列表理解,甚至偶尔出现的Y 组合? 永远不要放弃使用Y 组合器的机会。
在输入代码的大小是线性的,所以一条代码是线性的,所以它是线性的。
我没有理由相信产生的代码比原始代码慢得多。 由于时间循环,等等 是使用递归函数调用实现的,因这里为设置这些函数调用带来了更多开销。
一个排列的代码往往包含许多嵌套的rtc ;如果有太多的话,python 将拒绝运行它。
$ python main_ol.py s_push: parser stack overflow MemoryError
使用pypy可以修复这里问题。
$ pypy main_ol.py
但是,由于循环和循环是用递归实现的,你可能会遇到 maximum recursion depth exceeded
如果循环继续长时间运行,则运行时出错。
为了解决这个问题你可以
import sys
sys.setrecursionlimit(new_limit)
在原始 python 代码中。 ( onelinerizer不会将这里命令放入你的位置。)