kettle字符串操作不起作用_7个Python程序员常犯的操作错误,你都占几个?

问题仅花费了几个小时就浮出水面。但是,找到问题的根源需要更多的时间。该修复需要一天的其余时间。那时我还是一个初学者。这样,我就学到了关于Python生命中的列表的重要课程。

这听起来很熟悉吗?每个人都会发生这种情况,但最好还是从别人的错误中学习。在这篇文章中,我收集了其中的七个,可以为您节省大量的调试时间。

具有副作用的功能

由于Python不是像Haskell这样的纯函数式语言,因此函数会产生副作用。严格来说,这不是一个错误,但是很容易无意间弄乱事情。下面的示例演示了该问题。

5d6a3c0bb850d9296391a22172c2dc0d.png

在Python中,对象是引用类型。因此,当您将列表作为参数传递时,将传递引用而不是值。这意味着,如果您在函数中更改它们,则更改将反映在外部。

这可能会导致一些非常令人讨厌的意外情况和调试时间。(请参阅我的介绍。)提防这些,并尽早避免麻烦。

默认参数中的函数调用

默认参数有时很难使用。看一下以下内容。

b25a0be8dece7f3d48f2f06ae9d4c4e9.png

为什么每次通话的返回值都一样?原因是在定义函数时,Python会使用默认参数评估表达式。如果要动态生成默认参数,则可以执行以下操作。

ed6775976370f9e0878694b4e034a791.png

可变的默认参数

此问题是以上两个的结合。您是否遇到过以下情况?

ceefc1a042d35500fe73a57ccf9ca32e.png

这里发生两件事。

1. [] 定义函数后,Python会对表达式求值。这相当于调用list()

2. 该对象的引用绑定到参数。因此,无论何时调用该函数,都将使用相同的对象。

因此,使用可变对象作为默认参数不是一个好主意。你绝对不应该那样做。

参考作业

如我们所见,每个对象都是Python中的引用类型。除了将它们传递给函数之外,这还可能引起一些混乱。请参见以下示例:

6e633c1ce1526e302938de4bade826d2.png

当你执行b = a,你实际存储的参考的a。因此,a和b指向相同的对象。要解决此问题,您应该使用内置deepcopy功能。这将所有值类型属性递归复制到新变量。

d61f76ce509b13fc225c697e9c3f082f.png

如果您使用整数而不是list尝试相同的操作,则所有操作都将与您期望的一样。原因是整数类型是不可变的,因此在更改它们时会覆盖引用。

5.从东西导入*

我知道,我们都做到了这一点。这有几个缺点。

首先,不同名称空间中的函数可以具有相同的名称,从而导致整个代码库混乱。

其次,当您在Python中导入模块时,该模块中的所有代码都将被执行。如果有很多子模块要导入,这会大大降低速度。因此,如果仅导入NumPy以生成随机数,则最好使用

from numpy.random import random
import numpy as np

6.使用字符串串联连接路径

假设您必须data.csv从变量给定的文件夹中打开一个名为的文件data_folder。应该如何确定文件路径?如果你在做

data_path = data_folder +“ data_path = data_folder + "/data.csv"/data.csv”

那你做错了。例如,这在Windows上将不起作用。您可能没有经验,但是使用不同开发设置的同事肯定会感到痛苦。

要解决此问题,您应该使用pathlib,Python的内置工具或仅使用os.path.join函数:

data_path = os.path.join(data_folder, "data.csv")

7.测试覆盖率低

这是一个高水平的问题。尤其是当您是初学者时,单元测试的好处尚不清楚。但是,每个经验丰富的开发人员都可以告诉您,这是绝对必要的。使用未经测试的代码就像打个字:修复一个错误,引入另一个错误。

避免这种情况从项目的开始就开始。添加功能(甚至功能)后,应立即编写测试用例以验证实现。有很多很棒的库,例如内置的unittest或非常流行的pytest。

你应该认真投入时间来测试您的代码。这样做可能需要一些时间,但这是一项长期投资。这样将节省更多的调试时间。

感谢你的阅读!欢迎留言区评论!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值