码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2020-12-22 12:18:10      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:注意   不可   插入   error   应该   传统   机器学习   image   数据类型   

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

技术图片
图源: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 = 5
h = d

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

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

技术图片
图源:unsplash

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

import copy
l = [10,15,20]
h = 5
hcopy = 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经典论文回顾

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

读芯君爱你

技术图片

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

标签:注意   不可   插入   error   应该   传统   机器学习   image   数据类型   

原文地址:https://blog.51cto.com/15057819/2565667

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!