脚本之家,脚本语言编程技术及教程分享平台!
分类导航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|shell|

服务器之家 - 脚本之家 - Python - 初学者易犯的四个Python错误!

初学者易犯的四个Python错误!

2024-05-08 18:00哈希编程 Python

Python 是一种学习起来极其简单的语言,它不会强迫你使用特定的规定。但是也容易让人陷入一些陷阱,让你表现得像初学者。为避免看起来像个完全的新手,请查看下面的技巧以及如何纠正它们。

Python 是一种学习起来极其简单的语言,它不会强迫你使用特定的规定。但是也容易让人陷入一些陷阱,让你表现得像初学者。为避免看起来像个完全的新手,请查看下面的技巧以及如何纠正它们。

初学者易犯的四个Python错误!

1. 不会用enumerate()

Python 让遍历事物变得超级简易,比如列表。看看下面的例子:

vals = ['Python', '好玩!']
for val in vals:
    print(val)

# 输出:
# Python
# 好玩!

如果你需要引用每个项目的索引,会发生些什么呢?你可能会遇到,甚至写出如下所示的代码:

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

# 输出:
# 0 Python
# 1 好玩!

虽然这行得通,但不够优美!同时它也无法立即明白你的代码在做什么。

这就是 enumerate() 函数派上用场的地方!看看它是如何让这个过程变得更容易:

vals = ['Python', '好玩!']
for i, val in enumerate(vals):
    print(i, val)

# 输出:
# 0 Python
# 1 好玩!

这是不是好多了?

作为一个专业的提示,你甚至可以改变初始值。假如你想让从索引1开始迭代,则可以简单地写为:

vals = ['Python', '好玩!']
for idx, val in enumerate(vals, start=1):
    print(idx, val)

# 输出:
# 1 Python
# 2 好玩!

好的,让我们深入研究下一个新手习惯!

2. 不会用三元运算符

当你使用 if-else 语句进行值的分配时,你为一个简单的操作写了许多行代码。看看下面的场景:

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

print(raise_amount)

# 输出:
# 20

在上面的例子中,创建了一个 if-else 语句,检查某人卖出的金额是否超过 50。如果是的话,他们就会涨薪 20。否则,他们将获得 10 的涨幅。

我们的代码很清晰,但并不简练。此时可通过使用三元运算符大大简化:

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

print(raise_amount)

# 输出:
# 20

这对于非常简单的分配赋值来说效果最好。当然你可以让其变的更复杂,但不要为了简练而牺牲可读性!

3. 不会用推导

3a. 正确使用推导

Python 推导可以轻松创建列表、字典,甚至生成器。它们提供了一种优雅且可读的方式来轻松创建数据结构。

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

squares = []
for i in range(1, 6):
    squares.append(i ** 2)

print(squares)

# 输出:
# [1, 4, 9, 16, 25]

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

squares = [i ** 2 for i in range(1, 6)]
print(squares)

# 输出:
# [1, 4, 9, 16, 25]

可以看到使用列表推导多么的简单和明确!代码不仅更精简,且更容易阅读。

创建字典推导也同样容易。再通过创建一个字典来比较两种方法,其中键是原始数字,值是其平方:

squares = {}
for i in range(1, 6):
    squares[i] = i ** 2

print(squares)

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

现在让我们看看我们如何用字典推导来简化!

squares = {i: i ** 2 for i in range(1, 6)}
print(squares)

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

现在,大家可能很容易过度使用推导用于生成列表或字典。但除非有意义,否则不要把它们用在所有事情上!

3b. 过度使用推导

Python 推导很强大。你可以在里面构建复杂的 if-else 语句,甚至可以在其中互相嵌套。

让我们看看我们如何应用 if-else 语句:

even_odd_numbers = [
    "偶数" if num % 2 == 0 else "奇数"
    for num in range(10)
]
print(even_odd_numbers)

# 输出:
# ['偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数', '偶数', '奇数']

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

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

哎!阅读起来有点费劲了。这就是重点说明的地方 —— 如果推导不清晰,就不要写它。

让我们将这个推导转换成一个循环看看,能否更易读:

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 自带的一个隐藏的宝石。尽管表面上,它的许多功能看似简单,但它们提供了优雅且强大的方式来迭代不同的对象。

4a. 防止嵌套循环

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

