python3常用小技巧

本文介绍python3里面常用的编程小技巧,文章中介绍的例子是定义在类中实现:
在这里插入图片描述
调用方式如下:
在这里插入图片描述
下面详细介绍类里面的测试函数的功能

  1. 字符串翻转:利用操作符[]来实现
    字符串[开始索引:结束索引:步长(默认为1)]
    切取字符串为开始索引到结束索引-1内的字符串
def func_str_reversed(self):  # 字符串翻转
    text = 'hello'
    print(text[::-1])
输出:olleh
  1. 数组去重:利用集合去重
    集合(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}
  1. 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}
  1. 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}
  1. 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}
  1. 多维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]

推荐使用方法一,不建议使用递归方法

  1. 统计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}
  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
  1. 字典合并
    方法一:利用操作符**实现
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'}
  1. 流式读取超大文件,通过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)
  1. 注册程序异常退出时处理函数
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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

丁爸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值