什么是“Pythonic”?——写出更优雅的Python代码(下)

引言

上一篇写了一些很常用的pythonic场景,接下来继续为大家介绍更多pythonic场景,助力大家写出更优雅的Python代码

正文咯

常用数据结构选型

list、dict、set、tuple 在python中都可以存放多个元素,但他们也有各自的使用场景:

  1. list :有序、可变集合,适合存放元素顺序重要、需频繁增删查改的场景。
    • 如:存储一组用户对象,顺序有意义,需遍历和插入。
  2. tuple :有序、不可变集合。用于数据不可更改、可作为字典键的场景。
    • 如:返回多值;用作字典的复合键。
  3. set :无序、唯一元素集合。适合去重、集合运算(交并差等)。
    • 如:快速判断元素是否存在,或对列表去重。
  4. dict :键值映射。适合根据唯一键高效查找、插入和删除。
    • 如:统计元素出现次数、配置参数、缓存等。

对于计数等场景,python还提供了十分好用的defaultdict、Counter

Python 复制代码
from collections import defaultdict
counts = defaultdict(int)
for ch in 'hello world':
    counts[ch] += 1
    
from collections import Counter
c = Counter('abracadabra')
print(c.most_common(2))  # [('a', 5), ('b', 2)]

(不过笔者写了挺长时间的python代码,好像也还没机会用)

解包

我们经常可以看到python函数里的形参是这个样子的

Python 复制代码
def example(*args, **kwargs):
    for arg in args:
        print(arg)
    for key, value in kwargs.items():
        print(f"{key} = {value}")

*args 将多个参数 打包成一个列表,比如 example(1, "a", "如果让你重新来过")

**kwargs 将多个参数 打包成一个字典,比如 example(a=1, b="a", c="如果让你重新来过")

注意:如果是kwargs 就一定要指定参数的名字,因为kwargs必须传入字典

*的解包功能,和函数中打包的逻辑正相反,他将列表转换为多个值,将字段通过**也转换成多个值

with语句

当我们管理资源的时候,比如文件或者网络连接,不得不考虑在任何情况下都需要给连接关闭,java中喜欢用try-catch-finally, golang中喜欢用defer, 而python可以使用with 十分的方便,比如:

csharp 复制代码
with open('data.txt') as f:
    data = f.read()
# 文件自动关闭

EAFP vs. LBYL

EAFP全名叫it's easier to ask for forgiveness than permission,请求原谅比请求许可更容易。

什么是请求许可的代码呢?就是我写代码的时候,已经预估到了风险,针对风险写出一些if判断逻辑,规避掉风险,比如:

Python 复制代码
if 'key' in d:
    value = d['key']
else:
    value = default

我猜到了 key可能不存在,所以给他提供一个默认值。或者让一些逻辑只在满足if条件时运行。

什么是请求原谅呢?就是我完全不管,直接操作,出错再处理

Python 复制代码
try:
    value = d['key']
except KeyError:
    value = default

通常来说,在工程代码上,请求原谅的写法比请求许可是更好的:

  • 请求许可中,需要先进行读取两次对象来确认是否存在问题,请求原谅则只需要读取一次。
  • 可读性更强,可以让别人迅速知道代码在规避什么问题

结语

在Python中,优雅的代码更易维护、更高效。掌握技巧的同时切记可读性始终是第一要义,切勿为简洁而牺牲清晰。

最后推荐阅读PEP 8,The Zen of Python,债见!

相关推荐
云泽野3 小时前
【Java|集合类】list遍历的6种方式
java·python·list
IMPYLH5 小时前
Python 的内置函数 reversed
笔记·python
程序员岳焱6 小时前
Java 与 MySQL 性能优化:Java 实现百万数据分批次插入的最佳实践
后端·mysql·性能优化
麦兜*6 小时前
Spring Boot启动优化7板斧(延迟初始化、组件扫描精准打击、JVM参数调优):砍掉70%启动时间的魔鬼实践
java·jvm·spring boot·后端·spring·spring cloud·系统架构
大只鹅7 小时前
解决 Spring Boot 对 Elasticsearch 字段没有小驼峰映射的问题
spring boot·后端·elasticsearch
ai小鬼头7 小时前
AIStarter如何快速部署Stable Diffusion?**新手也能轻松上手的AI绘图
前端·后端·github
小赖同学啊7 小时前
物联网数据安全区块链服务
开发语言·python·区块链
码荼7 小时前
学习开发之hashmap
java·python·学习·哈希算法·个人开发·小白学开发·不花钱不花时间crud
IT_10247 小时前
Spring Boot项目开发实战销售管理系统——数据库设计!
java·开发语言·数据库·spring boot·后端·oracle
bobz9658 小时前
动态规划
后端