引言
很多人的第一语言并不是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))
不过和三元表达式一样,过于复杂的场景下 这些都会显著降低可读性,反而不如普通循环