可以但是没必要:不合适的选择会让编程变得更难

全文共1554字,预计学习时长6分钟


你练习了很久,逐渐觉得编程变得得心应手,或许会觉得“这很简单嘛”,千万别大意,请牢记:编程其实很难。


可以但是没必要:不合适的选择会让编程变得更难

图源:unsplash


在自己解决问题的时候,不合适的选择会使编程问题变得更加困难,如果没人指导你甚至都意识不到自己编程的方式是错误的。你或许曾为不能及时完成代码和重构而感到内疚,幸运的是,只要你愿意,纠正这些错误可以让你成为一个更好的程序员。


成为一个伟大程序员的最好方法就是克服错误和问题,问题总会有更优解,需要你不断挑战自我。习惯于做某一件事情是很容易的,但是有时候需要一点改变才能真正成为一个伟大的工程师。


可以但是没必要:不合适的选择会让编程变得更难

未实现(Not Implemented)


虽然“未实现”错误可能是本文中最不常见的错误之一,但我必须给大家提个醒。在Python中触发“未实现”不会引发 “未实现”错误,而会引发类型(Type)错误。下面这个函数能够说明这点:


<code>def implementtest(num):
if num == 5:
raise(NotImplemented)/<code>


我们试图运行这个函数,其中“num”等于5,看看会发生什么:


可以但是没必要:不合适的选择会让编程变得更难

解决这种非正常情况需要触发“未实现错误”,而不是“未实现”本身。为此,我修改了函数:


<code>def implementtest(num):
if num == 5:
raise(NotImplemented)
if num == 10:
raise(NotImplementedError('Thisis the right way!'))/<code>


运行它能够给我们合适的结果:


可以但是没必要:不合适的选择会让编程变得更难

可以但是没必要:不合适的选择会让编程变得更难

全局变量


在对象主导的程序设计语言中,全局变量应该保持在最小值。但同时须注意,解释全局变量是十分必要的,并且在某些情况下是相当正确的。


可以但是没必要:不合适的选择会让编程变得更难

图源:unsplash


数据科学就是一个很好的例子,该领域中数量有限的对象导向编程在进行中,Python的使用更倾向于功能指导,和传统做法有些不同。


当多个函数调用并依赖相同的值时,全局变量可能会导致命名和隐私方面的问题。全局变量能避免这种情况的一个例子是类似于文件路径的东西,特别是与Python文件一起打包的那种。即使是编写Gtk类,或者移动图形用户界面构建器,也应该局部完成,而不是全局完成。


可以但是没必要:不合适的选择会让编程变得更难

可变的默认值


Python中的默认参数只计算一次,在执行函数定义时进行。已知这些参数只计算一次,那么每个入站元素都会在每次调用中使用到,这意味着变量中包含的数据在每次函数访问时都是可变的。


<code>def add(item, items=[]):
items.append(item)/<code>


与之相反,我们应该将参数的值设置为零,并添加一个条件来修改列表,如果这个列表并不存在的话。


<code>def add(item, items=None):
if items is None:
items = []
items.append(item)/<code>


虽然这主要适用于Python用户的统计、数据科学、机器学习用途,但根据具体情况,拥有不可变数据才是王道。


可以但是没必要:不合适的选择会让编程变得更难

拷贝!


客观上,使用拷贝比普通赋值更好。普通的赋值操作只是将新变量指向现有对象,而不是创建新对象。


<code>d = 5
h = d/<code>


可以使用Python的拷贝模块执行两种主要类型的拷贝,即浅拷贝和深拷贝。


它们的差异在于你希望通过函数传递变量的类型。当使用深度拷贝在单个字节数据变量上时,比如整数、浮点数、布尔值或字符串,浅度拷贝和深度拷贝之间的差别就很难察觉。但是,在处理列表、元组和术语时,我建议始终使用深度拷贝。


可以但是没必要:不合适的选择会让编程变得更难

图源:unsplash


浅拷贝构造一个新的复合对象,然后尽可能把原始对象中对象的引用插入其中。深度拷贝也构造一个新的复合对象,然后递归地将原始对象中对象的副本插入其中。根据这些定义,很容易看出为什么要对给定的数据类型进行区分。


<code>import copy
l = [10,15,20]
h = 5
hcopy = copy.copy(h)
z = copy.deepcopy(l)/<code>


为了测试结果,我们可以简单地检查它们的变量id是否与一个条件语句相同:


<code>print id(h) == id(hcopy)
False/<code>


可以但是没必要:不合适的选择会让编程变得更难

图源:unsplash


变得更优秀的过程必定是不断改进的过程,挑战自我走出舒适区或许是痛苦的,但也一定是有益的。编程之路道阻且长,请不要放任自己野蛮生长。


可以但是没必要:不合适的选择会让编程变得更难

我们一起分享AI学习与发展的干货


分享到:


相關文章: