当前位置:首页 > 科技  > 软件

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

来源: 责编: 时间:2024-06-05 17:45:28 75观看
导读Python是一种非常容易学习的语言,而且它不会强迫你使用特定的惯例。但它也很容易陷入一些误区,让你看起来像个初学者。为了避免看起来像个完全的初学者,请查看下面的提示以及如何解决这些问题。1. 不使用enumerate()Pyth

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

1. 不使用enumerate()

Python使得遍历诸如列表之类的事物变得非常容易。让我们看看下面的示例:AXB28资讯网——每日最新资讯28at.com

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

但是,如果你需要引用每个项目的索引,该怎么办呢?你可能已经遇到或者甚至编写了类似下图所示的代码:AXB28资讯网——每日最新资讯28at.com

vals = ['Python', 'is', 'fun!']for i in range(len(vals)):  print(i, vals[i])# Returns:# 0 Python# 1 is# 2 fun!

这种方法虽然可行,但它并不优雅。它也不能立即清楚地说明你的代码在做什么。AXB28资讯网——每日最新资讯28at.com

这就是enumerate()函数的用武之地!让我们看看它如何使这个过程变得更加简单:AXB28资讯网——每日最新资讯28at.com

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

作为一个专业提示,你甚至可以改变起始值。比如说,你想从1开始标记项目,那么你可以这样简单地写:AXB28资讯网——每日最新资讯28at.com

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语句来分配值时,你需要编写很多行代码来完成一个简单的操作。请看下面的场景:AXB28资讯网——每日最新资讯28at.com

amount = 100if amount > 50:    raise_amount = 20else:    raise_amount = 10print(raise_amount)# Returns:# 20

在上面的例子中,我们创建了一个if-else语句,检查某人的销售金额是否超过50。如果是,那么他们就获得20的涨幅。否则,他们获得10的涨幅。AXB28资讯网——每日最新资讯28at.com

虽然我们的代码很干净,但并不简洁。我们可以通过使用三元赋值来大大简化它:AXB28资讯网——每日最新资讯28at.com

amount = 100raise_amount = 20 if amount > 50 else 10print(raise_amount)# Returns:# 20

这种方法最适用于非常简单的作业。虽然可以做得更复杂,但不要为了简洁而牺牲可读性。AXB28资讯网——每日最新资讯28at.com

3. 使用推导式

3.1 不使用推导式

Python推导式使创建列表、字典和生成器变得轻而易举。它们提供了一种优雅且易读的方式来轻松创建数据结构。AXB28资讯网——每日最新资讯28at.com

让我们看一个例子,看看如何使用for循环来创建一个平方数列表:AXB28资讯网——每日最新资讯28at.com

squares = []for i in range(1, 6):    squares.append(i ** 2)print(squares)# Returns:# [1, 4, 9, 16, 25]

现在,让我们将其与列表推导式进行比较:AXB28资讯网——每日最新资讯28at.com

squares = [i ** 2 for i in range(1, 6)]print(squares)# Returns:# [1, 4, 9, 16, 25]

我们可以看到使用列表推导式要简单和明确得多!代码不仅更简洁,而且也更容易阅读。AXB28资讯网——每日最新资讯28at.com

创建字典推导式也同样简单。让我们再次比较这两种方法,创建一个字典,其中键是原始数字,值是它的平方:AXB28资讯网——每日最新资讯28at.com

squares = {}for i in range(1, 6):    squares[i] = i ** 2print(squares)# Returns:# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

现在,让我们看看如何通过字典推导式来简化这一过程。AXB28资讯网——每日最新资讯28at.com

squares = {i: i**2 for i in range(1, 6)}print(squares)# Returns:# {1: 1, 2: 4, 3: 9, 4: 16, 5: 25}

现在,过度使用推导式也是一个问题。所以在这里有一个额外的提示:除非有必要,否则不要什么都用它们。AXB28资讯网——每日最新资讯28at.com

3.2 过度使用推导式

Python推导式非常强大。你可以内置复杂的if-else语句,甚至可以将它们嵌套在彼此之中。AXB28资讯网——每日最新资讯28at.com

让我们看看如何加入if-else语句:AXB28资讯网——每日最新资讯28at.com

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']

在上面的例子中,我们使用三元运算符在继续迭代的同时返回一个值。现在,这个例子相当简单,但让我们看一个更复杂的例子:AXB28资讯网——每日最新资讯28at.com

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

这绝对不是什么有趣、可读的东西。这就引出了这里的重点——如果推导式比使用for循环更不清晰,那就不要写推导式。AXB28资讯网——每日最新资讯28at.com

让我们将这个推导式转换为一个循环,看看它变得有多易读:AXB28资讯网——每日最新资讯28at.com

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

可以看到,虽然我们用了更多行来编写这段代码,但它的可读性却大大提高了。AXB28资讯网——每日最新资讯28at.com

4. 不使用itertools

