前言
经常看到关于Python编程的小技巧,但是都没有记录下来,当下次运用时还是原来的写法,这不记录一下。
Python 之禅
Python 里有个小彩蛋:
在 Python Shell 里输入import this
这段话被称作“Python 之禅”(The Zen of Python),它列举了一些 Python 所推崇的理念,比如:
优美胜于丑陋
明确胜于隐晦
简单胜于复杂
…
可读性很重要
不要忽略错误
面对不确定时,拒绝猜测
现在做好过不做,但盲目动手不如不做
如果你的实现很难说清楚,那是个坏想法;反之亦然
…
列表元素遍历
初学者写法:
for i in range(len(lst)):
print(lst[i])
pythonic写法:
for i in lst:
print(i)
交换两个变量
普通写法:
temp = a
a = b
b = temp
pythonic 写法:
a, b = b, a
读写文件
普通写法:
f = open('filename.txt')
text = f.read()
print(text)
f.close()
pythonic 写法:
with open('filename.txt') as f:
for line in f:
print(line)
w i t h 的 好 处 是 即 使 出 错 , 也 会 帮 你 关 闭 文 件 。 \color{red}with 的好处是即使出错,也会帮你关闭文件。 with的好处是即使出错,也会帮你关闭文件。
拼接字符串
列表去重
pythonic 写法:
list(set(x))
拼接字符串
普通写法:
letters = ['h', 'e', 'l', 'l', 'o']
s = ''
for l in letters:
s += l
print(s)
pythonic 写法:
print(''.join(letters))
列表加索引
pythonic 写法:
for i, elem in enumerate(lst):
print(i, elem)
遍历字典项:
for key, value in dct.items():
print(key, value)
生成新列表
pythonic 写法:
newLst = [i for i in lst if i > 0]
这样会更节省资源,提升执行效率。
根据键名获取字典中对应的值
普通写法:
value = dct[key]
这样的问题在于,如果 key 不存在,代码就报错跳出。于是你不得不增加更多的判断。
pythonic 写法:
value = dct.get(key, 0)
改用 get 方法,不存在时会得到 None,或者指定的默认值(这里是 0)。
列表字典集合筛选数据
列表
filter写法:
data = [2,2,-3,6]
filter(lambda x: x >= 0,data)
列表解析:
data = [2,2,-3,6]
[x for x in data if x >= 0]
列表解析效率高于filter高于普通迭代。
为元组中每个元素命名
例子学生信息系统中数据为固定格式:
{名字,年龄,性别,邮箱地址,…}
定义一系列常量
NAME,AGE ,SEX,EMAIL = range(4)# 用变量当常数值
student = ('Jim',16,'male','12345@qq.com')
print(student[NAME])
if student[AGE] <= 26:
##
if student[SEX] <= 'male':
##
使用标准库collections.namedtuple
from collections import namedtuple
Student = namedtuple('Student',['name','age','sex','email'])
s = Student('Jim',16,'male','12345@qq.com')
## 访问
s.name
s.age
s.sex
统计序列中频度
from collections import Counter
obj = Counter('aabbccc')
print(obj)
根据字典的值排序键
使用zip函数
d = {'a':85,'c':94,'b':88,'y':96,'x':85,'z':84}
zip(d.keys(),d.values())
sorted(zip(d.keys(),d.values()))
# [(84, 'z'), (85, 'a'), (85, 'x'), (88, 'b'), (94, 'c'), (96, 'y')]
使用sorted函数
d = {'a':85,'c':94,'b':88,'y':96,'x':85,'z':84}
d.items() # [('a', 85), ('c', 94), ('b', 88), ('y', 96), ('x', 85), ('z', 84)]
sorted(d.items(),key = lambda x: x[1])
# x表示d.items()生成的列表的每一项,x[1]代表每一项里面的第二个
# [('z', 84), ('a', 85), ('x', 85), ('b', 88), ('c', 94), ('y', 96)]
dict(sorted(d.items(),key = lambda x: x[1])) # 转换为字典
字典公共键
普通写法::
# 字典
a = {'a':1,'b':3,'e':2,'f':4}
b = {'c':4,'e':1,'f':3}
c = {'b':4,'d':3,'e':2,'f':4}
res = []
for k in a:
if k in b and k in c:
res.append(k)
res
利 用 集 合 s e t 操 作 \color{red}利用集合set操作 利用集合set操作
使用字典的keys方法(不灵活)
# 字典
a = {'a':1,'b':3,'e':2,'f':4}
b = {'c':4,'e':1,'f':3}
c = {'b':4,'d':3,'e':2,'f':4}
a.keys() & b.keys() & c.keys()
ret = reduce(lambda x, y : x & y, map(dict.keys, [a, b, c]))
print(ret)# {'e', 'f'}
使用有序字典
from collections import OrderdDict
d = OrderDict()
d['Jim'] = (1,35)
d['Leo'] = (2,37)
d['Bob'] = (3,48)
print(d)
双端队列
from collections import deque
q = deque([],5)
# 多于5个时之前的退出