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

引言

很多人的第一语言并不是python,可能是C,C++,或者Java,但是随着人工智能的到来,越来越多的公司或部分在技术选型上倾向于python,我相信大家都有学习基本语法的能力,但是在这个过程中,很可能因为自己已经学过其他编程语言,导致对python并不是足够的"甚解",写出的代码也只是单纯的将其他语言的实现"翻译"成python,也就是不够pythonic,那这篇文章就是写给你看的。

什么是pythonic

"Pythonic"是Python社区独有的形容词,意指"符合Python风格的"、"用Python最自然、最优雅的方式来解决问题"。它不仅仅是语法层面的规范,更是一种编程哲学和思维方式。正如Python之父Guido van Rossum倡导的:"There should be one---and preferably only one---obvious way to do it."(做一件事应该有唯一且明显的方式。)

在Python中,pythonic代码通常具有以下特点:

  • 简洁明了:避免冗余,代码短小精悍。
  • 可读性强:易于理解,命名规范,结构清晰。
  • 善用Python特性:如列表推导式、生成器、内建函数等。
  • 优雅而高效:既不取巧,也避免过度复杂。

不知道大家是否写过golang, golang几乎每个函数的返回值都是两个以上 (res,error),过分的强调异常处理导致代码十分的冗长且可读性很差。相较而言,python的写法更为简洁直观,表达意图一目了然,这正是pythonic的魅力所在。

常见的pythonic风格的代码

for循环

for循环和if分支应该是编程时最常用的部分了,大部分人刚学python时会写出如下代码:

Python 复制代码
for i in range(len(my_list)):
    print(my_list[i])

这种写法没什么问题,但其实并不够简洁,下面的方式更加的pythonic

Python 复制代码
for item in my_list: 
    print(item)

更少的字符反而提高了可读性,简洁优雅的同时也不会有数组越界的顾虑

"那有的时候因为需要考虑索引 ,有没有带索引的写法呢?"

有的兄弟,有的,使用内置函数enumerate

Python 复制代码
for idx, item in enumerate(my_list):
    print(f"{idx}: {item}")

if 语句

当使用if对某个变量进行判断时,一个经典场景是判断字符串是否为空:

Python 复制代码
if astr == "" or astr == None:

if len(alist) == 0 or alist == None:

这么写就太丑陋啦,python可以更加优雅的实现:

Python 复制代码
if not astr:

在if-else分支的场景下还可以使用 三元表达式来简化复杂度:

Python 复制代码
if score >= 60:
    result = "及格"
else:
    result = "不及格"

# 可以用
result = "及格" if score >= 60 else "不及格"

当然了,复杂的逻辑还是用if-else比较好哈哈。

字符串拼接

拼接字符串的时候,Java里有的人用+号,有的人从性能考虑用·StringBuilder,而在python里,可以用f-string(这个我估计大家都会,十分的方便)

Python 复制代码
astr = f"{var1}_{var2}"

如果是数组,可以使用join方法

Python 复制代码
words = ['Hello', 'World', '!']
sentence = ' '.join(words)

列表表达式和生成器表达式

列表推导式用于生成新列表:

Python 复制代码
squares = [x ** 2 for x in range(10)]
# 等价于
squares = []
for x in range(10):
    squares.append(x ** 2)

生成器表达式类似,但返回的是迭代器,更节省内存(一般数据量超级大时才需要使用):

Python 复制代码
squares_gen = (x ** 2 for x in range(10))

不过和三元表达式一样,过于复杂的场景下 这些都会显著降低可读性,反而不如普通循环

相关推荐
Pyeako1 分钟前
opencv计算机视觉--DNN模块实现风格迁移
python·opencv·计算机视觉·pycharm·dnn·预处理·风格迁移
m0_706653232 分钟前
用Python创建一个Discord聊天机器人
jvm·数据库·python
Remember_9936 分钟前
Spring 核心原理深度解析:Bean 作用域、生命周期与 Spring Boot 自动配置
java·前端·spring boot·后端·spring·面试
tlwlmy7 分钟前
python excel图片批量导出
开发语言·python·excel
ValhallaCoder9 分钟前
hot100-矩阵
数据结构·python·算法·矩阵
那年我七岁11 分钟前
android ndk c++ 绘制图片方式
android·c++·python
Java后端的Ai之路12 分钟前
【Python教程10】-开箱即用
android·开发语言·python
深蓝电商API17 分钟前
异步爬虫中代理池的并发管理
开发语言·爬虫·python
B站计算机毕业设计超人18 分钟前
计算机毕业设计PySpark+Hive+Django小红书评论情感分析 小红书笔记可视化 小红书舆情分析预测系统 大数据毕业设计(源码+LW+PPT+讲解)
大数据·人工智能·hive·爬虫·python·spark·课程设计
kiss strong22 分钟前
springboot替换word模板&加入二维码&加水印&转为pdf
spring boot·后端·pdf