英文原文链接:20 Newbie Mistakes that Even Skilled Python Programmers Make | Avi_Chawla
编程(不仅 Python,也包括其它编程语言)最好的一点是,有多种方法来实现同一解决方案。
使用不同的方法来达到相同的结果(图像由作者绘制)
由于下述原因,有些方法会比其他方法更好:
- 消耗更少的内存
- 运行效率
- 较少的代码
- 更容易理解
- 逻辑简单
在这篇文章中,我将向你介绍 20 种场景,这些场景都会让开发者不知不觉的陷入臃肿,丑陋,复杂的 Python 编码陷阱中,从而限制发挥 Python 的潜力。
除此之外,我还会针对每个错误提供一个替代方案进行解决。
开始吧!
1. 多次使用打印语句
新手写法
如果你想打印多个变量,简单的方式是为每个变量都使用 print 语句。
a, b, c = 10, 5, 3
print(a)
print(b)
print(c)
优雅的写法
根据经验,使用多个 print 语句通常是编程人员(特别是新手)在 Python 中编码时最常犯的错误,因为他们不知道使用 print 语句,可以在一行代码中打印多个变量,代码如下:
a, b, c = 10, 5, 3
print(a, b, c, sep = "\n")
上述 sep 参数用于指定 print 语句输出各个变量值(a,b,c)之间的分隔符。注意:end 参数用于设置 print 语句输出内容的结尾字符。
a, b, c = 10, 5, 3
print(a, end = "\n---\n")
print(b, end = "\n---\n")
print(c)
上述代码中,参数 end=”\n---\n” 用于当输出一行后,输出 ---,然后在输出新一行字符。
2. 使用 FOR 循环打印相同的变量
新手写法
如题所示,你的目标是多次打印相同的变量,所以你会创建一个 FOR 循环并迭代预期打印次数,对吗?我的意思是,这有什么问题吗?
repeat = 10
a = "ABC"
for _ in range(repeat):
print(a, end = "")
优雅的写法
虽然编写一个 FOR 循环没有坏处,并且一切正常,但是没有必要编写一个 FOR 循环来多次打印同一变量。
repeat = 10
a = "ABC"
print(a*repeat)
3. 创建独立变量来跟踪循环中的索引
新手的写法
方法1:
为实现这一目标,一般需要定义一个新变量(idx)跟踪索引值,并在迭代时对它递增,代码如下:
idx = 0
char_list = ["a", "b", "c", "d", "e", "f"]
for i in char_list:
print("index =", idx, "value =", i, sep = " ")
idx += 1
方法2:
如果不使用上述方法,人们还会创建一个 range 迭代器来跟踪索引,代码如下:
char_list = ["a", "b", "c", "d", "e", "f"]
for idx in range(len(char_list)):
print("index =", idx, "value =", char_list[idx], sep = " ")
idx += 1
优雅的写法
感谢设计了 enumerate() 函数的开发人员,使用这种方法可以按照下述方式跟踪索引(idx)和值(i)。
char_list = ["a", "b", "c", "d", "e", "f"]
for idx, i in enumerate(char_list):
print("index =", idx, "value =", i, sep = " ")
4. 使用 FOR 循环将列表转换为字符串
字符串的列表(图像由作者绘制)
新手写法
如下所示,使用 FOR 循环每次收集一个元素
char_list = ["A", "B", "C", "D", "E"]
final_str = ""
for i in char_list:
final_str += i
print(final_str)
优雅的写法
将列表转换为字符串的优雅方法是使用 join() 方法,如下所示:
char_list = ["A", "B", "C", "D", "E"]
final_str = "".join(char_list)
print(final_str)
上述代码不仅可以避免编写一些不必要的长代码,而且与 FOR 循环方法一样直观。
5. 使用 FOR 循环从列表中删除重复项
新手写法
从列表中删除重复项(图像由作者绘制)
再次使用 FOR 循环,通过迭代列表并在新列表中存储唯一的元素来实现。
char_list = ["A", "B", "A", "D", "C", "B", "E"]
final_list = []
for i in char_list:
if i not in final_list:
final_list.append(i)
print(final_list)
优雅的写法
只需要一行 Python 代码就可以从列表中删除重复内容,如下所示:
char_list = ["A", "B", "A", "D", "C", "B", "E"]
set(list(char_list))
上面的代码返回一个 集合,你可以将其转换为 列表:
char_list = ["A", "B", "A", "D", "C", "B", "E"]
list(set(list(char_list)))
6. 使用 FOR 循环在列表中检索元素
新手写法
如果你想知道某个元素是否存在于列表(或集合)中,并返回一个布尔值(如果存在则为 True,否则为 False),新手实现如下所示:
char_list = ["A", "B", "A", "D", "C", "B", "E"]
search_char = "D"
found = False
for i in char_list:
if i == search_char:
found = True
break
print(found)
代码有点多,是吧?
优雅的写法
通过关键字 in 可以使用一行代码实现。
char_list = ["A", "B", "A", "D", "C", "B", "E"]
search_char = "D"
search_char in char_list
7. 使用一个迭代变量在两个相同长度的迭代对象上进行迭代
新手写法
该形式与第 3-4 节中所做相同,也就是为索引定义一个特定变量,这种实现比较简单,如下所示:
list1 = [1, 3, 6, 2, 5]
list2 = [0, 4, 1, 9, 7]
for idx in range(len(list1)):
print("value1 =", list1[idx], "value2 =", list2[idx], sep = " ")
优雅的写法
有经验的方法是使用 zip() 函数,该函数可以在两个可迭代对象相对应位置的值进行匹配。
list1 = [1, 3, 6, 2, 5]
list2 = [0, 4, 1, 9, 7]
for i, j in zip(list1, list2):
print("value1 =", i, "value2 =", j, sep = " ")
8. 使用 FOR 循环反转列表
逆向列表(图像由作者绘制)
新手写法
正如前文所示,我们可以在列表上进行反向迭代并将元素附加到新列表中,代码如下:
input_list = [1, 2, 3, 4, 5]
output_list = []
for idx in range(len(input_list), 0, -1):
output_list.append(input_list[idx-1])
print(output_list)
优雅的写法
如果你了解 Python 中的 切片,那优秀的解决方案只需要一行代码。
input_list = [1, 2, 3, 4, 5]
output_list = input_list[::-1]
print(output_list)
不需要 FOR 循环!
9. 使用 FOR 循环检查回文结构
新手写法
在扩展了上述情况(8. 反转列表)的思路之后,我们可以检查回文列表结构。
input_list = [1, 2, 3, 2, 1]
output_list = []
for idx in range(len(input_list), 0, -1):
output_list.append(input_list[idx-1])
print(output_list == input_list)
优雅的写法
正如前文讨论的那样,有经验的方式是使用 切片,并将结果与原列表进行比较。
input_list = [1, 2, 3, 2, 1]
output_list = input_list[::-1]
print(output_list == input_list)
10. 使用 FOR 循环计算迭代对象中元素的出现次数
新手写法
查找元素频率的简单方法是使用 FOR 循环在列表迭代,然后统计元素出现的次数。
char_list = ["A", "B", "A", "D", "C", "B", "E"]
search_char = "B"
char_count = 0
for i in char_list:
if search_char == i:
char_count += 1
print(char_count)
优雅的写法
在这种情况下,避免编写 FOR 循环的有经验写法是使用 count() 方法。
char_list = ["A", "B", "A", "D", "C", "B", "E"]
char_list.count("A")
也可以对字符串变量使用 count() 方法。
string = "ABADCBE"
string.count("A")