一行python代码到底能干嘛
一般而言,Python的one-liner 要不就是用到比较好的库文件,要不就是用到一些函数式的特性以及list comprehension等,但是最好不要设计太过复杂的逻辑,不然真的是能做到丧心病狂 …
根据网上查找,部分修改汇总记录
初级
- 九九乘法表
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*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
- 迷宫
得找个不显示中间空格的方式,只能用图片代替了
mg = lambda s, row, col: ''.join(__import__('random').choice(s) if i else '\n' for _ in range(row) for i in range(col))
print(mg('╱╲', 40, 60))
- FizzBuzz的问题
整数 1 到 n , 如果被3整除,打印Fizz; 被5整除,打印Buzz;同时被3和5整除,打印FizzBuzz
fb = lambda y: ["Fizz"[ x % 3 * 4:] + "Buzz"[x % 5 * 4:] or str(x) for x in range(1, y)]
print(fb(33))
输出
['1', '2', 'Fizz', '4', 'Buzz', 'Fizz', '7', '8', 'Fizz', 'Buzz', '11', 'Fizz', '13', '14', 'FizzBuzz', '16', '17', 'Fizz', '19', 'Buzz', 'Fizz', '22', '23', 'Fizz', 'Buzz', '26', 'Fizz', '28', '29', 'FizzBuzz', '31', '32']
进阶
- 求素数
求素数两种写法
prime = lambda y: [item for item in filter(lambda x: not [x % i for i in range(2, x) if x % i == 0], range(2, y))]
print(prime(100))
prime = lambda y: [item for item in filter(lambda x: all(map(lambda p: x % p != 0, range(2, x))), range(2, y))]
print(prime(100))
输出100内的
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97]
- 求斐波拉契数
fibonacci = lambda y: [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(y)]]
print(fibonacci(20))
输出前20个斐波拉契数
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
- 输入数输出阶乘
注意库functools导入方式
jc = lambda f: f.reduce(lambda x, y: x * y, range(1, int(input('输入一个数:')) + 1))
print(jc(__import__('functools')))
输入5,输出
120
- 将多维数组转化为一维和类似反功能
flatten = lambda x: [y for l in x for y in flatten(l)] if isinstance(x, list) else [x]
array = lambda x: [x[i:i+int(len(x)**0.5)] for i in range(0, len(x), int(len(x)**0.5))]
a = [[1,2,3], [4,5,6], [7,8,9]]
print(flatten(a))
print(array(flatten(a)))
输出
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[[1, 2, 3], [4, 5, 6], [7, 8, 9], [10]]
- 画爱心
注意控制行和列数,可以自己调整
love = lambda s: '\n'.join([''.join([(s[(x-y) % len(s)] if ((x*0.05)**2 + (y*0.12)**2-1)**3 - (x*0.05)**2*(y*0.12)**3 <= 0 else ' ') for x in range(-24, 24)]) for y in range(12, -12, -1)])
print(love('ylLoveYL'))
输出
ylLoveYLy veYLylLov
eYLylLoveYLylLove lLoveYLylLoveYLyl
veYLylLoveYLylLoveYLylLoveYLylLoveYLylLov
veYLylLoveYLylLoveYLylLoveYLylLoveYLylLoveY
veYLylLoveYLylLoveYLylLoveYLylLoveYLylLoveYLy
eYLylLoveYLylLoveYLylLoveYLylLoveYLylLoveYLyl
YLylLoveYLylLoveYLylLoveYLylLoveYLylLoveYLylL
LylLoveYLylLoveYLylLoveYLylLoveYLylLoveYLylLo
lLoveYLylLoveYLylLoveYLylLoveYLylLoveYLylLo
LoveYLylLoveYLylLoveYLylLoveYLylLoveYLylLov
veYLylLoveYLylLoveYLylLoveYLylLoveYLylLov
LylLoveYLylLoveYLylLoveYLylLoveYLylLo
lLoveYLylLoveYLylLoveYLylLoveYLylLo
veYLylLoveYLylLoveYLylLoveYLylL
ylLoveYLylLoveYLylLoveYLy
oveYLylLoveYLylLoveYL
LylLoveYLylLove
veYLylL
y
高级
- 快排
注意递归
qsort = lambda arr: len(arr) > 1 and qsort(list(filter(lambda x: x <= arr[0], arr[1:]))) + arr[0:1] + qsort(list(filter(lambda x: x > arr[0], arr[1:]))) or arr
a = [12, 13, 6, 9, 34, 10, 28, 9, 4, 19, 17]
print(qsort(a))
输出
[4, 6, 9, 9, 10, 12, 13, 17, 19, 28, 34]
- 阶乘-高级
实现了递归
factorial = (lambda a: lambda v: a(a)(v))(lambda s: lambda x: 1 if x == 0 else x*s(s)(x-1))
print(factorial(5)) # 120
- 画Mandelbrot图像
Mandelbrot图像中的每个位置都对应于公式N=x+y*i中的一个复数
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)]))
输出
*
**
***********
************
*********
* * ************ * *
****** * *************************** *
*************************************** *****
*******************************************
*** ******************************************** *
**************************************************
*******************************************************
* * *****************************************************
**** ******* * *******************************************************
***************** *******************************************************
*********************** *********************************************************
*********************** ********************************************************
**** ********************************************************************************
*********************************************************************************************
**** ********************************************************************************
*********************** ********************************************************
*********************** *********************************************************
***************** *******************************************************
**** ******* * *******************************************************
* * *****************************************************
*******************************************************
**************************************************
*** ******************************************** *
*******************************************
*************************************** *****
****** * *************************** *
* * ************ * *
*********
************
***********
**
丧心病狂
(lambda __builtin: (lambda __print, __y, d: [(lambda ___: None)(d.guess_my_number(42)) for d.guess_my_number in [(lambda n:[(__y(lambda __this: (lambda d: (lambda __after: [(lambda __after: (lambda ___: __after(d))(__print('Not a positive integer!')) if (d.len(d.user_input)==0 or (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 ___: True) (__print('You win!')))(lambda d: __after(d)))(lambda d: __after(d)) for d.user_input in [(d.int(d.user_input))]][0])(lambda d: __this(d)) for d.user_input in [(d.input('Enter a positive integer to guess: '))]][0] if True else __after(d))(lambda d: None))))(d) for d.n in [(n)]][0])]][0])(__builtin.__dict__['print'],(lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args)))),type('StateDict',(),__builtin.__dict__)()))(__import__('builtins'))
其实就是下面这一段代码,看看就好,不要头疼
def guess_my_number(n):
while True:
user_input = 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 True
guess_my_number(42)
总结
其实,只要你有耐心,够细心,不怕死,任何代码用lambda都可以包裹到一行