Python老手也会犯的20个新手级错误

网站建设4年前发布
46 0 0

作者 | Avi_Chawla,译者 | 王德朕,
,编程(不仅Python,也包括其它编程语言)最好的一点是,有多种方法来实现同一解决方案。,
,20230306135506125d679943b862944dd1455ca8a7432abbaa6a569,使用不同的方法来达到相同的结果(图像由作者绘制),
,由于下述原因,有些方法会比其他方法更好:,在这篇文章中,我将向你介绍20种场景,这些场景都会让开发者不知不觉的陷入臃肿,丑陋,复杂的Python编码陷阱中,从而限制发挥Python的潜力。,除此之外,我还会针对每个错误提供一个替代方案进行解决。,​点击这里查看本文的代码​,开始吧!,
,202303061355068514e1e61dd88d668868611348bed5328e872d204,新手写法,如果你想打印多个变量,简单的方式是为每个变量都使用 print 语句。,20230306135507c59813e36bae5735e26049982c2fdee5cc2221443,优雅的写法,根据经验,使用多个 print 语句通常是编程人员(特别是新手)在 Python 中编码时最常犯的错误,因为他们不知道使用 print 语句,可以在一行代码中打印多个变量,代码如下:,上述 sep 参数用于指定 print 语句输出各个变量值(a,b,c)之间的分隔符。,注意:end 参数用于设置 print 语句输出内容的结尾字符。,上述代码中,参数 end=”\n---\n” 用于当输出一行后,输出 ---,然后在输出新一行字符。,,20230306135507231935980f3c932e6ba3054eafba2085073e57952,新手写法,如题所示,你的目标是多次打印相同的变量,所以你会创建一个 FOR 循环并迭代预期打印次数,对吗?我的意思是,这有什么问题吗?,20230306135553b35e98d062338f3cc53860065cf485ee89c589406,优雅的写法,虽然编写一个FOR循环没有坏处,并且一切正常,但是没有必要编写一个 FOR 循环来多次打印同一变量。,
,2023030613555304aa203006da23be189863ae08a1d3537f42ab311,新手的写法,方法1:,为实现这一目标,一般需要定义一个新变量(idx)跟踪索引值,并在迭代时对它递增,代码如下:,方法2:,如果不使用上述方法,人们还会创建一个 range 迭代器来跟踪索引,代码如下:,2023030613550906b45d486cacb1b6c86873c58ee23098d42d70924,优雅的写法,感谢设计了 enumerate() 函数的开发人员,使用这种方法可以按照下述方式跟踪索引(idx)和值(i)。,
,
,20230306135553b47483779528fbc51852273ec4b742e65b9bbe504,字符串的列表(图像由作者绘制),202303061355103417c6162d00f455b421670f3901cb09b3b7e3467,新手写法,如下所示,使用 FOR 循环每次收集一个元素,20230306135510297760f11dd07884f8044897887aa25942fec5807,优雅的写法,将列表转换为字符串的优雅方法是使用 join() 方法,如下所示:,上述代码不仅可以避免编写一些不必要的长代码,而且与 FOR 循环方法一样直观。,
,20230306135511a29dd0a45049c5d0e1f7206afdfcdd51472727249,新手写法,20230306135512039c6a3061c53b4cb69349e95c1f7604a3bdbd173,从列表中删除重复项(图像由作者绘制),再次使用 FOR 循环,通过迭代列表并在新列表中存储唯一的元素来实现。,2023030613551267284fd86ebf9436827069273ccb69d7c0e0ff333,优雅的写法,只需要一行 Python 代码就可以从列表中删除重复内容,如下所示:,上面的代码返回一个集合,你可以将其转换为列表:,
,2023030613555488c52f389437554b8be261c8d7b5a715acb0a9741,新手写法,如果你想知道某个元素是否存在于列表(或集合)中,并返回一个布尔值(如果存在则为 True,否则为 False),新手实现如下所示:,代码有点多,是吧?,20230306135513321b3bc10d2f44487ac201c34cb2a56d7500c3872,优雅的写法,通过关键字in 可以使用一行代码实现。,
,20230306135514d7fe0e791ee83ec614a18513074cef64f1e5bc284,新手写法,该形式与第3-4节中所做相同,也就是为索引定义一个特定变量,这种实现比较简单,如下所示:,20230306135513083041887ed827d051b259a4358cabfb30a021841,优雅的写法,有经验的方法是使用 zip() 函数,该函数可以在两个可迭代对象将对应位置的值进行匹配。,
,2023030613555599877d30255fe525bd6507a1e3245751c10a84902,逆向列表(图像由作者绘制),2023030613551549233e95276590d32e6026db04f485eeb5a1fb544,新手写法,正如前文所示,我们可以在列表上进行反向迭代并将元素附加到新列表中,代码如下:,20230306135516f9d99ea38ea9dbc2eae4816930f99a23b561fc560,优雅的写法,如果你了解 Python 中的切片,那优秀的解决方案只需要一行代码。,不需要 FOR 循环!,
,20230306135516d3dec9256606a4fdc75906adf0515504428351488,新手写法,在扩展了上述情况(#9--反转列表)的思路之后,我们可以检查回文列表结构。,202303061355161927c99193f9a48651750553a1920747e1e285995,优雅的写法,正如前文讨论的那样,有经验的方式是使用切片,并将结果与原列表进行比较。,
,20230306141404043cecb380d57eb32cd1009ef4c109e13021ef756,新手写法,查找元素频率的简单方法是使用 FOR 循环在列表迭代,然后统计元素出现的次数。,20230306135517367359c00f396d8ffdb162d07c3efbb8cbd260672,优雅的写法,在这种情况下,避免编写 FOR 循环的有经验写法是使用 count() 方法。,也可以对字符串变量使用 count() 方法。,
,2023030613555699c093769e3f675dd0a416fb879e94ac905326635,新手写法,本次目标是从 start_index 位置开始,返回一个长度为 n_chars 的字符串子串。,新手解决这个问题的方法是使用 FOR 循环,如下所示:,2023030613551809ee14d646971b78038377051af38af525607b663,优雅的写法,使用切片,可以避免 FOR 循环。,
,假设你想声明一个值为1021的整数变量。,20230306135519182d9fc666ec4de72bb73018324e6487df75b4371,新手写法,理想情况下,人们会连续写0,并在打字时进行计数,但如果有人想引用这个代码,他们数0难道不会很麻烦吗?,20230306135520d556fb26726e7d776e772419a5d98487a32c5c391,优雅的写法,为了提高可读性,可以用 _(下划线)分隔一组0,如下所示:,但这仍然是一个麻烦,为什么数 0?,如果数字可以表示为 a^b 形式,那应该使用 pow() 方法。,2023030613552016232f085f495d39200024263a5be897ab3b96823,给定一个字符串,目标使大写字母变成小写,反之亦然。,2023030613552005526763694ee822d2f606640ba29b5e261f72771,新手写法,简单的方法是检查每个元素的大小写,然后对每个字符都进行转换。,输出没有问题,但为什么要这么做?,20230306135557b2a2b0e56a04ef35dd83120f53ff9d86211d56346,优雅的写法,使用  swapcase ()方法。,
,
,20230306135522861672c37799e61f8c766351794991bcc7e0ac742,合并两个集合(图像由作者绘制),2023030613552232f01235000a4240edc2777611da52fddc6b6b672,新手写法,遍历这两个集合,将元素添加到一个新的集合中。,代码太多了,不是吗?让我们把它精简到一行。,202303061355236244d3b3418403559fe201599c2ce749a6c8b5661,优雅的写法,Python中的集合为两个集合的合并提供了一个union() 方法。,更重要的是,你可以将其扩展到任意数量的输入集合。,这很酷吧?想象一下,要合并4个集合,需要编写多少个 FOR 循环?,
,20230306135523c212344042f3834cc042368074cda521b0738c195,新手写法,与上面讨论的合并情况类似,我们可以寻找两个集合之间的共同元素,如下所示:,20230306135523b20ca20598f47b0536d956a03c69ed46932288332,优雅的写法,你可以使用 intersection() 方法实现同样的功能:,
,为了详细说明这一点,假设你想实现如下逻辑。,20230306135558e34041a4155480242415199ac4cad5faf4018e675,函数将输入映射到输出(图像由作者绘制),2023030613552581d84d501bc887bd78a399ef43564f8b0159c7501,新手写法,可以使用多个 OR 分隔条件实现上述逻辑。,20230306135525d7eb980985bfe1673ac578b7095ab1cb791025613,优雅的写法,避免使用多个条件语句的方法是使用关键字 in,代码如下:,
,给定一个表示整数的字符串列表,目标修改数据类型将其转换为整数列表。,20230306135525d1e629f84e2986891c9050051132badea10e8b134,新手写法,使用 FOR 循环和类型强制转换对单个元素进行变更。,20230306135526162fa8677229f9a0ec0664946e2705450d5361830,优雅的写法,聪明的做法是使用 map() 函数,如下所示:,map() 函数接收的第一个参数是 function(int),第二个参数是可迭代对象(input_list)。,
,给定两个变量,目标是对变量值进行交换。,20230306135527257a8c21480f82b06531159f164356bc92d8e1660,新手写法,大多数C/C++程序员在这里采取的方法是定义一个新的变量(temp),他们通常也会在Python中扩展这个方法。,20230306135558c7a6221436c091bd5bf48491f3200bed034feb167,优雅的写法,幸运的是,Python 允许在一个语句中进行多次赋值,从而避免了对临时变量的需求。,
,给定两个列表(a的长度为n,b 的长度为 m),生成 (n*m)个组合。,20230306135559c195f6c66456beff6f783536b45f0d89b18d6a685,新手写法,编写两个嵌套的FOR循环,并将所有组合追加到列表中。,202303061355594407b08192183f96d7c86569a2e96da8d45f3b557,优雅的写法,优雅的写法是使用 itertools 库中的 product()方法,如下所示:,
,在这篇文章中,我展示了20种不同场景,我相信大多数Python程序员都经历过这些情况,而且可能也采取了错误的编码解决方案,如果你注意到,在大多数情况下,优雅的写法主要侧重于避免使用 FOR 循环进行编码。,作为这篇文章的重点,你应该永远记住,在大多数情况下,你想出的第一个解决方案并不是最优方案,因此,使用谷歌搜索总是有帮助的,这也是为什么不完美主义的思维方式,对一名讲究的程序员非常重要的原因(不仅是Python,其它语言也一样)。,原文链接:,​​https://towardsdatascience.com/20-newbie-mistakes-that-even-skilled-python-programmers-make-6879048731a4​​,王德朕,51CTO社区编辑,10年互联网产研经验,6年IT教培行业经验。,

© 版权声明

相关文章