Python的itertools是内置于Python中的一个函数库。虽然表面上看,它的许多函数似乎很简单,但它们提供了优雅而强大的方式来遍历不同的对象。AXB28资讯网——每日最新资讯28at.com

4.1 避免嵌套循环

假设你有两个列表,你想遍历所有可能的组合。可以编写如下所示的嵌套for循环:AXB28资讯网——每日最新资讯28at.com

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

与我们在本文中介绍的其他方法类似,这种方法虽然有效,但并不优雅。AXB28资讯网——每日最新资讯28at.com

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

from itertools import productcolors = ['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

可以看到这种方法简单多了。AXB28资讯网——每日最新资讯28at.com

4.2 成对遍历列表

在某些情况下,你需要成对地遍历列表,这意味着你需要访问一个项目及其相邻的项目。AXB28资讯网——每日最新资讯28at.com

要做到这一点,可以编写以下代码:AXB28资讯网——每日最新资讯28at.com

vals = [1, 2, 3, 4]for i in range(len(vals) - 1):    print((vals[i], vals[i+1]))# Returns:# (1, 2)# (2, 3)# (3, 4)

这种方法效果很好,但可读性不强,其作用也不是很明确。AXB28资讯网——每日最新资讯28at.com

这就是Python 3.10引入的pairwise()函数的用武之地。让我们看看如何简化代码:AXB28资讯网——每日最新资讯28at.com

from itertools import pairwisevals = [1, 2, 3, 4]for pair in pairwise(vals):    print(pair)# Returns:# (1, 2)# (2, 3)# (3, 4)

这是我们之前编写的代码的一个更加明确的版本,使我们能够立即了解代码的目的。AXB28资讯网——每日最新资讯28at.com

itertools库为用户提供了许多有用的对象迭代函数。知道何时应用这些函数可以将你的技能提升到更高的层次。AXB28资讯网——每日最新资讯28at.com

结论

掌握Python不仅仅是记住语法,更重要的是拥抱优雅,并知道何时在简洁和可读性之间取得平衡。AXB28资讯网——每日最新资讯28at.com

牢记Python之禅:AXB28资讯网——每日最新资讯28at.com

Beautiful is better than ugly.AXB28资讯网——每日最新资讯28at.com

Explicit is better than implicit.AXB28资讯网——每日最新资讯28at.com

Simple is better than complex.AXB28资讯网——每日最新资讯28at.com

Complex is better than complicated.AXB28资讯网——每日最新资讯28at.com

Flat is better than nested.AXB28资讯网——每日最新资讯28at.com

Sparse is better than dense.AXB28资讯网——每日最新资讯28at.com

Readability counts.AXB28资讯网——每日最新资讯28at.com

上述提示应能真正帮助你领悟Python之禅的这一开始的几行。AXB28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-92153-0.html四个Python初学者式的错误及其优化建议

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 万字聊一聊RocketMQ一条消息短暂而又精彩的一生

下一篇: 详解51种企业应用架构模式

标签:
  • 热门焦点
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月安卓手机性能榜:红魔8S Pro再夺榜首

    7月份的手机市场风平浪静,除了红魔和努比亚带来了两款搭载骁龙8Gen2领先版处理器的新机之外,别的也想不到有什么新品了,这也正常,通常6月7月都是手机厂商修整的时间,进入8月份之
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    六大权益!华为8月服务日开启:手机免费贴膜、维修免人工费

    8月5日消息,一年一度的华为开发者大会2023(Together)日前在松山湖拉开帷幕,与此同时,华为8月服务日也式开启,到店可享六大专属权益。华为用户可在华为商城Ap
  • 如何使用JavaScript创建一只图像放大镜?

    如何使用JavaScript创建一只图像放大镜?

    译者 | 布加迪审校 | 重楼如果您曾经浏览过购物网站,可能遇到过图像放大功能。它可以让您放大图像的特定区域,以便浏览。结合这个小小的重要功能可以大大改善您网站的用户体验
  • 重估百度丨“晚熟”的百度云,能等到春天吗?

    重估百度丨“晚熟”的百度云,能等到春天吗?

    ©自象限原创作者|程心排版|王喻可2016年7月13日,百度云计算战略发布会在北京举行,宣告着百度智能云的正式启程。彼时的会场座无虚席,甚至排队排到了门外,在场的所有人几乎都
  • 猿辅导与新东方的两种“归途”

    猿辅导与新东方的两种“归途”

    作者|卓心月 出品|零态LT(ID:LingTai_LT)如何成为一家伟大企业?答案一定是对“势”的把握,这其中最关键的当属对企业战略的制定,且能够站在未来看现在,即使这其中的
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 三星显示已开始为AR设备研发硅基LED微显示屏

    三星显示已开始为AR设备研发硅基LED微显示屏

    7月18日消息,据外媒报道,随着苹果首款头显产品Vision Pro在6月份正式推出,AR/VR/MR等头显产品也就将成为各大公司下一个重要的竞争领域,对显示屏这一关
Top
Baidu
map