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


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

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

图源:unsplash

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

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

未实现(Not Implemented)

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

def implementtest(num):    if num == 5:        raise(NotImplemented)

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

 

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

def implementtest(num):    if num == 5:        raise(NotImplemented)    if num == 10:        raise(NotImplementedError( Thisis the right way! ))

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

 

全局变量

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

图源:unsplash

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

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

 

可变的默认值

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

def add(item, items=[]):    items.append(item)

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

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

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

拷贝!

 

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

d = 5h = d

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

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

图源:unsplash

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

import copyl = [10,15,20]h = 5hcopy = copy.copy(h)z = copy.deepcopy(l)

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

print id(h) == id(hcopy)False

图源:unsplash

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

 


推荐阅读专题

留言点赞发个朋友圈

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

编译组:刘鉴楠、王品一

相关链接:

https://towardsdatascience.com/avoid-these-rookie-python-mistakes-9cc17cccd051

如转载,请后台留言,遵守转载规范

推荐文章阅读

ACL2018论文集50篇解读

EMNLP2017论文集28篇论文解读

2018年AI三大顶会中国学术成果全链接

ACL2017论文集:34篇解读干货全在这里

10篇AAAI2017经典论文回顾

长按识别二维码可添加关注

读芯君爱你

展开阅读全文
©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值