colors = ['红色', '绿色']
sizes = ['S', 'M', 'L']

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

# 输出:
# 红色 S
# 红色 M
# 红色 L
# 绿色 S
# 绿色 M
# 绿色 L

与这篇文章中其他内容一样,这种方法行得通,但它并不真正的优雅。

幸运的是,itertools 附带了 product() 函数,它生成所有项的笛卡尔积。意味着可以在单个的for循环中直接解包值,如下所示:

from itertools import product

colors = ['红色', '绿色']
sizes = ['S', 'M', 'L']

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

# 输出:
# 红色 S
# 红色 M
# 红色 L
# 绿色 S
# 绿色 M
# 绿色 L

可以看到这种方法有多么简单!它也更加节省内存,因为它只在你需要使用值之前将值存储在生成器中。

4b. 列表成对循环

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

为此,可以写出以下代码:

vals = [1, 2, 3, 4]

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

# 输出:
# (1, 2)
# (2, 3)
# (3, 4)

这种方法效果很好,但既不容易阅读,也不明确它的作用。

这就是 Python 3.10 引入的 pairwise() 函数派上用场之处!让我们看看如何简化代码:

from itertools import pairwise

vals = [1, 2, 3, 4]

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

# 输出:
# (1, 2)
# (2, 3)
# (3, 4)

这是我们之前写过的代码的更明确的版本,可以立即理解代码的目标。

itertools 库为你提供了许多对于迭代对象非常有用的函数。知道何时应用这些函数真正将你的技能提升到另一个层次。

结论

掌握 Python 不仅仅是记住语法 —— 还需要拥抱优雅,知道何时平衡简洁和可读性。

记住 Python 的禅宗:

  • 优美胜于丑陋(Python 以编写优美的代码为目标)
  • 明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
  • 简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
  • 复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
  • 扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
  • 间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
  • 可读性很重要(优美的代码是可读的)
  • 即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)

原文地址:https://mp.weixin.qq.com/s?__biz=MzkwMzYxODY0Mg==&mid=2247485179&idx=1&sn=89356a09e154e4d148a73e301b306ac5

延伸 · 阅读

精彩推荐
  • PythonPython float函数实例用法

    Python float函数实例用法

    在本篇文章里小编给大家整理的了一篇关于Python float函数实例用法,有兴趣的朋友们可以学习下。...

    小妮浅浅6652021-09-22
  • Python七个Python必备的GUI库

    七个Python必备的GUI库

    这篇文章主要介绍了七个Python必备的GUI库,帮助大家更好的理解和学习使用python制作gui程序,感兴趣的朋友可以了解下...

    小F7282021-10-21
  • PythonPython脚本后台运行的五种方式

    Python脚本后台运行的五种方式

    最近需要在后台运行脚本,本文主要介绍了Python脚本后台运行的五种方式,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可...

    黑面狐11902022-10-12
  • PythonPython四大金刚之列表详解

    Python四大金刚之列表详解

    这篇文章主要介绍了Python的列表,小编觉得这篇文章写的还不错,需要的朋友可以参考下,希望能够给你带来帮助...

    43439292022-02-13
  • Python利用Python实现学生信息管理系统的完整实例

    利用Python实现学生信息管理系统的完整实例

    这篇文章主要给大家介绍了关于如何利用Python实现学生信息管理系统的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参...

    Miku丨无形12512021-08-20
  • Python分享一个常用的Python模拟登陆类

    分享一个常用的Python模拟登陆类

    这篇文章主要分享的是一个常用的Python模拟登陆类,而且可以支持cookie保存,十分的实用,这里推荐给大家,有需要的小伙伴可以参考下。 ...

    Cosven3422020-05-25
  • Python快速查询Python文档方法分享

    快速查询Python文档方法分享

    这篇文章主要介绍了快速查询Python文档方法分享,具有一定借鉴价值,需要的朋友可以参考下...

    feesland7622020-12-29
  • PythonPython利用matplotlib.pyplot绘图时如何设置坐标轴刻度

    Python利用matplotlib.pyplot绘图时如何设置坐标轴刻度

    Matplotlib是Python提供的一个二维绘图库,所有类型的平面图,包括直方图、散点图、折线图、点图、热图以及其他各种类型,都能由Python制作出来。本文主要...

    董付国11312021-01-29