前言

经常看到关于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个时之前的退出