【转载】Python 老手也会犯的 20 个新手级错误(上)

252 阅读6分钟

英文原文链接20 Newbie Mistakes that Even Skilled Python Programmers Make | Avi_Chawla

中文译文链接Python 老手也会犯的 20 个新手级错误 | 王德朕

编程(不仅 Python,也包括其它编程语言)最好的一点是,有多种方法来实现同一解决方案。

图片 使用不同的方法来达到相同的结果(图像由作者绘制)

由于下述原因,有些方法会比其他方法更好:

  • 消耗更少的内存
  • 运行效率
  • 较少的代码
  • 更容易理解
  • 逻辑简单

在这篇文章中,我将向你介绍 20 种场景,这些场景都会让开发者不知不觉的陷入臃肿,丑陋,复杂的 Python 编码陷阱中,从而限制发挥 Python 的潜力。
除此之外,我还会针对每个错误提供一个替代方案进行解决。
开始吧!

1. 多次使用打印语句

新手写法

如果你想打印多个变量,简单的方式是为每个变量都使用 print 语句。

a, b, c = 1053  
print(a)  
print(b)  
print(c)  

优雅的写法

根据经验,使用多个 print 语句通常是编程人员(特别是新手)在 Python 中编码时最常犯的错误,因为他们不知道使用 print 语句,可以在一行代码中打印多个变量,代码如下:

a, b, c = 1053  
print(a, b, c, sep = "\n")  

上述 sep 参数用于指定 print 语句输出各个变量值(abc)之间的分隔符。注意:end 参数用于设置 print 语句输出内容的结尾字符。

a, b, c = 1053  
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 循环将列表转换为字符串

image.png 字符串的列表(图像由作者绘制)

新手写法

如下所示,使用 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 循环从列表中删除重复项

新手写法

image.png 从列表中删除重复项(图像由作者绘制)

再次使用 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 = [13625]  
list2 = [04197]  
for idx in range(len(list1)):  
    print("value1 =", list1[idx], "value2 =", list2[idx], sep = " ")  

优雅的写法

有经验的方法是使用 zip() 函数,该函数可以在两个可迭代对象相对应位置的值进行匹配。

list1 = [13625]  
list2 = [04197]  
  
for i, j in zip(list1, list2):  
    print("value1 =", i, "value2 =", j, sep = " ")  

8. 使用 FOR 循环反转列表

image.png 逆向列表(图像由作者绘制)

新手写法

正如前文所示,我们可以在列表上进行反向迭代并将元素附加到新列表中,代码如下:

input_list  = [12345]  
output_list = []  
  
for idx in range(len(input_list), 0, -1):  
    output_list.append(input_list[idx-1])  
  
print(output_list)  

优雅的写法

如果你了解 Python 中的 切片,那优秀的解决方案只需要一行代码。

input_list  = [12345]  
  
output_list = input_list[::-1]  
print(output_list)  

不需要 FOR 循环!

9. 使用 FOR 循环检查回文结构

新手写法

在扩展了上述情况(8. 反转列表)的思路之后,我们可以检查回文列表结构。

input_list  = [12321]  
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  = [12321]  
  
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")  

更多

【转载】Python 老手也会犯的 20 个新手级错误(下)