本文介绍python3里面常用的编程小技巧,文章中介绍的例子是定义在类中实现:
调用方式如下:
下面详细介绍类里面的测试函数的功能
- 字符串翻转:利用操作符[]来实现
字符串[开始索引:结束索引:步长(默认为1)]
切取字符串为开始索引到结束索引-1内的字符串
def func_str_reversed(self): # 字符串翻转
text = 'hello'
print(text[::-1])
输出:olleh
- 数组去重:利用集合去重
集合(set)是一个无序的不重复元素序列
def func_list_deduplication(self): # list去重
value_list = [1, 2, 3, 4, 1, 2, 1, 3]
print(set(value_list))
输出:{1, 2, 3, 4}
- list求差集:利用集合中函数difference实现
返回在value_list1中不在value_list2中的元素
def func_list_difference(self): # 返回多个list差集
value_list1 = [1, 2, 3, 4, 1, 2, 1, 3]
value_list2 = [3, 4, 5, 6]
print(set(value_list1).difference(set(value_list2)))
输出:{1, 2}
- list求交集:利用集合中函数intersection实现
返回在value_list1且在value_list2中的元素
def func_list_intersection(self): # 返回多个list交集
value_list1 = [1, 2, 3, 4, 1, 2, 1, 3]
value_list2 = [3, 4, 5, 6]
print(set(value_list1).intersection(set(value_list2)))
输出:{3, 4}
- list求并集:利用集合中函数union实现
去重返回value_list1和value_list2中的所有元素
def func_list_union(self): # 返回多个list差集
value_list1 = [1, 2, 3, 4, 1, 2, 1, 3]
value_list2 = [3, 4, 5, 6]
print(set(value_list1).union(set(value_list2)))
输出:{1, 2, 3, 4, 5, 6}
- 多维list展开:两种方法实现
方法一:利用iteration_utilities中的deepflatten函数实现
def func_list_spread(self): # 多维list展开
from iteration_utilities import deepflatten
value_list = [[1, 4, 2, [5, 1, [[4, [5, 1, 3], [2, 3]], 7, 1, 3]]], [1, [3, 2, [2, 3]]]]
print(list(deepflatten(value_list)))
输出:[1, 4, 2, 5, 1, 4, 5, 1, 3, 2, 3, 7, 1, 3, 1, 3, 2, 2, 3]
方法二:利用递归实现
value_list = [[1, 4, 2, [5, 1, [[4, [5, 1, 3], [2, 3]],
7, 1, 3]]], [1, [3, 2, [2, 3]]]]
def recursive_list(value_list: list = []): # 多维list展开
res = []
for va in value_list:
if isinstance(va, list):
res.extend(recursive_list(va))
else:
res.append(va)
return res
# 递归展开
print(recursive_list(value_list))
输出:[1, 4, 2, 5, 1, 4, 5, 1, 3, 2, 3, 7, 1, 3, 1, 3, 2, 2, 3]
推荐使用方法一,不建议使用递归方法
- 统计list中的元素出现的次数:两种方法实现
方法一:利用collections中的Counter函数实现
def func_list_counter(self): # 统计list中的元素出现的次数
from collections import Counter
value_list = ['\\', 'v', 'e', 'n', 'v', '\\', 'S', 'c', 'r',
'i', 'p', 't', 's', '\\', 'p', 'y', 't', 'h', 'o', 'n', '.',
'e', 'x', 'e', ' ', '/', 'p', 'y', 't', 'h', 'o', 'n', '_',
'f', 'u', 'n', 'c', 't', 'i', 'o', 'n', '.', 'p', 'y']
print(dict(Counter(value_list)))
输出:{'\\': 3, 'v': 2, 'e': 3, 'n': 5, 'S': 1, 'c': 2, 'r': 1,
'i': 2, 'p': 4, 't': 4, 's': 1, 'y': 3, 'h': 2, 'o': 3, '.': 2,
'x': 1, ' ': 1, '/': 1, '_': 1, 'f': 1, 'u': 1}
方法二:写函数实现
# 统计list中的元素出现的次数
def func_list_counter1(self,value_list: list = []):
res_dict = {}
for va in value_list:
res_dict[va] = (res_dict[va] + 1) if (va in res_dict) else 1
print(res_dict)
输出:{'\\': 3, 'v': 2, 'e': 3, 'n': 5, 'S': 1, 'c': 2, 'r': 1,
'i': 2, 'p': 4, 't': 4, 's': 1, 'y': 3, 'h': 2, 'o': 3, '.': 2,
'x': 1, ' ': 1, '/': 1, '_': 1, 'f': 1, 'u': 1}
- 增强list可读性:利用collections中函数namedtuple实现
可以通过定义属性来访问list中的元素,避免通过下标访问
def test_function_NamedTuple(self): # 增强list可读性
from collections import namedtuple
User = namedtuple('User', ['name', 'pwd', 'nick'])
userlist = [User('zhangshan', '123456', '张三'),
User('lisi', '123456', '李四')]
print(userlist)
print(userlist[0].name, userlist[1].name)
输出:[User(name='zhangshan', pwd='123456', nick='张三'),
User(name='lisi', pwd='123456', nick='李四')]
zhangshan lisi
- 字典合并
方法一:利用操作符**实现
def func_dict_combine(self): # 字典合并
dict1 = {'k1': 'hello', 'k2': 'world'}
dict2 = {'k3': 'dict', 'k4': 'combine'}
print({**dict1, **dict2})
输出:{'k1': 'hello', 'k2': 'world', 'k3': 'dict', 'k4': 'combine'}
方法二:利用字典update函数实现
def func_dict_combine1(self): # 字典合并
dict1 = {'k1': 'hello', 'k2': 'world'}
dict2 = {'k3': 'dict', 'k4': 'combine'}
dict1.update(dict2)
print(dict1)
输出:{'k1': 'hello', 'k2': 'world', 'k3': 'dict', 'k4': 'combine'}
- 流式读取超大文件,通过yield实现
def func_read_file_by_stream(filename: str,
block_size: int = 1024 * 1): # 流式读取超大文件,每次读取1K
from functools import partial
with open(filename, 'r', encoding='utf-8') as fp:
for chunk in iter(partial(fp.read, block_size), ""):
yield chunk
# 测试读取流式大文件
datas = func_read_file_by_stream('test.txt')
for data in datas:
print('size = ', len(data))
print(data)
- 注册程序异常退出时处理函数
import atexit
@atexit.register
def exit_function(): # 程序异常退出时执行的代码
print('---------------------程序异常退出时执行的代码')
def test_run_abnormal(): # 异常函数,访问下标越界
arr = [1, 2, 3]
print(arr[5])
# 测试程序异常退出,调用退出函数
test_run_abnormal()
程序异常退出前会执行函数exit_function,我们可以在函数里面定义要处理的操作。
完整代码
在这里插入代码片
import atexit
def func_read_file_by_stream(filename: str, block_size: int = 1024 * 1): # 流式读取超大文件,每次读取1K
from functools import partial
with open(filename, 'r', encoding='utf-8') as fp:
for chunk in iter(partial(fp.read, block_size), ""):
yield chunk
@atexit.register
def exit_function(): # 程序异常退出时执行的代码
print('---------------------程序异常退出时执行的代码')
def test_run_abnormal():
arr = [1, 2, 3]
print(arr[5])
class CPythonFunc:
def func_str_reversed(self): # 字符串翻转
text = 'hello'
print(text[::-1])
def func_list_deduplication(self): # list去重
value_list = [1, 2, 3, 4, 1, 2, 1, 3]
print(set(value_list))
def func_list_difference(self): # 返回多个list差集
value_list1 = [1, 2, 3, 4, 1, 2, 1, 3]
value_list2 = [3, 4, 5, 6]
# 返回在value_list1中不在value_list2中的元素
print(set(value_list1).difference(set(value_list2)))
def func_list_intersection(self): # 返回多个list交集
value_list1 = [1, 2, 3, 4, 1, 2, 1, 3]
value_list2 = [3, 4, 5, 6]
# 返回在value_list1且在value_list2中的元素
print(set(value_list1).intersection(set(value_list2)))
def func_list_union(self): # 返回多个list并集
value_list1 = [1, 2, 3, 4, 1, 2, 1, 3]
value_list2 = [3, 4, 5, 6]
# 去重返回value_list1和value_list2中的所有元素
print(set(value_list1).union(set(value_list2)))
def func_list_spread(self): # 多维list展开
from iteration_utilities import deepflatten
value_list = [[1, 4, 2, [5, 1, [[4, [5, 1, 3], [2, 3]], 7, 1, 3]]], [1, [3, 2, [2, 3]]]]
print(list(deepflatten(value_list)))
# 定义递归函数
def recursive_list(value_list: list = []):
res = []
for va in value_list:
if isinstance(va, list):
res.extend(recursive_list(va))
else:
res.append(va)
return res
# 递归展开
print(recursive_list(value_list))
def func_list_counter(self): # 统计list中的元素出现的次数
from collections import Counter
value_list = ['\\', 'v', 'e', 'n', 'v', '\\', 'S', 'c', 'r', 'i', 'p', 't', 's', '\\', 'p', 'y', 't', 'h',
'o', 'n', '.', 'e', 'x', 'e', ' ', '/', 'p', 'y', 't', 'h', 'o', 'n', '_', 'f', 'u', 'n', 'c',
't', 'i', 'o', 'n', '.', 'p', 'y']
print(dict(Counter(value_list)))
# 代码实现
res_dict = {}
for va in value_list:
res_dict[va] = (res_dict[va] + 1) if (va in res_dict) else 1
print(res_dict)
def test_function_NamedTuple(self): # 增强list可读性
from collections import namedtuple
User = namedtuple('User', ['name', 'pwd', 'nick'])
userlist = [User('zhangshan', '123456', '张三'), User('lisi', '123456', '李四')]
print(userlist)
print(userlist[0].name, userlist[1].name)
def func_dict_combine(self): # 字典合并
dict1 = {'k1': 'hello', 'k2': 'world'}
dict2 = {'k3': 'dict', 'k4': 'combine'}
# 方法一
print({**dict1, **dict2})
# 方法二
dict1.update(dict2)
print(dict1)
def func_print_tofile(self): # 日志打印到文件里面
with open('print.log', mode='w') as f:
print('打印日志信息到print.log文件', file=f, flush=True)
def func_count_runtime(self): # 统计函数运行时间
import timeit
print(timeit.timeit(self.test_function_NamedTuple, number=3))
if __name__ == '__main__':
regilar = CPythonFunc()
func = lambda argc: argc[0:2] != '__'
funlist = list(filter(func, dir(regilar)))
print(funlist)
for fun in funlist:
print('------------------------', fun)
regilar.__getattribute__(fun)()
typelist = list(map(chr, range(ord('A'), ord('Z') + 1)))
print([{'PC_Name': name} for name in typelist])
# 测试读取流式大文件
datas = func_read_file_by_stream('test.txt')
for data in datas:
print('size = ', len(data))
print(data)
# 测试程序异常退出,调用退出函数
test_run_abnormal()