Python编程技巧
分享一下python编程的技巧,在阅读此内容时,请确保你已经掌握了python的基本用法,
筛选列表,字典
列表筛选
一般都是用for循环加if 来判断如:
1  | from random import randint  | 
我们可以用filter函数
filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
1  | result = filter(lambda x:x>=0,data)  | 
我们也可以使用列表生成式
1  | [x for x in data if x>=0]  | 
那到底哪个更快呢?我们可以用%timeit来测一下,发现是filter函数更快

字典筛选
1  | # 模拟一个{学号:分数}的字典  | 
命名元组
我们有一个固定格式的数据,如:
学生信息:(姓名,年龄,性别,邮箱),而数据量很大,为了减少开销,我们可以用元组表示
1  | ('小明',15,'男','xiaoming@qq.com')  | 
1.我们可以用全局变量
1  | NAME = 0  | 
2.也可以用namedtuple来替换元组
1  | from collections import namedtuple  | 
统计列表或字典出现的次数
我们希望统计一下列表中,每个元素出现的个数,
1  | from random import randint  | 
第一种做法:
1  | result = {}  | 
第二种,使用collections的Counter
1  | from collections import Counter  | 
查找公共键
1  | '''  | 
第一种方法:
1  | result = []  | 
这种的话 如果我有很多个字典,我就要一个一个判断
第二种:我们可以用集合的交集
1  | dict_1.keys()& dict_2.keys() &dict_3.keys()  | 
如何实现历史记录功能
需求:记录用户的每次输入
1  | from collections import deque  | 
迭代多个可迭代对象
需求:
- 有一个班的,希望得到语文,数学,英语的总分
 
1  | from random import randint  | 
- 多个班,希望得到分数超过90的人数
 
1  | from random import randint  | 
拆分多个分隔符的字符串
需求:
1  | 有一个字符串包含多个分隔符,如:  | 
- 使用
split方法,进行多次 
1  | s = 'ads;cd|efesada,fjasd,fasd\tfasd;feas,asdas:fefa\tffgg'  | 
- 使用
re.split 
1  | import re  | 
进行字符串对齐
- 字符串方法
 
1  | s='aaa'  | 
format方法
1  | #左对齐  | 
如何设置文件缓冲
- 全缓冲:
open函数的bufering设置为大于1的整数n,n为缓冲区大小 - 行缓冲:
open函数的buffering设置为1,当有换行时写入 - 无缓冲:
open函数的buffering设置为0,实时写入 
如何使用临时文件
你需要在程序执行时创建一个临时文件或目录,并希望使用完之后可以自动销毁掉。
1  | from tempfile import TemporaryFile  | 
如何在一个现有类中,添加自己的逻辑
1  | 比如,我已经有一个tuple类,这个类可以把列表变成元组  | 
我们可以重写new方法
1  | class intTuple(tuple):  | 
上下文管理
实现一个新的上下文管理器的最简单的方法就是使用 contexlib 模块中的 @contextmanager 装饰器。
1  | from contextlib import contextmanager  | 
在函数 conn_sqlite3 中,yield 之前的代码会在上下文管理器中作为 __enter__() 方法执行, 所有在 yield 之后的代码会作为 __exit__() 方法执行。 如果出现了异常,异常会在yield语句那里抛出。
当然也可以在类中用__enter__()方法 跟 __exit__()方法
1  | import sqlite3  |