zl程序教程

您现在的位置是:首页 >  后端

当前栏目

太赞了!只要这五招就可以让Python代码这么优雅!

Python代码 可以 优雅 这么 只要
2023-09-14 09:06:06 时间

对于Python初学者来说,代码能运行不报错就已经很开心了。受限于知识体系和项目历练经验,在写代码的时候,很少考虑代码的运行效率和简洁性,因此容易造成代码冗长、执行速度慢,这些基本是一个初学者需要改进、成长的地方。

本文是想通过几个案例给初学者一点点启发,怎么才能让你的Python代码更优雅。欢迎收藏学习,喜欢点赞支持。 文末提供技术交流群

生成器

除非你的list十分复杂,并且频繁调用,否则都建议使用生成器,因为它非常节省内存,举个例子:

常规版

def powers_of_two(max=20000):
    i = 0
    powers = []
    while 2**i < max:
        powers.append(2**i)
        i += 1
    return powers

优雅版

from itertools import count, takewhile
def powers_of_two(max=20000):
    for index in takewhile(lambda i: 2**i < max, count(start=0)):
        yield 2**index

标准库

标准库itertools和collections很少被初学者使用,写代码按照正常的逻辑去写,很少考虑效率问题。

常规版

list1 = range(1,10)
list2 = range(10,20)
for item1 in list1:
    for item2 in list1:
        print(item1*item2)

优雅版

from itertools import product
list1 = range(1,10)
list2 = range(10,20)
for item1,item2 in product(list1, list2):
    print(item1*item2)

这是一个嵌套循环操作,为提高代码效率,完全可以用product()函数替代嵌套循环,这两段代码的结果完全一样,但使用标准库函数明显更加简洁高效。itertools还有很多方便操作迭代对象的函数,有兴趣可以继续演讲。

集合模块

初学者对python集合模块了解的可能并不多,你可能会遇到这样的情形:构建了一个字典,依次向字典中添加信息,如果某个键已经存在,则以某种方式修改该键的值;如果某个键不存在,则添加对应键值对。

常规版

consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
items_by_id = {}
for id_, item in consolidated_list:
    if id_ not in items_by_id: 
        items_by_id[id_] = []
    if id_ in items_by_id:
        items_by_id[id_].append(item)

优雅版

from collections import defaultdict
items_by_id = defaultdict(list)
consolidated_list = [('a',1),('b',2),('c',3),('b',4)]
for id_, item in consolidated_list:
    items_by_id[id_].append(item)

高级数据结构

很多初学者忽视sets(集合)和tuple(元组)的强大之处,例如,取两个列表交集。

常规版

def common_elements(list1, list2):    
    common = []        
    for item1 in list1:                
        if item1 in list2:                        
            common.append( item1 )return common

优雅版

def common_elements(list1, list2):    
def common_elements(list1, list2):
    common = set(list1).intersection(set(list2))
    return list(common)

上下文管理器

新手可能会习惯常规版的方式进行读取文件操作,具体如下:

常规版

if os.path.exists(data_file_path):    
    data_file = open(data_file_path,'r')
else:    
    raise OSERROR
print( data_file.read())
data.close()

优雅版

with open(data_file_path,'r') as data_file:
    print(data_file.read)

优雅版:这样可以捕获任何打开文件或处理数据时的异常情况,并且在任务处理完后自动关闭文件。python初学者可能不太了解上下文管理器的神奇之处,它真的能带来巨大的便利。

常规版:可能出现文件存在,但文件被占用,无法读取的情况,可能出现文件可以被读取,但操作文件对象出现报错的情况

结论

任何一门语言学习都需要一个积累的过程,我们不能仅利用Python完成工作任务就Ok了,也要在性能优化、代码健壮性、代码简约等方面多多去思考。


技术交流

欢迎转载、收藏、有所收获点赞支持一下!

在这里插入图片描述

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

长按关注