《Automate the boring stuff》学习心得

经过一个多月的懒懒散散的学习,终于啃完这本600多页的Python实战类教科书。在《Automate the boring stuff》(以下简称Automate)中比较重要的内容是,掌握Python基本语法和数据结构,学习一些内建库,同时了解和应用一部分解决职场问题非常方便的第三方库。
由于早先已经学过了《笨方法学Python》,基本语法语法掌握告一段落,因此开头几章比较顺利。下面我标记出(对我而言)比较重要的几个章节,供参考。
《Automate》使用Python3,如果需要多版本共存,可以查看我早先写的如何安装和配置Pyenv的文章——《Mac上修改Path,及用Pyenv管理多版本Python》
Chapter 5 – Dictionaries and structureing data
Python中Dictionary的用法非常重要,从这里开始,就成为本书中最常使用的数据结构。而用来操作Dictionary的几个函数(如keys/values/get等)则需要多写几行代码来记住用法。
后半章的结构化数据我还没弄非常明白,只是跟着教程完成了Project,有机会要在看一下(写本文的时候,我又看了一遍Dictionary部分,果然忘了好多)。
Chapter 7 – Pattern Matching with Regular Expressions
本章学习正则表达式的用法,为后面批量操作文件和写爬虫打好基础。内容稍微有点不好理解,并且需要记忆的地方很多。由于Python2到Python3中升级了部分语法(例如格式化字符**%**统一变成了format.(),不再需要记忆数据类型),因此需要注意目前使用的python版本。
这一章内容多而繁琐,又比较抽象,可能需要多花点时间。
Chapter 11 – Web Scraping
爬虫是全书的核心重点之一,也是Python最常用的功能之一。requests/BeautifulSoup这两个库是这个章节中最重要的部分,前者用来下载需要的数据,后者用来解析HTML标签。这两个库构成了本书中设计的简单爬虫的发动机。
Chapter 14 – Working with CSV Files and JSON Data
标题内容虽然是CSV和JSON两类数据文件的使用,其实本章节讲的是API的使用(各类服务的API多以JSON等格式来输出数据)。章节不难,但是需要理解数据是怎样通过API来到本地、继而用一些method对数据进行加工和输出。这一章比较有趣,可以举一反三。
Chapter 18 – Controlling the Keyboard and Mouse with GUI Automation
本章对普通读者用处可能不大,但生活中却经常见到和使用。朱老师说他正在做的安卓app的向导部分,即使用了本章内容。完整学完这一章,对于类似程序会有一个新的认识,能够理解软件背后的基本原理。


 
以上五章是这本书的难点和重点,其他章节或者仅涉及Python基础语法,或者仅介绍了一些并不算常用的库(可以现用现学,不用着急背下来)。如果能将这五章内容搞懂,基本上也就理解了全书最紧要的部分。
对我而言,本书最大的收获之一,就是搞明白了一些之前不懂的原理,并且知道了Python到底能做哪些事,为后面的Flask学习打下了基础。

Tagged : / /

一刷

听从朱老师的教诲,开始刷《Automate the boring stuff with Python》,目前已经进行到Chapter 9,全书过半。
很大一个感受就是,看书都能看懂,最后的Practice Project却做起来非常困难,没有头绪。这种状态和我初学《笨方法学Python》时候一模一样,当时落后进度很多,浪费了很多时间。
前几天反省了一下,自己每天花在代码上的时间表面上有五六个小时,其实也就最多2小时在学习。因此变换了一下学习方式,从事无巨细的按顺序完成教程的每一部分,变为第一遍先读完全书、扫过课后练习,完成一刷后在读第二遍——这一边要快速浏览课程内容,重点看课后习题。
目前正在尝试这样的方法,每天集中2小时进行学习,更轻松,而且根据经验,第二遍应该会很快(目前估计应该可以7-10天解决二刷)。总的来说,会节省很多时间。
过慢的学习基础知识,看来是一种很落后的学习方法。学习变成似乎也和背单词一样,重点不在于第一遍学习时记住、吸收了多少,而在于学习的次数。这是我自己的一点经验。

Tagged : /

Mac上修改Path,及用Pyenv管理多版本Python

目前二刷《笨方法》即将结束,但是在Round1时遭遇的问题一直没有解决。问题是这样的:

在ex46中,要求安装若干个第三方库(如nose用来测试)。我按步骤安装之后,执行nosetest(nose的测试命令),反馈command not found。其他几个库问题亦然。

