代码写得好不好,看这3个Python内置函数会不会用
我当老师这些年,看过太多学生写的Python代码。有的人写了三年,代码还是像一团乱麻。有的人刚学半年,写出来的东西就让人看着舒服。差距在哪?不是语法不会,是有些内置函数没用对。
第一,enumerate。很多人写循环的时候,喜欢这样写:
i = 0
for item in list:
print(i, item)
i += 1
这不是错,但啰嗦。你手动维护了一个计数器i,万一忘记加1了,或者循环里有continue跳过了,i就对不上了。一个简单的enumerate就能解决:
for i, item in enumerate(list):
print(i, item)
代码少了两行,逻辑更清楚。我有个学生以前老抱怨代码调试半天找不到bug,后来我让他把所有手动计数的循环都改成enumerate,问题少了一半。
第二,zip。很多人处理多个列表的时候,会这样写:
names = ['张三', '李四', '王五']
scores = [90, 85, 88]
for i in range(len(names)):
print(names[i], scores[i])
用下标访问数组,看着就累。你仔细想想,这里真正想干的事是什么?是把两个列表里对应位置的元素配对。Python已经给了你现成的工具:
for name, score in zip(names, scores):
print(name, score)
代码少了,可读性高了。而且zip能处理任意多个列表,比手动下标灵活得多。更妙的是,如果两个列表长度不一样,zip会自动在最短的那个结束时停止,不会抛出索引越界的异常。
第三,any 和 all。这两个函数很多人不知道,写判断的时候写出一长串逻辑:
def has_even(numbers):
for num in numbers:
if num % 2 == 0:
return True
return False
这个没错,但可以更直接。用any一句话就完了:
def has_even(numbers):
return any(num % 2 == 0 for num in numbers)
同理,检查所有元素是否都大于0,用all:
def all_positive(numbers):
return all(num > 0 for num in numbers)
代码是给人读的,不是给机器读的。你写代码的时候,脑子里想的应该是“我要表达什么逻辑”,而不是“我该用哪个变量来暂存这个中间结果”。这三个函数能帮你说出你想说的话,而不是写出机器能听懂但人看不懂的指令。
我见过太多人,写代码像在写流水账。明明可以用一个函数说清楚的事,偏要写个循环加个判断。你省的不是代码量,是读你代码的人的时间。那个读你代码的人,很可能就是你自己,下周的你。