4个Python初学者式的错误及其优化建议

 

让你看起来像初学者的4个Python错误,以及如何纠正它们。

Python是一种非常容易学习的语言,而且它不会强迫你使用特定的惯例。但它也很容易陷入一些误区,让你看起来像个初学者。为了避免看起来像个完全的初学者,请查看下面的提示以及如何解决这些问题。

1. 不使用enumerate()

Python使得遍历诸如列表之类的事物变得非常容易。让我们看看下面的示例:

vals = ['Python''is''fun!']
for val in vals:
    print(val)

# Returns:
# Python
# is
# fun!

但是,如果你需要引用每个项目的索引,该怎么办呢?你可能已经遇到或者甚至编写了类似下图所示的代码:

vals = ['Python''is''fun!']
for i in range(len(vals)):
  print(i, vals[i])

# Returns:
# 0 Python
# 1 is
# 2 fun!

这种方法虽然可行,但它并不优雅。它也不能立即清楚地说明你的代码在做什么。

这就是enumerate()函数的用武之地!让我们看看它如何使这个过程变得更加简单:

vals = ['Python''is''fun!']
for idx, val in enumerate(vals):
  print(idx, val)

# Returns:
# 0 Python
# 1 is
# 2 fun!

作为一个专业提示,你甚至可以改变起始值。比如说,你想从1开始标记项目,那么你可以这样简单地写:

vals = ['Python''is''fun!']
for idx, val in enumerate(vals, start=1):
    print(idx, val)
    
# Returns:
# 1 Python
# 2 is
# 3 fun!

2. 不使用三元运算符

当你使用if-else语句来分配值时,你需要编写很多行代码来完成一个简单的操作。请看下面的场景:

amount = 100
if amount > 50:
    raise_amount = 20
else:
    raise_amount = 10

print(raise_amount)

# Returns:
# 20

在上面的例子中,我们创建了一个if-else语句,检查某人的销售金额是否超过50。如果是,那么他们就获得20的涨幅。否则,他们获得10的涨幅。

虽然我们的代码很干净,但并不简洁。我们可以通过使用三元赋值来大大简化它:

amount = 100
raise_amount = 20 if amount > 50 else 10

print(raise_amount)

# Returns:
# 20

这种方法最适用于非常简单的作业。虽然可以做得更复杂,但不要为了简洁而牺牲可读性。

3. 使用推导式

3.1 不使用推导式

Python推导式使创建列表、字典和生成器变得轻而易举。它们提供了一种优雅且易读的方式来轻松创建数据结构。

让我们看一个例子,看看如何使用for循环来创建一个平方数列表:

squares = []
for i in range(16):
    squares.append(i ** 2)

print(squares)

# Returns:
# [1, 4, 9, 16, 25]

现在,让我们将其与列表推导式进行比较:

squares = [i ** 2 for i in range(16)]
print(squares)

# Returns:
# [1, 4, 9, 16, 25]

我们可以看到使用列表推导式要简单和明确得多!代码不仅更简洁,而且也更容易阅读。

创建字典推导式也同样简单。让我们再次比较这两种方法,创建一个字典,其中键是原始数字,值是它的平方:

squares = {}
for i in range(16):
    squares[i] = i ** 2

print(squares)

# Returns:
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

现在,让我们看看如何通过字典推导式来简化这一过程。

squares = {i: i**2 for i in range(16)}
print(squares)

# Returns:
# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

现在,过度使用推导式也是一个问题。所以在这里有一个额外的提示:除非有必要,否则不要什么都用它们。

3.2 过度使用推导式

Python推导式非常强大。你可以内置复杂的if-else语句,甚至可以将它们嵌套在彼此之中。

让我们看看如何加入if-else语句:

even_odd_numbers = [
    "Even" if num % 2 == 0 else "Odd" 
    for num in range(10)
]
print(even_odd_numbers)

# Returns:
# [‘Even’, ‘Odd’, ‘Even’, ‘Odd’, ‘Even’, ‘Odd’, ‘Even’, ‘Odd’, ‘Even’, ‘Odd’]

在上面的例子中,我们使用三元运算符在继续迭代的同时返回一个值。现在,这个例子相当简单,但让我们看一个更复杂的例子:

