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

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

相关推荐
guozhetao12 分钟前
【ST表、倍增】P7167 [eJOI 2020] Fountain (Day1)
java·c++·python·算法·leetcode·深度优先·图论
墨染点香18 分钟前
第七章 Pytorch构建模型详解【构建CIFAR10模型结构】
人工智能·pytorch·python
小鱼人爱编程41 分钟前
Java基石--反射让你直捣黄龙
前端·spring boot·后端
阿什么名字不会重复呢41 分钟前
在线工具+网页平台来学习和操作Python与Excel相关技能
python·数据分析
hqxstudying1 小时前
J2EE模式---服务层模式
java·数据库·后端·spring·oracle·java-ee
GM_8281 小时前
【最新最完整】SpringAI-1.0.0开发MCP Server,搭建MCP Client 实战笔记(进阶+详细+完整代码)
java·后端·ai编程·springai·mcp
程序员爱钓鱼1 小时前
Go语言实战案例-滑动窗口最大值
后端·google·go
Vertira1 小时前
python 阿里云 安装 dashscope的简介、安装
开发语言·python
Victor3562 小时前
MySQL(163) 如何理解MySQL的隔离级别?
后端
gc_22992 小时前
学习Python中Selenium模块的基本用法(1:简介)
python·selenium