Python 实用小技巧精选收藏
程序员文章站
2022-07-12 09:31:24
...
1. 序号填充补零
>>> for i in range(12):
'No.'+str(i+1).zfill(3)
>>> for i in range(12):
'No.%.3d'%(i+1)
>>> for i in range(12):
'No.{0:03}'.format(i)
'''
三种方法等效,均为:
'No.001'
'No.002'
'No.003'
'No.004'
'No.005'
'No.006'
'No.007'
'No.008'
'No.009'
'No.010'
'No.011'
'No.012'
三种方法体现了三种连接字符串的方式,其中方法三若使用多变量:
'x={0:03} y={1} z={2}'.format(x,y,z)
'''
2. 一行代码实现斐波那契数列
>>> Fib=lambda n: ([F[0] for F in [(f[i][0], f.append((f[i][1], f[i][0]+f[i][1]))) for f in ([[1,1]],) for i in range(n)]])
>>> Fib(5)
[1, 1, 2, 3, 5]
>>> Fib(20)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
>>> Fib(12)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144]
>>> Fib(20)[11]
144
# 递归式:
>>> Fib = lambda n,a=0,b=1: a if n==0 else Fib(n-1,b,a+b)
>>> Fib(12)
144
>>> fib = lambda n: 1 if n<=2 else fib(n-1) + fib(n-2)
>>> fib(12)
144
一行代码计算阶乘
>>> (lambda n: __import__('functools').reduce(int.__mul__,range(1,n+1),1))(5)
120
>>> (lambda n: __import__('functools').reduce(int.__mul__,range(1,n+1),1))(6)
720
3. 列表推导式: (也适用字典和集合)
# 例:输出偶数列,以下两种方法等效
>>> a=[i for i in range(20) if i%2==0]
>>> b=[i*2 for i in range(10)]
>>>
>>> for i in a: print(i,end=' ')
0 2 4 6 8 10 12 14 16 18
>>> for i in b: print(i,end=' ')
0 2 4 6 8 10 12 14 16 18
4. for 循环不带变量,用“_”代替
>>> for _ in range(3):
print(1)
1
1
1
# 例:初始化列表
>>> lst = []
>>> lst1 = []
>>> for _ in range(10):
lst1.append(0)
>>> lst2 = [0 for _ in range(10)]
>>> lst1
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
>>> lst2
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 推荐使用:
>>> lst3 = [0]*10
>>> lst3
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
5. 若本地没有指定库则临时安装
import os
try:
import json
except ImportError:
os.system('pip install json')
import json
6. for 循环也能和 else 搭配
for i in range(5):
print(i,end='\t')
else:
print(i+1,end='\n\n\n')
'''
0 1 2 3 4 5
注:两者是顺序关系,若for句块中有break等跳出,则else句块执行不到
'''
7. 链式比较,可以和数学题中的写法一样: 0<a<5
>>> a=5
>>> 1<a<10
True
>>> 1==a<=5
False
>>> 1<=a==5
True
>>> 5==a<10
True
>>> a=6
>>> 5==a<10
False
>>> 0<a>1
True
# 逻辑值是前后两个等式的与运算
8. 多个比较,可以用 all() any() 代替 and or 表示全部成立和只要有一个成立
>>> a,b,c=1,5,8
>>> any([a>0,b>a,c>b])
True
>>> all([a>0,b>a,c>b])
True
>>> any([a>0,b<a,c<b])
True
>>> all([a>0,b<a,c<b])
False
>>>
9. 多个or比较,可以用in代替
>>> a=0
>>> if abc in {1,2,3}:
print(1)
else:
print(0)
0
>>> if a in [1,2,3]:
print(1)
else:
print(0)
0
'''
1. 等价于:
if a==1 or a==2 or a==3:
print(1)
else:
print(0)
2. in 后面用 [] {} 都可以
'''
10. 查找列表中出现次数最多(最少)的元素
>>> a=[1,2,3,1,2,2,2,4]
>>> max(set(a),key=a.count)
2
>>> min(set(a),key=a.count)
3
# 若次数一样多,则返回首次出现的元素
11. 用列举函数enumerate遍历列表、字典的元素序号
>>> m=[0,1,3,2,3,6,1,3]
>>> for i,n in enumerate(m):
print(i+1,':',n)
1 : 0
2 : 1
3 : 3
4 : 2
5 : 3
6 : 6
7 : 1
8 : 3
>>> d={'a':97,'b':98,'c':99,'d':100}
>>> for i,k in enumerate(d):
print(i+1,':',k,'=',d[k])
1 : a = 97
2 : b = 98
3 : c = 99
4 : d = 100
12. 三目操作符用于选择函数
>>> def add(a,b):return a+b
>>> sub=lambda a,b:a-b
>>> a,b=5,10
>>> (sub if a>b else add)(a,b)
15
函数表达式放进字典里:
dic = {
"add": lambda x, y: x + y,
"sub": lambda x, y: x - y
}
a,b=5,3
print((dic['add'] if a>b else dic['sub'])(a,b))
a,b=3,5
print((dic['add'] if a>b else dic['sub'])(a,b))
'''
8
-2
'''
上一篇: 【精选技巧】离散化操作