result = [x * 2 if x % 2 == 0 else x * 3 for x in range(10if x != 5]

这绝对不是什么有趣、可读的东西。这就引出了这里的重点——如果推导式比使用for循环更不清晰,那就不要写推导式。

让我们将这个推导式转换为一个循环,看看它变得有多易读:

result = []
for x in range(10):
    if x != 5:
        if x % 2 == 0:
            result.append(x * 2)
        else:
            result.append(x * 3)

可以看到,虽然我们用了更多行来编写这段代码,但它的可读性却大大提高了。

4. 不使用itertools

Python的itertools是内置于Python中的一个函数库。虽然表面上看,它的许多函数似乎很简单,但它们提供了优雅而强大的方式来遍历不同的对象。

4.1 避免嵌套循环

假设你有两个列表,你想遍历所有可能的组合。可以编写如下所示的嵌套for循环:

colors = ['Red''Green']
sizes = ['S''M''L']

for color in colors:
for size in sizes:
print(color, size)

# Returns:
# Red S
# Red M
# Red L
# Green S
# Green M
# Green L

与我们在本文中介绍的其他方法类似,这种方法虽然有效,但并不优雅。

值得庆幸的是,itertools提供了product()函数,它可以创建所有项目的笛卡尔积。这意味着我们可以在一个for循环中直接解包这些值,代码如下所示:

from itertools import product
colors = ['Red''Green']
sizes = ['S''M''L']

for color, size in product(colors, sizes):
print(color, size)

# Returns:
# Red S
# Red M
# Red L
# Green S
# Green M
# Green L

可以看到这种方法简单多了。

4.2 成对遍历列表

在某些情况下,你需要成对地遍历列表,这意味着你需要访问一个项目及其相邻的项目。

要做到这一点,可以编写以下代码:

vals = [1234]

for i in range(len(vals) – 1):
print((vals[i], vals[i+1]))

# Returns:
# (1, 2)
# (2, 3)
# (3, 4)

这种方法效果很好,但可读性不强,其作用也不是很明确。

这就是Python 3.10引入的pairwise()函数的用武之地。让我们看看如何简化代码:

from itertools import pairwise
vals = [1234]

for pair in pairwise(vals):
print(pair)

# Returns:
# (1, 2)
# (2, 3)
# (3, 4)

这是我们之前编写的代码的一个更加明确的版本,使我们能够立即了解代码的目的。

itertools库为用户提供了许多有用的对象迭代函数。知道何时应用这些函数可以将你的技能提升到更高的层次。

结论

掌握Python不仅仅是记住语法,更重要的是拥抱优雅,并知道何时在简洁和可读性之间取得平衡。

牢记Python之禅:

Beautiful is better than ugly.

Explicit is better than implicit.

Simple is better than complex.

Complex is better than complicated.

Flat is better than nested.

Sparse is better than dense.

Readability counts.

原创文章,作者:guozi,如若转载,请注明出处:https://www.sudun.com/ask/90685.html

(0)
guozi's avatarguozi
上一篇 2024年6月7日 上午10:25
下一篇 2024年6月7日 上午10:31

相关推荐

  • 网站被攻击了可以报警吗,网站被攻击有什么表现

    设置访问限制可以防止恶意攻击者通过暴力破解密码或其他方法侵入您的网站后端。可以通过IP黑名单、访问频率限制等方法来防止恶意攻击。 5.定期备份数据 定期备份网站数据是防止网站遭受攻…

    行业资讯 2024年5月6日
    0
  • ip被墙了什么意思,ip被墙能恢复吗

    4. 技术原因:您的IP也可能因技术问题而被封锁。在某些情况下,您的IP 可能会因服务器故障或网络连接不稳定而无法访问。 5.商业竞争:在某些情况下,一些公司可能会使用技术措施封锁…

    行业资讯 2024年5月11日
    0
  • 如何创建vm虚拟主机?

    想要拥有一个稳定、高效的网站,选择一款优秀的虚拟主机服务是至关重要的。而如何创建vm虚拟主机,也是很多网站管理员和网络从业者关心的问题。今天,我们就来探讨一下这个话题,通过介绍什么…

    行业资讯 2024年4月5日
    0
  • seo关键词优化主要包括

    SEO关键词优化,作为搜索引擎优化的重要一环,受到越来越多企业的关注。但是,什么是SEO关键词优化?为什么它如此重要?如何选择适合的关键词?关键词密度和分布又有哪些最佳实践?这些问…

    行业资讯 2024年4月1日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注