之前研究了很久不明白怎么回事,现在终于搞清楚,并快速修复了这个问题。
其实问题的核心就是Mac上Python的Path与第三方库(及第三方Python)的目录不统一,换句话说,当我在终端执行Python后,进入的是Mac OSX自带的Python的交互模式,而非手动安装的版本。自带的版本往往是比较旧(然而绝对绝对不能删除,手残党也尽量别去尝试更新了)的稳定版。
官方文档清晰的描述了Mac自带Python与用户手动安装Python的异同(https://docs.python.org/2.7/using/mac.html):

  1. Mac自带的Python用以支撑苹果官方及第三方软件(就是给电脑用的,不是专门给你编程用的!虽然也可以编程!),目录位置是 /System/Library/Frameworks/Python.framework 和 /usr/bin/python;
  2. 用户自行安装的第三方Python则当然用于编程,目录位置/Library/Frameworks/Python.framework 。

在官方文档中对于Mac OSX自带Python又着重强调了一句:You should never modify or delete these, as they are Apple-controlled and are used by Apple- or third-party software.
故而,问题很清晰了,只要修改日常代码所用的Python的路径为第三方Python路径即可。
修改Path的命令,我是在stackoverflow上面找到的(http://stackoverflow.com/questions/3696124/changing-python-path-on-mac)。

PATH="/Library/Frameworks/Python.framework/Versions/2.7/bin:${PATH}"
export PATH

注意,上述路径中的2.7数字,根据你自己的安装版本进行调整。如果安装的是3.5,就改成3.5。
ps. 经测试发现,上述命令没有写入配置文件.bash_profile,因此只是临时更改了path,关闭终端(我用的iterm2)后再重启,依然会恢复老path。此时需要修改配置文件.bash_profile。执行以下命令:

open ~/.bash_profile

此时会用Mac自带的文本编辑器打开配置文件,在最后一行添加:

export PATH=/Library/Frameworks/Python.framework/Versions/2.7/bin:$PATH

具体路径参考自己的安装位置,基本应该差不多。然后保存文件并关闭。此时新Path已经被写入配置,关闭终端、重新打开,执行which python,可以查看目前的path。如果改过来了,即成功,否则请检查自己的步骤哪里有错。
注意,以上步骤仅供Mac用户参考,Mac的终端配置文件是.bash_profile,而没有很多中英文教程中提到的.bashrc,请注意。
附录:.bash_profile与.bashrc的区别:http://www.joshstaiger.org/archives/2005/07/bash_profile_vs.html


另外,我个人的下一本学习教程是朱老师推荐的《Automate the boring stuff》,教材中以Python3为标准,因此可能需要一段时间让Python2与3共存和切换,因此也记录一下知乎上推荐的Python版本切换工具,Pyenv(Github地址)。目前我还没有安装,大概这两天会试用。


报告各位,已经完成用Pyenv管理多版本的Python。中间绕过一些弯路,请各位严格按照下列顺序操作,否则可能导致前功尽弃、从头来过。
另外,强烈建议看一遍pyenv的Github说明,因为我下面的步骤仅针对Mac,如果你跟我情况不同,请按官方教程来。

首先,看看你有没有自己安装过Python,如果有,删掉!

在Python的官方文档中,并没有一章专门讲怎样卸载Python,因为放在安装章节了(这里)……懒得看英文的可以看下面。

  1. 删除Applications文件夹下面的Python文件夹。(打开Finder,点击应用程序,将Python27/Build Applet/IDLE都拖进垃圾桶)
  2. 删除/Library/Frameworks/Python.framework下面以Python版本号命名的对应文件夹。(例如你想删Python2.7,就把27这个文件夹删除。在本教程中,除了Current文件夹以外,所有版本都删掉!)
  3. 删掉上文中那句加在~/.bash_profile文件中的那行代码

然后,安装包管理工具Homebrew(已安装的跳至下一步)

  1. 进入Homebrew官网http://brew.sh/index_zh-cn.html
  2. 把首页那行代码复制到终端,然后执行
    ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
  3. 此时已经安装好Homebrew了

用Homebrew安装Pyenv

  1. 直接用brew命令安装
    $ brew update
    $ brew install pyenv
  2. 将以下代码添加到~/.bash_profile文件的第一行(让bash运行后首先加载pyenv自己的path)
    eval "$(pyenv init -)"

用Pyenv安装需要的Python版本

  1. 查看可安装的Python版本列表,其中形如 x.x.x 这样的只有版本号的为Python官方版本,其他的形如 xxxxx-x.x.x 这种既有名称又有版本后的属于“衍生版”或发行版。
    $ pyenv install --list
  2. 截至今天2016/1/15,Python最新版本是3.5.1,以安装这个版本为例
    $ pyenv install 3.5.1
  3. 如果有其他版本需求,用同样的命令安装其他的,例如2.7.11。
  4. 最后更新数据库
    $ pyenv rehash

Pyenv切换Python版本

  1. 查看Pyenv下面已存在的Python版本
    $ pyenv versions
  2. 切换版本
    $ pyenv global 3.5.1
  3. 再执行python,看一看Python版本有没有切换过来?

删除Pyenv

我还没有删除过Pyenv,所以在此只是翻译一下官方文档:

  1. 删除之前添加在~/.bash_profile文件第一行的那行代码
  2. 如果是用git clone命令安装的,请删除pyenv的整个根目录(一般是~/.pyenv)
    rm -rf `pyenv root`
  3. 如果你是按照我上面的步骤用Homebrew安装的,直接用brew来卸载即可
    brew uninstall pyenv

 

Tagged : /

最近读的书、做的事

今天这篇又是流水账。
从上一家公司离职至今,已经一个半月了,生活的主要内容是学、看、玩——学Python,看乱七八糟的书,玩桌游。

Python

完成了《笨方法学Python》课程,但是感觉还是啥都不会,朱老师说笨方法讲基本命令、感觉啥都不会是正常的,建议我再重新做一遍。于是这几天正在二刷,效率比第一遍高很多。
开智的Python课程基本放弃。在经历了巨大的学习挫折、并被开智的工作人员冷嘲热讽技术太差后,我确实没有动力也没有能力完成这些任务,且据我观察,最终完成课程的学员似乎大部分都会编程、只是不会Python而已,而非我这种入学者。

《亚瑟王传奇》读到兰斯洛特骑士发疯后被亚瑟王找回,由于我下载的电子书不全,后面章节缺失。
《政治学通识》包刚升虽然跟我在微博上撕逼撕的厉害,但这书真是本好书,我目前读过的最好的政治学入门书。对政治科学和现实政治感兴趣的朋友,强烈建议读一遍这本书,进入一个比较规范的体系内去管窥一下啥是政治。书没有读完,但是我也收益良多,唯一的遗憾是没能在我读本科的时候看到这本书。看来复旦的政治系还是不错的,浙大差得远。
《旧约·箴言》因为在Python上遇到了不小的阻力,一度灰心丧气,长达半个月时间没碰代码。后来在看一个开智学员写的教程时,看到他页面上的一句话:『你要保守你心, 胜过保守一切 ,因为一生的果效是由心发出。箴言4:23』。突然惭愧起来,不应该因为开智课程的不合理、开智工作人员的无耻态度而损伤自己对于代码的热忱,否则我就成了箴言书中所说的『愚昧人』,甚至是远离了神。于是昨天晚上拿出有将近1年没翻过的圣经精读本,开始精读箴言书。

桌游

除了买了一堆桌游、玩了一堆桌游以外,还在注册一个新论坛,目前等论坛备案中。正式开张后会写一篇文章讲述我对桌游的理解。
另外报名了深圳本地一个龙与地下城的新手团,常识一下跑团这种特殊的桌游(跑团,桌上角色扮演游戏的俗称,了解请点击这里)。


最近对未来也想了很多,似乎每一条我期盼的道路,都需要有代码作为基础。所以我想,写代码也许是神安排给我的工作,也是一种恩赐,认真做好这件事,就是敬虔了。

Tagged : / / / / /

桌游的苦恼:卡坦岛随机骰子

最近有点迷桌游,在家里买了一大堆,又苦于周边朋友并没有对桌游很感兴趣。从买一堆自己觉得『可能好玩』的游戏而最终无人陪玩,到绝望的面对现实、挑了一堆二人桌游每日和郭老师捉对厮杀,对桌游的偏好是这样变化的——最开始觉得『无尽杀戮Zombicide』『僵尸商场Mall of Horror』『冷战热斗Twilight Struggle』『电厂大亨Power Grid』这种比较纯粹的美式剧情、德式策略比较有趣,而后转向了人数少、策略轻的德式放置游戏(当然对『我是大老板I’m the boss』和『抵抗组织Resistance』这类口炮撕逼游戏的爱,从未消失)。『卡卡颂carcassonne』『璀璨宝石Splendor』是郭老师的最爱,我们几乎每晚都要来一两局。
1.pic
今天下午,郭老师的发小张同学,抱着一堆主板、硬盘等来到我家,让我帮她把机器攒好,顺便三个人一起开了两局璀璨宝石,中间穿插了一局欢乐向的『水瓶座Aquarius』,最后以『卡坦岛Catan』收尾。
问题出在卡坦岛上。
不知是由于骰子本身质量不均、还是扔骰子的环境有问题,出来的数字总是高度集中于某几个数、似乎完全违背了骰子数随机分布的原理,并且每次轮到郭老师时,几乎有50%的概率会扔出一个7,于是按规则,强盗出动,郭老师开始抢劫另外两名玩家。
最终在完全不平衡的骰运支持下,郭老师以大比分差距赢得了本轮卡坦岛。严谨的我开始思考一个问题——如果不解决骰子的问题,估计以后都别想好好玩卡坦岛了。仔细想了想,开始动手写一个卡坦岛电子骰子。
考虑到骰子的随机性,和游戏期间的多次掷骰,一定是random模组+循环的结构。

# -*- coding:utf-8 -*-
from random import randint
from sys import exit
def roll():
    a = randint(1, 6)
    b = randint(1, 6)
    write = raw_input("Press enter to roll >>>>>")
    if write == "":
        print "Dice A = ", a
        print "Dice B = ", b
        print "Sum is >>>>>>>>> ", a + b ," <<<<<<<<<"
    elif write == "quit":
        exit(0)
    else:
        print "Press ENTER BUTTON please!"
    roll()
roll()

 
用Python来解决实际生活中的问题,编写这个十几行的小程序给自己带来很大的快乐。下次再玩卡坦岛,就不用骰子了,哼!
最后,再安利一下桌游。大学时候曾经去桌游吧玩过,没觉得有什么特别的,最近泡在百度桌游吧,才知道桌面游戏这个领域也是博大精深、能人辈出。有兴趣的朋友可以去浏览一下两个台湾90后正在众筹的一款以台湾政治生态为主题的桌游『政治风暴』(https://www.flyingv.cc/project/8972),意淫一下大陆版应该怎样设计。

Tagged : / /

Life is short, you need Python!

早在20年前,我在小学期间,就敲过代码。
那是在当时叫做『微机课』的课外兴趣班上,老师让每个人带一个本子,然后板书满满几黑板的代码,学生们在下面抄写到本子上,再手输到电脑中。写过几行代码的同学恐怕都知道,能完整的将几百行代码手敲至文本编辑器里,这是一个需要多么细心和耐心的工作,稍有不慎就会这里句号变逗号、那里括号少半个、或者某个变量的拼写大小写有误……因此从板书到手写、再从手写到键盘,中间的两次媒介转换,让bug的出现概率大大提升。如果我没记错,当时每次上课可能仅有一两名同学能够顺利的在『微机』屏幕上画出一个个炫目的几何图形。
我从来没成功过。并且由于中间多次的誊写,debug几乎也是不可能完成的任务。
但我的程序员之路,就此中断。初中以后,我学会用金山游侠修改游戏(仙剑这种游戏最好玩的就是改999个金蚕蛊),后来会用文本编辑器直接编写游戏目录下的config文件(把红警里的小兵改成超人,一个兵横扫六国)。高中以后迷恋音乐,写一些谱子,做一堆midi曲子。大学以后沉迷bbs,并写自己的独立博客,接触wordpress,走上了折腾css的无尽之路。毕业后又隔三差五的学一点软硬件知识,玩Arduino做图形化编程,学了HTML和PHP的皮毛。
到今天,才算是正经的学一门有用的语言,Python。以前那都算是玩的。
Bruce Eckel 说过一句著名的话:Life is short, you need Python。这也是我选择Python作为人生第一门深入学习的语言的原因。Python是一门拥有大量库的高级语言,库多意味大多数需求的开发都不需要反复制造轮子、用现成的即可,同时简洁易学。朱作君老师最早向我安利了Python,感谢朱老师的推荐,在学习了几周之后发现Python确实非常适合我这种业余选手。
可能我学Python最大的动力,是源于内心的一种『创造欲』。人和动物之间的巨大鸿沟,就是是否能够『创造』。而对现代人来说,需要『制造』的物品已经不多了,世界上的物质之丰富超过大多数人的想象。然后就像木匠永远差一把好椅子,猎人也永远有一只捉不到的野兽,人如果不能亲手制造些东西,似乎是放弃了本性中很重要的一部分——那就是创造。一辈子不创造、依赖于前人的工作生存下去,固然已经被证明了一万次可行,但掌握命运却应该从创造开始。
学习中遇到了很多困难,还要一次又一次的克制住懒惰的心。希望每一点坚持都能变成自己最终的心血。
在这里我与大家分享一下我的学习笔记。最近写的并不勤快,因为很多内容自己无法理解,但是如果有朋友愿意一起学习,可以发邮件给我(邮件地址在博客的『关于』页面中)。
Python学习笔记:https://zjuguxi.gitbooks.io/hard-way-to-python/content/

Tagged : /