一群朋友问我是什么让我开始写技术的公众号,是什么促使我一直写下去的。在我看来,写作是一件不能敷衍的事情。通过写作学习比简单地学习更好。为了写出一篇“动手”的文章,我不得不反复查找资料,阅读思考,拆解整合,最后写出来的时候,也是知识拼图形成的时候。因此,对我来说,写作是一个咀嚼信息然后提炼知识,最后扩展为技能和认知的过程。虽然这个过程很慢,但是之前那种激进的方式并没有立竿见影的效果。你不妨一一尝试。除此之外,还有一个很重要的原因。文章是公众对话的媒介、展示的窗口和反馈的渠道。通过写作,我有机会与其他学习者进行对话。阅读和学习可能只是个人的事,但在写作平台上发表文章超越了个人行为——你要做好被批评、或求教、或被误解、甚至被忽视的准备(这是最常见的结果).我喜欢写文章,喜欢和其他有相同情况的同学交流,喜欢向更好的大师学习。这是我个人写技术文章的一些经验。关于上面提到的第二个原因,最近感触颇多,想多说几句。为了更有针对性,我们把这篇文章限定在一个话题上,那就是“写技术文章,如何对待别人的批评/意见”。1.主观意见。有些声音其实只是主观意见。我认为可以同意但不同。毕竟,主观世界往往没有正确与错误的明确区别——思考是无辜的。面对主观意见,我觉得还是要有理有据,坚持一点个性,最终才能获得别人的尊重。比如在翻译Python社区的七大治理模型时,有一个提案“PythonGovernanceModelLeadbyTrioofPythonistas”,我译为“ThreeGiantsGovernanceModel”。有同学指出“Trio”应该译为“threesome”或“trio”。翻译成“三巨头”是什么意思?我认为这种留言是一种主观意见,我们应该求同存异。我之所以这样翻译,一方面是为了取代“benevolentdictatorforlife”。三巨头对独裁者意义深远;这种政治画面挥之不去,虽然牵强附会,但却颇为有趣,所以不肯放弃“三巨头”的翻译。主观意见带入了作者个人的知识背景、思想结构、话语习惯等,我觉得首先应该尝试相互沟通交流。如果能和谐相处最好。如果没有,请及时停止。2.客观意见客观意见有几种:笔误(错别字等疏忽)、代码规范、智力错误...笔误没什么好说的,我自己找的有几个地方已经指出了读者。如果有,请更改它。对于代码规范,有时候为了方便举例,确实不符合规范。尽量避免,寻求平衡。热烈欢迎智力错误——不是欢迎错误,而是欢迎其他人指出我不知道的错误。智力错误的发生意味着知识没有被完全掌握。一旦发生,就一定意味着还有改进的余地。我以为我知道了什么,但是如果我被指出错了,那么在我改正之后,我真的知道了一些东西。知道自己不知道并改正它并不可耻,但不知道自己不知道是可怜的。在写《Python是否支持复制字符串呢?》的时候,我早早就根据学到的知识和查到的资料得出了一个很满意的结论。写完最后一篇之前,临时补充了一个未经验证的例子。没想到这是一个致命的反例,推翻了好不容易建立起来的一切。这是一个客观的错误,一旦指出就可以很快得到验证。因为这个错误,我重新整理了相关的知识点,形成了一个新的知识面,写了一篇文章《join()方法的神奇用处与Intern机制的软肋》。还有一个例子,前不久《Python进阶:自定义对象实现切片功能》,我在准备资料的时候,居然用了一个不严谨的例子,还自作聪明地批判了别人实用正确的例子。最后,有读者长篇大论发表不同意见,我才意识到自己的错误!感谢各位读者的评论,我改正了自己的错误,并且在改正的过程中,也加强了对其他知识的理解,真是因祸得福。3、内置函数和内置类这里还有一个客观的错误,隐藏的很深,可能90%的Python用户都不知道。特别感谢@xpresslink同学指出。接下来,就跟大家分享一下。在《为什么range不是迭代器?range到底是什么类型?》这篇文章中,我的注意力其实在标题中的两个问题上,大部分的消息交互都是以此为基础的。但最后,出乎意料的是,一位读者指出了一个客观性错误,这让我获得了额外的收获。这位同学指出我的一些基本概念是错误的:术语“range()函数”是非常明显错误的。range不是内置函数(内置方法)而是类对象。不要使用括号在python中调用它。把东西看成函数,类似的还有很多,比如list、set、tuple、dict等,这些都是类,尤其是enumerate。学python的人以为是函数,不知道是类。添加括号是实例化而不是函数调用。python中类的实例化和函数调用是非常容易让新手摸不着头脑的。相对来说,java中的构造方法前面有一个明确的new关键字就更清晰了。基于这个评论,我去查看了文档。上图中的range()虽然归类为Built-inFunctions,但官方的描述是“函数和类型”,也就是说,在内置函数的范畴下,包括内置函数和内置函数类。range()属于哪一个?看一下它的解释:range其实不是一个函数,而是一个不可变的序列类型……range其实是一个不可变的序列类型,而不是(内置的)函数……按照这里的说法,官方已经辨别出range()不是函数,就像留言的同学说的那样。我的第一反应当然是不能接受。我怎么会认为它是一个内置函数?不是靠学习资料吗?我正在学习的材料有误吗?为什么从来没有人见过这样做?根据小伙伴们的提示,我去查看了Python2的文档,然后发现了一个很有意思的东西:首先,Built-inFunctions的描述和Python3有点不一样。它写的是“函数”,不包括“类型”。;还有一点,在range()和xrange()的具体内容中,官方称它们为function。从这点来看,Python2的官方文档将range()视为内置函数。这种误解是有根源的!到Python3的时候,官方已经改正了错误,但是改的并不彻底。只有这样,“功能和类型”的描述才会同时存在。正式地,range()和xrange()已被标准化为一个。也许在未来的版本中,会专门创建一类Built-inTypes来存储range()和enumerate()等内置类。在此之前,我只能先提醒大家:不要再把range()误认为是内置函数了。那么,如何区分哪些是内置函数呢?我想到了两个方法:(1)看有没有对应的魔术方法。例如,len()是一个内置函数,因为它实际上调用了魔法方法__len__();而最近提到的iter()调用了__iter__(),所以也是内置函数;并且因为没有__range__()魔术方法,所以range()不是内置函数。(2)用type()判断,结果builtin_function_or_method为内置函数。>>>type(len)builtin_function_or_method>>>type(sorted)builtin_function_or_method>>>type(open)builtin_function_or_method>>>type(range)type>>>type(enumerate)type>>>type(str)typelikeopen没有对应sorted的魔术方法,但是判断都是内置函数;而str有相应的魔术方法,但是判断的是类型,也就是说上面两个方法要结合起来。不知道有多少人知道如何提前区分内置函数和内置类,但是我真的没有看到任何分析这个问题的文章,所以这次我真的增长了知识,希望这篇文章可以消除一些读者的误解。4.总结最近写的一些文章,并不是一时兴起。无论是字符串系列、切片系列还是迭代器系列,初衷都是为了对一个话题进行深入、多方位的思考和记录。如果没有一些热心读者的指正,恐怕我也很难知道自己哪里错了。如果没有那么多的赞同和意见,我恐怕会缺乏继续写作的动力。最后感谢几位提意见的小专家(按时间顺序,可能有疏漏):@风琴,@德马西亚之半麦恩,@发档橙,@gaieepo,@郭瑞,@aijam,@xpresslink,@进击的团子,@不改...相关链接(单错双更正):1、Python支持复制字符串吗?2、join()方法的妙用和Intern机制的弱点3、Python进阶:自定义对象实现切片功能4、Python进阶:切片高级特性全面解读!5.为什么range不是迭代器?范围的类型是什么?----------------本文首发于微信公众号【蟒猫】,后台回复“爱学习”,送20+精选e-免费书籍。
