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 |