这是EricS.Raymond在他的文章《HowtolearnHacking》中所描述的一段话。作为一个已经从入门走到进阶的编程者,我非常赞同他所说的这句话。
即使这样的编程可以让你明白条件语句和循环的工作机制以及如何编写一个基本的函数,但是却不能让你对编程有一个更深的思考。
除了这些缺陷,这种学习方式还非常无聊!拥有前面所述特点的代码设计首先可以让你的程序变得有趣。编写小型的代码块没有足够的空间让学生去思考并且获得必要的代码直觉。另一方面,在真正的程序设计中,这些技巧又常必要的。
一个好的问题可以提供一个平台,让你在应用你的知识,看到它的效果,总结并改进,然后重新实现你的解决方案。
选择一个你想解决的问题非常重要——这对你来说也许并不简单,但同时也会让你觉得“如果我写一个程序去解决,这会很酷!”。当你尝试编写一个程序去解决你所关系的问题时,你将会有动力去学习和成长。你会总想着如何改进自己的解决方案。
找到一个好问题并尝试去解决它一开始会让你觉得很难,这只是因为你把标准定得太高。你可能看了很多遍《社交网络》,并且想要让自己的解决方案变成下一个谷歌或脸书。但这只会让你定立不切实际的目标,降低你的学习速度,耽搁你的发展。
记住,你的目标不是去写一个价值十亿美元的软件,而是通过编写一个程序为自己提供一个和学习的平台。
你是否感觉到自己在做一些多余且无聊以至于可能让自己变笨的事情?你是否曾希望能拥有一些聪明的宠物或精灵为你做这些事情?你知道它们可以把这些事情做的更快,因为它们不会像自己一样偷懒。
你知道吗,你已经有了这样的宠物——你的电脑。每一个单调枯燥的任务都提供了一个机会让你去编写一个程序,并告诉这个“聪明的宠物”应该怎么做。
在你选择好了问题之后,陈相贵近况你需要制定最佳解决方案,让我们来看看BrianW.Kerninghan在他的书中是怎么描述“好软件”的。
“好软件的产生有这些最基本的原则:简易,好软件的代码是精简和便于管理的;清晰,好的软件可以让用户很快上手;普遍性,好的软件可以在较广的用户场景下使用,并且能够很好地适用新的用户场景;自动化,好的软件可以将我们从单调的工作中解放出来”
遗憾的是,只有少数的《xx编程入门》书籍涉及到了这些原则,更令人遗憾的是很多大学的编程课程完全忽略了编程的这个方面。
如果你仔细看,你可能会发现我在这些网页的最后都添加了个人注释。这是因为,有时候,我很难想起当初收藏网页的具体原因或动机。当然,网页的标题已经能很好地解释网页包含的内容了,但是却不能解释我当初为什么觉得这些内容很有用,这就是为什么我添加这些注释的原因。
有时候网页的原标题真的非常长,就需要“Ctrl+left”,跳到最后再添加个人的注释!好麻烦!
我意识到这个问题可能不是很严重,但是它有时确实会减缓自己收集知识的速度。而且,正如我前面所说,我们不是为了制造一个十亿美元的软件,问题虽小,着手解决它才是最重要的!
我收藏了每一个我害怕失去的好网页,并且根据它们所属的话题进行归入到文件夹,添加注释。因此,它们对我来说非常有价值。每当有人问我一些我所了解的话题,我都会尝试引导话题,以便我可以分享该话题的一些文件夹。
这个文件夹包含了我关于这个话题的知识。通过网页的标题和个人的注释,获得这个文件夹的人就不只是获得一堆超链接,还获得了它的附加价值。我相信这比口头解释和填鸭式更好。只有当人们自己去浏览了这些网页他们才真正学到了东西。那么问题来了,据我所知,Chrome无法提供快速简便的方式将网页和标题一起复制。如果我复制一些网页,粘贴在一些编辑器里面,我只能得到一个超链接。
所以,如果我想要分享链接、标题(包括注释),我就需要切换到编辑模式,全选标题,然后粘贴到别的地方,然后对超链接再做一遍同样的事情。如果我想要分享一大堆怎么办?就需要把前面的流程对每一个网页做一遍!
●我希望Chrome允许我下载文件夹中的所有网页到本地电脑上,并且存放在一个纯文本文件里。在这个文件里,所有的网页会按照下面的格式展示:
直到上个月,我甚至都认为实际上没有可行的方法。我认为唯一的方法可能是使用一个开源的浏览器,修改其中的代码来满足自己的需求。
经过一些初步的研究,我发现我不应该这样做。浏览器是最难和最庞大的软件之一,我目前肯定做不到修改浏览器的代码。
然后,我阅读了一个Quora问题“对于初学者来说有哪些很棒的程序项目”的回答。它描述了一个新手如何制作一个Chrome扩展将所有Facebook新闻推送中的图片替换成了猫的图片。
任何人都可以使用它们创建自己的浏览器扩展程序。Chrome浏览器提供了让开发者得以轻松创建更多抽象代码的基本工具。
一个浏览器扩展程序只用到了普通的HTML/CSS和JavaScript。我觉得哪怕对于初学者,也能轻易创建一个简单的浏览器扩展程序。你所需要的只是一点关于HTML/CSS和JavaScript的知识。
我之前已经了《HeadFirstHTMLwithCSS&XHTML》,但是我完全不懂JavaScript。我想要避开这个方案,因为我原本只是想要做个项目来提升自己已经掌握的编程语言的流畅度(PythonorC++)。
我决定学习JavaScript的基础,比如变量、函数声明和定义、循环和条件语句。这几乎没有花什么时间,因为这些基础在所有的编程语言中都是几乎都是一样的。
我会在创建扩展程序的过程中学习其他的JavaScript特性,所以现在我就可以开始创建我自己的扩展程序了。
可能是因为浏览器扩展一直都不是很火,只有少数教程视频或文章可以指导你去创建一个浏览器扩展程序。
我发现我所需要的东西就在chrome.bookmarksAPI里面。结果我发现这是一个不常用的调用,很少扩展程序会用到它,这意味着网上也没有关于如何使用这个请求的教程。
在这之前,我都是从精心制作的教程和指导手册学习知识,不需要花费太多精力。但这次,我只能通过阅读这个文档来学习。
这种感觉就像,我在面对一个像兵工厂一样庞大的工具包,但是只有一本小型的用户手册可供参考。现在,我需要自己去辨别,哪些工具最有助于实现我的目标。
我的意思是虽然它非常受新人的欢迎,但是它应该还没有好到让所有的编程书/教程都需要从它开始的地步。
我重新设置了浏览器,以便于可以在本地加载扩展程序。我按照文档中的说明创建了一些强制文件。现在,我可以开始使用bookmarksAPI编写真正的扩展程序。
可是等等,如果设置有问题怎么办,如果我错过了文档中的一些关键性问题怎么办?我需要先搞清楚,以免花了很多时间和精力后才发现程序无法运行。
我认为“HelloWorld”程序与其说是你在项目中的第一个程序,不如说是项目能正常运行的。如果能正常运行“HelloWorld”,那么我的项目同样可以正常运行。
我认为网页标题是的一个很好的默认标题。所以,我没有在弹出的窗口中添加“标题:”的输入框。
在撰写本文时,我写的代码没有模块化,也不便于管理,它只是能跑起来而已。我接下来会优化它,这才是我线:不可解决?
据我所知,Chrome不提供任何方式让你可以生成并下载网页的文本文件到本地。这意味着我也不能下载这些网页。
如果对于每个网页,都有简单的文本表示,就像大多数其他网页一样,那将会很棒(比如你正在阅读的这个)。每个用文本表示的应该有如下的格式:
文末知识点摘要:Python编码为什么那么蛋疼?据说,每个做Python开发的都被字符编码的问题搞晕过,最常见的错误就是UnicodeEncodeError、UnicodeDecodeError,你好像知道怎么解决,遗憾的是,错误又出现在其它地方,问题总是重蹈覆辙,str到unicode之间的转换用哪decode还是encode方法还特不好记,老是混淆,问题究竟出在哪里?
计算机存储的一切数据,文本字符、图片、视频、音频、软件都是由一串01的字节序列构成的,一个字节等于8个比特位。
字节方便存储和网络传输,而字符用于显示,方便阅读。字符“p”保存到硬盘就是一串二进制数据01110000,占用一个字节的长度
我们用编辑器打开的文本,看到的一个个字符,最终保存在磁盘的时候都是以二进制字节序列形式存起来的。那么从字符到字节的转换过程就叫做编码(encode),反过来叫做解码(decode),两者是一个可逆的过程。编码是为了存储传输,解码是为了方便显示阅读。
例如字符“p”保存到硬盘是一串二进制01110000,占用一个字节的长度。字符“禅”有可能是以“010000101”占用3个字节的长度存储,为什么说是有可能呢?这个放到后面再说。
这是因为Python2使用ASCII字符编码作为默认编码方式,而ASCII不能处理中文,那么为什么不用UTf-8呢?因为Guido老爹为Python编写第一行代码是在1989年的冬天,1991年2月正式开源发布了第一个版本,而Unicode是1991年10月发布的,也就是说Python这门语言创立的时候UTF-8还没诞生,这是其一。
Python把字符串的类型还搞成两种,unicode和str,以至于把开发者都弄糊涂了,这是其二。python3就彻底把字符串重新了,只保留一种类型,这是后话,以后再说。
Python2把字符串分为unicode和str两种类型。本质上str是一串二进制字节序列,下面的示例代码可以看出str类型的“禅”打印出来是十六进制的\\xec\\xf8,对应的二进制字节序列就是‘0’。
我们要把unicode符号保存到文件或者传输到网络就需要经过编码处理转换成str类型,于是python提供了encode方法,从unicode转换到str,反之亦然。
不少初学者怎么也记不住str与unicode之间的转换用encode还是decode,如果你记住了str本质上其实是一串二进制数据,而unicode是字符(符号),编码(encode)就是把字符(符号)转换为二进制数据的过程,因此unicode到str的转换要用encode方法,反过来就是用decode方法。
因为调用write方法时,Python会先判断字符串是什么类型,如果是str,就直接写入文件,不需要编码,因为str类型的字符串本身就是一串二进制的字节序列了。
如果字符串是unicode类型,那么它会先调用encode方法把unicode字符串转换成二进制形式的str类型,才保存到文件,而encode方使用python默认的ascii码来编码
但是,我们知道ASCII字符集中只包含了128个拉丁字母,不包括中文字符,因此出现了‘ascii’codeccan’tencodecharacters的错误。要正确地使用encode,就必须指定一个包含了中文字符的字符集,比如:UTF-8、GBK。
所以要把unicode字符串正确地写入文件,就应该预先把字符串进行UTF-8或GBK编码转换。
当然,把unicode字符串正确地写入文件不止一种方式,但原理是一样的,这里不再介绍,把字符串写入数据库,传输到网络都是同样的原理
把一个经过UTF-8编码后生成的字节序列‘\\xe7\\xa6\\x85’再用GBK解码转换成unicode字符串时,出现UnicodeDecodeError,因为(对于中文字符)GBK编码只占用两个字节,而UTF-8占用3个字节,用GBK转换时,还多出一个字节,因此它没析。避免UnicodeDecodeError的关键是保持编码和解码时用的编码类型一致。
这也回答了文章开头说的字符“禅”,保存到文件中有可能占3个字节,有可能占2个字节,具体于encode的时候指定的编码格式是什么。
str与unicode字符串执行+操作是,Python会把str类型的字节序列隐式地转换成(解码)成和x一样的unicode类型,但Python是使用默认的ascii编码来转换的,而ASCII中不包含中文,所以报错了。
以上内容都是基于Python2来讲的,关于Python3的字符和编码将会另开一篇文章来写,保持关注。
本篇文章分享就到此结束,部分素材来源网络与自己整理,如有侵权,请联系删除。希望本次的知识点分享对你有所帮助。我自己有建立一个学习Python的小密圈,如果你在学习Python的过程中没有一个学习交流的地方,那么欢迎你私信我,私信关键词:交流,和大家一起交流,共同进步。
本文由来源于325棋牌 325游戏中心唯一官方网站
网友评论 ()条 查看