往事不堪回首,回忆曾经写过的最蠢的Python代码

文章目录

  • 0 引言
  • 1 无限循环
  • 2 无效的变量赋值
  • 3 冗余的代码
  • 4 使用 eval 函数执行字符串代码
  • 5 不必要的类型转换
  • 6 使用 exec 执行外部命令
  • 7 使用混乱的命名
  • 8 使用硬编码的值
  • 9 忽略异常
  • 10 不合理的注释
  • 11 使用全局变量
  • 12 直接修改迭代对象
  • 13 滥用递归
  • 14 使用 += 运算符连接字符串
  • 15 漏掉缩进
  • 16 使用 is 进行浮点数比较
  • 17 无效的列表切片
  • 18 使用 continue 跳出多个循环

0 引言

没有写过蠢的代码,就不会知道自己曾经犯过哪些编程的低级错误。借此官方活动,回忆下曾经写过的最蠢的Python代码。

1 无限循环

while True:
    print("I am ZPILOTE!")

这段代码创建了一个永远不会结束的循环,因为条件始终为 True,没有停止或退出条件。所以一定要确保循环中包含适当的终止条件,以避免无限循环。

2 无效的变量赋值

x = x + 1

这段代码尝试将变量 x 的值与自身加1的结果进行赋值,但在赋值之前,x 并没有被定义,因此会引发 NameError在使用变量之前确保对其进行定义或初始化。

3 冗余的代码

if x > 5:
    print("x is greater than 5")
elif x > 3:
    print("x is greater than 3")

这段代码中的第二个条件 elif x > 3 是多余的,因为如果第一个条件 x > 5 成立,那么第二个条件肯定也成立。避免编写重复或多余的代码,确保每个条件或分支都有其独特的目的。

4 使用 eval 函数执行字符串代码

x = 5
eval("print(x + 1)")

使用 eval 函数可以执行字符串中的代码,但这也意味着它会执行任何传递给它的代码,包括潜在的恶意代码。这在安全性上是一个潜在的风险。避免使用 evalexec 执行字符串代码,尽量使用更安全的替代方案。

5 不必要的类型转换

x = str(5)

这段代码将整数值 5 转换为字符串类型,并将结果赋给变量 x。这是多余的,因为在大多数情况下,Python 能够自动处理不同类型之间的操作。避免进行不必要的类型转换,尽量让 Python 自动处理类型转换。

6 使用 exec 执行外部命令

import os
command = "ls"
exec(os.system(command))

使用 os.systemexec 来执行外部命令是一种不安全的做法,因为它允许执行任意的系统命令,可能导致安全问题。尽量避免使用 os.systemexec 执行外部命令,可以使用更安全的替代方案,如 subprocess 模块。

7 使用混乱的命名

a = 5
b = "hello"
c = a + b

这段代码使用了不具有描述性的变量名,使得代码难以理解和维护。良好的命名能够提高代码的可读性。选择具有描述性的变量和函数名,使代码更易于理解和维护。

8 使用硬编码的值

for i in range(10):
    print(i)

这段代码使用硬编码的值 10,而不是使用变量或常量来表示它。这会导致代码的可维护性降低,因为需要更改相同的值时,必须在多个位置进行修改。将常量或可配置的值存储在变量或常量中,以提高代码的可维护性。

9 忽略异常

try:
    # Some code
except:
    pass

这段代码使用了一个空的 except 块,它会捕获任何异常并简单地忽略它们,而不做任何处理。这可能会导致难以调试和定位错误。在代码中合理地处理错误和异常,避免简单地忽略它们,以便更好地调试和处理问题。

10 不合理的注释

x = 5  # This is a variable

这段代码的注释 # This is a variable 是多余的,因为它没有提供任何有用的信息,只是重复了代码本身的含义。

11 使用全局变量

def increment():
    global x
    x += 1

使用 global 关键字将局部变量提升为全局变量可以导致代码的可维护性降低,因为在整个程序中都可以修改和访问该变量,增加了代码的复杂性。尽量避免使用全局变量,而是使用函数参数和返回值来传递和获取数据。

12 直接修改迭代对象

for item in some_list:
    some_list.remove(item)

在迭代一个列表的同时,直接修改列表本身会导致遍历过程中的错误行为,因为列表的大小在迭代过程中发生了变化。在迭代对象时,避免直接修改它们,以免导致意外的行为。

13 滥用递归

def countdown(n):
    if n <= 0:
        return
    print(n)
    countdown(n - 1)

这段代码使用递归来实现倒计时,但没有设置递归的终止条件,导致无限递归,最终会导致栈溢出错误。在使用递归时,确保设置递归的终止条件,以避免无限递归。

14 使用 += 运算符连接字符串

result = ""
for i in range(10):
    result += str(i)

在循环中使用 += 运算符来连接字符串会导致性能问题,因为每次迭代都会创建一个新的字符串对象。更好的做法是使用列表或生成器来收集字符串,然后使用 join 方法来连接它们。

15 漏掉缩进

if True:
print("IndentationError: expected an indented block")

这段代码在if语句后面没有正确的缩进,导致 IndentationError确保代码块的缩进正确。

16 使用 is 进行浮点数比较

x = 0.1 + 0.1 + 0.1
if x is 0.3:
    print("x is equal to 0.3")

在这个例子中,使用 is 运算符进行浮点数比较是错误的。is 运算符用于比较对象的身份,而不是值。正确的做法是使用 == 运算符进行浮点数的值比较。

17 无效的列表切片

my_list = [1, 2, 3]
print(my_list[1:0])

这段代码中的切片 my_list[1:0] 是无效的,因为起始索引(1)大于结束索引(0)。正确的切片应该是 my_list[0:1]在使用列表切片时,确保起始索引小于结束索引,以获取正确的切片结果。

18 使用 continue 跳出多个循环

for i in range(5):
    for j in range(5):
        continue

这段代码中的 continue 语句只会跳出内部的循环,而不会跳出外部的循环。因此,它对于退出多个循环是无效的。要跳出多个循环,可以使用更复杂的条件或者使用标签和 break 语句来实现。




须知少时凌云志,曾许人间第一流。



⭐️

你可能感兴趣的:(Python,Bug&Log,python,开发语言,bug代码)