什么是“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))

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

相关推荐
电院工程师4 分钟前
SM3算法Python实现(无第三方库)
开发语言·python·算法·安全·密码学
白露与泡影14 分钟前
springboot + nacos + k8s 优雅停机
spring boot·后端·kubernetes
菜鸟谢32 分钟前
windows xp 下载 sp0 sp1 sp2 sp3 sp4
后端
CodeDevMaster34 分钟前
在Jupyter Notebook中使用Conda虚拟环境
python·jupyter
AirMan34 分钟前
你真的懂 MySQL 的一致性读和当前读的区别吗?
后端·面试
David爱编程40 分钟前
容器性能优化实战指南——防止“吃爆”服务器就靠这些招!
后端·docker·容器
Android洋芋43 分钟前
GitHub项目部署的终极指南:从零到一掌握Docker实战
后端
冷月半明1 小时前
告别手动拖动!Python+dddocr自动化破解多缺口滑块
python
Kusunoki_D1 小时前
Python 实现 Web 静态服务器(HTTP 协议)
服务器·前端·python
林太白1 小时前
Next.js超简洁完整篇
前端·后端·react.js