Kindle 4 心得分享

在上篇文章吐槽了中文电子阅读之后我也要说点能够实际解决问题的东西。我想分享一些自己使用 Kindle 的小技巧。这不是一篇全面详尽的 Tutorial。本文以 FAQ 的形式展现,希望其中有能够帮助到你的内容。

Q: 我觉得默认的中文字体不好看,有没有可以更换字体的方法?

A: 有的。请点这里。

Q: 怎样才可以把我正在阅读的网页发送到 Kindle 上去?

A: 有三个应用可以帮你做到这一点:Instapaper,Klip.me 和 Readability。

  • Instapaper 提供了一个书签工具。点击这个书签就会把你正在阅读的网页缓存在服务器上。同时还会过滤掉广告只留正文和正文中的图片,如果一篇文章分为了好多个网页 Instapaper 也会自动将他们连在一起。问题在于,计算机的自动处理不够精确,如果网页处理不正常你也无法手动调整。另外 Instapaper 对英文网页的处理比中文优秀。Instapaper提供了 iOS 客户端,你可以在自己的 iPhone,iPad,iPod Touch 上阅读自己缓存的网页(1 USD/mo)。

  • Klip.me 不仅提供了书签工具,还有 Safari 和 Chrome 插件。所以你可以对网页进行简单的编辑。所以在阅读中文网页的时候 Klip.me 适用性最强。Klip.me 还提供了 iOS 和 Android 客户端。所以如果你有一台 Android 设备那么 Klip.me 可能是你不二的选择。另外,Klip.me 完全免费。

  • Readability 和 Instapaper 类似,也只提供了书签工具。但是 Readability 的 iOS 服务也是免费的。我没有用过 Readability,无法给出更多评论。

Q: 听说可以用 Kindle 订阅杂志,怎么做?

A: 狗耳朵

Q: 我怎么用 Kindle 看自己的 Google Reader?

A: 狗耳朵Klip.me可以帮到你。

适合 Kindle 的电子书好像很少,在哪里可以下载到或者买到好看的电子书?

A: 1. 请用 Google 搜索,记得在关键字里加上 “mobi” 2. 没有。

Q: 那么有办法将现有的文档转换为 mobi 格式吗?

A: 你可以试试看calibar。这款软件内建中文使用起来应该不难。不过要注意的是 PDF 转 mobi 效果并不好。你可以找一些 Epub 格式的文件来转换,基本上是无损转换的。

Q: 去哪里找那些 Epub 文件?

A: 我不清楚。但是 VeryCD 上有很多英文版电子技术书。我看得很愉快。这么做并不好,但是在现在买不到中文书,也无法为英文书付费的情况下也没有更好的办法。

Q: 对于 Kindle 还有什么值得推荐的服务?

A: 也许你可以试试看豆瓣阅读

Q: 除了 Google 就没有其他方法下载到电子书吗?

A: 论坛上有很多网友会在「资源共享」的名义下制作提供盗版电子书。多看论坛、豆瓣 Kindle 小组… 加入这些圈子泡着吧。

Q: 为什么反对盗版的你会分享这么多「资源共享」的技巧?

A: 正版电子书有得卖吗?

吐槽中文电子阅读

昨天,一个同学向我抱怨自己下载的文档在 Kindle 上被执着地渲染为乱码——即使自己已经转换了格式。抛开使用技巧的问题,Kindle、或者说中文电子阅读值得人们吐槽的地方还多得多。

想舒服地读到电子书,会遇到的问题无非是以下几个 [1]:

  1. 阅读内容。记得在知乎上有网友询问:「哪里可以购买到正版的适用于 Kindle3 的中文电子书?」[1]答案只有两个字:「没有。」这是何等的悲凉!举例来说,虽然Kindle 支持 doc,pdf,txt,mobi 等多种格式,但是如果希望获得最好的用户体验还是应该阅读 mobi 格式的文档。可惜网络上几乎没有制作精良、阅读体验良好的 mobi 电子书!
  2. 阅读体验。靠谱的排版、优秀的字体、合适的字号、直观的操作… 这些是阅读的起码要求。也许你受了网上到处可见的盗版小说在线阅读站点「熏陶」。可以忍受每个 5 行出现一次的文字广告,可以忍受浮动在网页上方、始终遮住你想阅读的文字的图片广告,甚至对文字的内容也没什么要求,只要「可以打发时间就好」。但这绝非一个健康的电子阅读市场的应有之道。
  3. 盈利模式。毫无疑问,用户应该对文字付费。阅读应该是沉浸式的,不应该有任何干扰阅读元素存在,尤其是广告。

对于第一点,我已经不再悲观。因为我已经在 iOS 设备上看到了很多制作精良、内容优秀的电子书。在图灵谢老师的新浪微博上,我也得知他们正在制作 Kindle 版中文电子技术书(技术书图片、公式多,技术上有点难度)。

对于第二点,任何真正的制作商都应该有能力保证起码的阅读体验。除了像当当这样的奇葩3,iOS 上的唐茶就是很有品质的电子书制作商。我也看到豆瓣阅读、图灵正在不断优化中文书在 Kindle 上的表现能力。我保守看好未来的中文电子书质量。

第三点是最让人绝望的。同伴对我手机上不装盗版的反映是:

「有钱人,竟然不用盗版。」

没有好的书源可以慢慢争取,阅读体验不够优秀可以不断优化,电子阅读设备的价格也在逐渐下降。但是没有读者为内容买单,所做的一切都会是徒劳的。唐茶李如一说:「打击盗版的最佳办法是把正版做到超过盗版:书的品种要够丰富,购买方式要够简单,读起来要够舒服。」[3]但是你要面对的这一群用户,可以接受遮掉半个屏幕的色情广告;愿意花费半天时间泡论坛在水贴里寻找「网友分享」的文档;也能够阅读 Flash 下渲染得无比狰狞的中易宋体。他们唯一的要求就是免费。没有合理的盈利模式,版权方如何肯给电子授权;制作商如何有动力去制作精美的电子书;作者无法从作品中获得合理的收入,又如何有动力去写一本好书?

也许你会说,离产业灭绝的日子还早着呢。不,一点也不远。对比 iOS 设备上数量众多、制作精良的 App,你的 Android 手机上又有什么有趣的应用?大陆图书市场已经没多少书可看了,也许不久以后,当你想学习一门新技术,在市场上却找不到靠谱的技术书。你又该向谁哭诉?


[1]http://blog.tangcha.tc/page/3/
[2]http://www.zhihu.com/question/19857217
[3]http://blog.tangcha.tc/

Kindle 4 使用小结

屈指算来,Kindle 4 到货也有 天了。刚收到 Kindle 时我的映像非常深刻:这玩意的轻薄超乎想象!拿在手里,你总是担心这东西会不会被自己不小心折断了,寸版的 Kindle 4 比小号的 32 开书还要略小。所以你很可能会想:这么小的屏幕,用来看书是不是不合适?

相反,其实完全合适。

刚开机,我就往 Kindle 投递了当日的 Google Reader。几篇文章读来,非常舒服。文字的显示效果和纸质书籍类似,但是比纸书要轻的多,而且不会遇到阅读纸书时候想翻页但是书本不听话的苦恼。更开心的是,如果你看到不认识的英文,只要动用导航键将光标指向那个单词就可以打开字典查阅。Kindle 还会记住你的阅读进度,使你不必费心记忆进度或者准备各种书签。看到案头常读的技术书,我忍不住想如果能把这些差不多重达 2Kg 的纸张存入仅仅 170g 的 Kindle 中,我几天后返校的旅途将会轻松得多。

也许你会问,9.7” 的 Kindle DX 是否值得购买。如果经常阅读技术文档,那么 Kindle DX 还是有价值的。因为你会发现在阅读 PDF 时需要不停地放大缩小文档,E-Link 屏幕的残影和 Kindle 一点也不快的响应时间,还有极度不便的五维方向键无不让人抓狂。寸 Kindle 看文字 PDF 完全取决于 PDF 页面大小和文字大小。如果页面过大、文字过小,比如 A4 纸张、12pt 字号,文字也会让你看得想死。Kindle 会自动裁白边,但很多 PDF 页面边缘有章节号、页码等也裁不了。一旦一个屏幕不能完整显示一页 PDF,页面内上下滚动绝对会让你想杀人。[1]

所以,最好的方法还是看 Mobi 格式的文档。你可以把想看文档发往在注册 Kindle 时 Amazon 提供的 username@free.kindle.com 或者 user@kindle.com 邮箱并且在主题中输入”convert”,这样 Amazon 会将这些文档转化为 Mobi 格式后自动递送到你的 Kindle 上。这两个邮箱之间的区别是后者适合 3G 版 Kindle,可以通过 3G 递送文档。当然,3G 投递是要收费的。

为了让你的 Kindle 更加好用,你不妨试试看网上各色的投递服务。Instapaper 无疑是其中的佼佼者,Instapaper 可以把你要看的网页转化为 Mobi 文件,汇总打包后统一递送到你的 Kindle 上。你便可以像看书一样细读网页了。同样狗耳朵也是一个不可错过的服务。这个站点可以每天将你订阅的 Google Reader 打包递送到你的 Kindle 上。同时,它还提供了很多其他的报刊、站点订阅服务,每天醒来看到新鲜的资讯已经准备好供自己阅读,岂不快哉?

至于 Kindle 的上网功能,纯属鸡肋。网友的意见是正确的,你完全没有必要为了上网买 3G 版。

最后,谈一下多看系统,也就是越狱。多看系统的好处是显而易见的:中文介面、对中文文档的良好支持、更快的响应速度、以及内置下载盗版书的功能… 不过,我以为除非你属于完全无法适应英文系统的人,其实没有必要安装多看。因为 Kindle 4 对中文的支持已经够好(至少我还没有遇到问题),而且 Amazon 的系统足够简单,任何一个受过简单英语教育的人都可以很快掌握。而且当你放弃 Amazon 系统,也就放弃了 Amazon 的个人文档递送服务。不仅仅无法让 Amazon 替你转换文档的格式,而且 Instapaper 这种依托于个人文档递送服务的杀手级应用也无法享受了。

好了,如果你也决定购买 Kindle,祝你读的开心。

————

[1]:Rio,http://goo.gl/makJ0

为 S3C6410 移植 Python

Python 是我很喜欢的一门语言,很希望能够在 arm-linux- 环境下使用Python。经过一番努力[1],终于成功在我的 OK6410 开发板上移植了 Python 解释器。通过选择合适的交叉编译器,本文介绍的方法理论上也可以用于 PowerPC 或者其他 ARM 芯片。

首先,你应该下载 Pythonhttp://www.python.org

(我下载的是 Python 2.7

然后解压:

tar zxvf Python-2.7.2.tgz

接着进入解压产生的 Python 目录:

cd Python-2.7.2

在移植 Python 之前我们需要先移植 Python-Pgen

./configure

make python Parser/pgen

mv python hostpython

mv Parser/pgen Parser/hostpgen

make distclean

接下来请下载已经制作好的移植补丁:

Python-2.7.2-xcompile.patch

下载后打上补丁:

patch -p1 < Python-2.7.2-xcompile.patch

下面的3条命令会在你的主目录下生成 Python2.7 目录(就是移植成果啦),你需要根据自己的实际情况决定使用的交叉编译器(修改 arm-linux 字段):

CC=arm-linux-gcc CXX=arm-linux-g++ AR=arm-linux-ar RANLIB=arm-linux-ranlib ./configure --host=arm-linux --build=x86_64-linux-gnu --prefix=/python
make HOSTPYTHON=./hostpython HOSTPGEN=./Parser/hostpgen BLDSHARED="arm-linux-gcc -shared" CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yes HOSTARCH=arm-linux BUILDARCH=x86_64-linux-gnu
make install HOSTPYTHON=./hostpython BLDSHARED="arm-linux-gcc -shared" CROSS_COMPILE=arm-linux- CROSS_COMPILE_TARGET=yes prefix=~/Python-2.7.2/_install

现在你已经可以在 ~/Python2.7/_install 看见移植好的二进制文件和库文件了。

你可以把 _install 目录拷贝到开发板上确认是否移植成功,祝你好运!

[1]:参考Cross Compiling Python for Embedded Linux

Python 字符串

本文是谷歌发布在Google Code上的Python基础教程,这是我翻译的中文版。如果你对翻译有什么意见或者建议,请在下面留下评论,我一定会仔细阅读。如果你希望能够很快看到下一篇翻译,也请留下你的评论Push我,有了来自读者的压力我才更有动力嘛!本文基于Creative Commons Attribution 2.5许可证发布,以编辑、转载等任何形式使用本文内容都请保留署名,谢谢。

Google Code University › Programming Languages

Python内建了一个名为「str」、提供多种方便功能的字符串类(还有一个你不该使用的名为「string」的旧模块)。虽然单引号用的更多一点,但其实把字符串放在双引号内也是可以的。而反斜杠在字符串中则起到转义字符的作用。一个双引号字符串内部可以包含单引号(比如:「“I didn’t do it”"」),当然反过来在单引号内包含双引号也是可以的。如果你希望一个字符串跨越多行,那么必须在每一行的末尾加上一个反斜杠。不过如果你用的是三引号(‘”"”或者”’)就没必要这么麻烦了。

Python字符串在被创建之后就无法改变(这和Java一样)。因此,我们在需要操作现有字符串的时候往往会创建一个新的字符串。比如表达式「‘hello’+'there’」就利用‘hello’‘there’两个字符串创建了一个新的名为‘hellothere’的字符串。

如果JavaC++Python字符串中的字符同样支持索引操作。Python的索引从0开始,所以如果你定义了一个值为‘hello’,名为str的字符串,str[1]应该是‘e’。如果索引超过了字符串的界限,Python就会引发一个错误。Python在无法运行时会自动停止(这和Perl不同)。使用Python切片可以从字符串中提取任何字串。而了len(string)则可以返回一个字符串的长度。[]语法和len()函数支持列表、字符串等任何序列类型。Python力图在不同类型中保持相同的语法风格。Python新手注意了:不要把len作为变量名,这会阻塞len()函数!而「+」运算符可以连接两个字符串。

s = 'hi'
print s[1]          ## i
print len(s)        ## 2
print s + ' there'  ## hi there

与Java不同,「+」运算符不会自动将整型等其他类型转换为字符串类型。为了连接不同类型的变量,str()函数可以将这些变量转换为字符串类型。

pi = 3.14
##text = 'The value of pi is ' + pi      ## NO, does not work
text = 'The value of pi is '  + str(pi)  ## yes

这段代码中出现的数字、基础运算符你应该已经很熟悉了。我们没用++运算符而是采用了+=-=。如果你要使用整数除法,最正确的方法莫过于使用两斜杠比如6//5

pirnt操作符可以打印一个或多个字符并且自动换行(你可以在句末留下一个逗号抑制换行)。

raw = r'this\t\n and that'
print raw     ## this\t\n and that

multi = """It was the best of times.
It was the worst of times."""


字符串方法

接下类我们将学习一些常见的字符串方法。其实方法和函数很相似,但是方法运行在对象之上。如果变量s是一个字符串,那么代码s.lower()实现的效果就是在字符串对象之上运行lower()方法并且返回结果。(这种在对象之上运行方法的想法是面向对象编程(OOP)的基本思想)以下是一些最常见的字符串方法:

· s.lower(), s.upper() -- 将字符串转换为小写或者大写形式

· s.strip() -- 删除开头和结尾的空白符

· s.isalpha()/s.isdigit()/s.isspace()... -- 检查所有字符是否都为字符/数字/空白

· s.startswith('other'), s.endswith('other') -- 检查一个字符串是否以「other」开头/结尾

· s.find('other') -- 找到指定子字符串首次出现的位置,否则返回-1

· s.replace('old', 'new') -- 替换一个字字符串

· s.split('delim') -- 使用指定的分隔符对一个字符串进行划分。分隔符只是文字而不是正则表达式。

· s.join(list) -- 与split()相反,使用分隔符连接字符串。

用Google搜索「python str」,你会发现官方的python.org string methods中有列出了所有str方法。

Python并没有单独的字符类型。作为代替一个类似于s[8]的表达式会返回一个包含该字符、长度为1的字符串。而那些==<=等运算符也同样有效。所以其实你并不需要知道Python没有单独的字符类型。

字符串切片

如果要对字符串、列表这样的序列进行操作,切片语法也挺好用的。切片操作符中的第一个数(冒号之前)表示切片开始的位置,第二个数(冒号之后)表示切片到哪里结束.假设我们有一个字符串:s="Hello"

· s[1:4] 结果为 'ell' -- 从编号1开始到4结束(不包含4

· s[1:] 结果为 'ello' -- 从编号1开始,默认结尾结束

· s[:] 结果为 'Hello' -- 返回整个字符串的副本(像这样复制一个字符串或者列表符合Python风格

· s[1:100] 结果为 'ello' -- 超出字符串长度的编号会被忽略

· s[-1] 结果为 'o' -- 返回最后一个字符

· s[-4] 结果为 'e' -- 返回倒数第四个字符

· s[:-3] 结果为 'He' -- 倒数第三个起,却没有包含倒数第三个字符本身

· s[-3:] 结果为 'llo' -- 从倒数第三个字符开始,一直到结尾

很明显,切片语法甚至支持负数或者可以出界。就像我们稍后就将看到的一样,切片语法对于列表也同样有效。

print与格式化输出

Python同时支持格式化输出。在使用print语句是,字符串内部可以包含%运算符起到格式化输出的效果(%d int,%s string,%f/%g floatring point),当然同时你也应该在右侧输入相对应的变量。

# % operator</span>
<pre>text = "%d little pigs come out or I'll %s and %s and %s" % (3, 'huff', 'puff', 'blow down')

上面的语句很长,如果你希望将它拆分为单独的几行。你不能像其他语言一样仅仅拆分%后面的内容,因为在默认情况下,Python把每一行当作是单独的语句(这样解释了为什么我们不需要在每一行的后面加一个分号)。为了解决这个问题,你也可以用括号括住整个表达式,这样就可以跨越多行了。请看下面的代码:

 # add parens to make the long-line work:
text = ("%d little pigs come out or I'll %s and %s and %s" %
(3, 'huff', 'puff', 'blow down'))

Unicode字符串

常规的Python字符串仅仅是普通的并不支持unicode。如果你希望你的字符串符合unicode标准,请在字符串字面值前用「u」声明:

> ustring = u'A unicode \u018e string \xf1'</span>
<pre>> ustring
u'A unicode \u018e string \xf1'

一个unicode字符串与普通的字符串对象是不同的,但是unicode字符串能够兼容普通字符串(它们共享公告超类「basestring」)和各种库。

如果你希望将一个unicode字符串转换为一个比如用「uft-8」的普通字符串,你可以对字符串使用encode('utf-8')方法。另一方面,unicode(s,encoding)函数也可以将普通字符串转换为unicode字符串。

## (unistring from above contains a unicode string)
> s = unistring.encode('utf-8')
> s
'A unicode \xc6\x8e string \xc3\xb1'  ## bytes of utf-8 encoding
> t = unicode(s, 'utf-8')             ## Convert bytes back to a unicode string
> t == unistring                      ## It's the same as the original, yay!

True

Python内建的print并不完全支持unicode字符串。所以在打印utf-8或者其他类型的字符串之前,你最好使用encode()。在文件读取小节中,我们会有一个展示如何打开一个文件并且读取之后输出为unicode字符串的例子。注意,Python3.xpython2.x处理unicode字符串的方法不同,本文提供的方法可能不适用于Python3.x

if语句

Python不使用{}将if语句、循环、函数括起来。而是使用「:」和缩进、空白符组织语句。

任何中都可以被if测试。所有的零值都被认为是假的:None、0、空字符串、空列表、空字典。此外还有存在一种两类值的布尔变量:Ture和Flase(若转换为int为1、0).Python中常见的比较操作有:==、!=、<、<=、>、>=.布尔操作符则是:*and*、*or*、*not*(Python不使用C风格的&&、||!)。注意下面每一个代码块都是以「:」开头,并且用缩进组织语句。

 if speed >= 80:</span>
<pre>print 'License and registration please'
if mood == 'terrible' or speed >= 100:
print 'You have the right to remain silent.'
elif mood == 'bad' or speed >= 90:
print "I'm going to have to write you a ticket."
write_ticket()
else:
print "Let's try to keep it under 80 ok?"

可能在写完代码时键入「:」的语法与常见的C++/Java相比太让人觉得多余,意外省略「:」是我见得最多的语法错误。另外,不要在括号内进行布尔测试,这个C++/Java的风格。如果代码很短,你也可以就像这样在「:」同一行继续写代码(当然也适用于函数、循环等)。当然有人觉得一行代码在单独的一行更有可读性又是另一件事情了。

 if speed >= 80: print 'You are so busted'
else: print 'Have a nice day'

练习:string1.py

想练习本文所讲解的内容了?那么试试看基础练习中的string1.py。

Python简介

Google Code University › Programming Languages

Python是一种动态的解释型语言。所以你无需在源代码中声明变量或者函数或者函数参数的类型。你不仅不用在编译时检查你代码中的数据类型,而且可以使代码尽可能的短小精悍。(注释:参考与本小节对应的视频讲座)

了解一段Python代码运行效果的最好方法莫过于把这段代码放到Python解释器中运行。如果你有一个类似于「如果我把一个int变量加入一个列表会如何呢?」的问题,最快的方法就是直接去Python解释器中输入查看效果。Python仅仅分配变量而不用声明它们的类型。如果代码试图读取一个尚未赋值的变量,那么Python会返回一个运行时错误。与C++Java相同的是,Python区分大小写,「a」和「A」是两个不同的变量。而与C++Java不同的是,虽然你在Python代码结束的每一行跟上一个分号,但这不是最好的代码风格。注释则以「#」开始,并延伸到一行的结束。(请参考「安装Python」一节了解如何在安装和配置Python

$ python  ## 运行Python<span style="font-family: 宋体;">解释器</span>

Python 2.4.4 (#1, Oct 18 2006, 10:34:39)

[GCC 4.0.1 (Apple Computer, Inc. build 5341)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> a = 6       ## 在解释器中设置一个变量
>>> a           ## 键入一个表达式并利用Python<span style="font-family: 宋体;">输出它的值</span>
6
>>> a + 2
8
>>> a = 'hi'    ## 变量a<span style="font-family: 宋体;">同样可以与一个字符串绑定</span>
>>> a
'hi'
>>> len(a)      ##调用字符串函数len()
2
>>> foo(a)      ## 这次我故意输错了
Traceback (most recent call last):
File "", line 1, in ?
NameError: name 'foo' is not defined
>>> ctrl-d             ## 按下 ctrl-d 退出 (Windows<span style="font-family: 宋体;">下请按</span>ctrl-z)

程序

Python源代码文件以「.py」后缀结尾。如果你已经有了一个「hello.py」文件,运行一个Python程序最简单的方法莫过于使用Shell命令「python hello.py Alice」——这会使用参数「Alice」读取和运行「hello.py」中的代码。

以下是一个非常简单的hello.py程序

#!/usr/bin/python

# 在此添加模块 -- sys 模块是一个非常基础的模块
import sys

# Gather our code in a main() function
def main():
print 'Hello there', sys.argv[1]
# 命令行下输入的参数保存在 sys.argv[]<span style="font-family: 宋体;">列表中</span>
# sys.argv[0] 是一个脚本名称,可以忽略

# 调用卖弄函数以开始的标准模版
if __name__ == '__main__':
main()

在命令行下运行程序:

$ python hello.py Guido

Hello there Guido

$ ./hello.py Alice    # 无需键入python (Unix)

Hello there Alice

模块

一个Python文件,或者说一个模块,其包含的这些语句在你第一次调用这个模块的地方从上倒下运行,比如设置变量和函数。一个Python模块即可以像上面的「python hello.py Bob」一样直接运行,而可以被另一个模块调用。当直接运行一个Python文件的时候,这个特别的变量「_name_」就等「_main_」。因此,当一个文件直接运行的时候我们常用「if __name__ ==…」调用main()函数。在一个标准的Python程序中,列表sys.argv中的sys.argv[0] 包含了命令行参数(也就是程序本身),而sys.argv[1]则是这个列表的第一个真正参数。

函数

Python中定义函数的方法如下:

# 定义一个名为 "repeat",有两个参数的函数</pre>
def repeat(s, exclaim):
"""返回三倍于字符串s<span style="font-family: 宋体;">的值</span>
如果exclaim 为真, 则在句末加入感叹号.
"""
result = s + s + s
if exclaim:
result = result + '!!!'
return result

# 注意采用相同的缩进构成# if<span style="font-family: 宋体;">语句和函数

「def」不仅定义了一个带参数的函数还规定了如何缩进代码。函数的第一行描述了这个函数,而且,这是一个文档字符串。文档字符串可以只占用一行,也可以像上面的例子一样占用多行。如果你在在一个函数内部定义了一个变量,那么这将是一个局部变量。因此上方函数中变量「result」和其他函数的变量「result」是不同的(如果有的话)。为了给主调函数返回值,「return」通常会带一个参数。

下面的代码调用了「repeat()」函数,并且打印了返回值:

def main():
print repeat('Yay', False)      ## Yay
print repeat('Woo Hoo', True)   ## Woo Hoo!!!

在运行时,你必须确保在调用一个函数前已经使用了「def」定义了它。最典型的方法莫过于在文件的底部定义「main()」函数,而将它所调用的函数放在前面。

缩进

缩进通过使用空白符缩进在影响代码的含义是Python比较特别的一个特征。如同一个函数,由数条语句组成的逻辑块必须使用相同的缩进。如果一个逻辑块中有一行缩进不一致就会被标记为语法错误。

虽然Python使用空白符强制缩进让人一开始会感觉有点奇怪,但其实很符合逻辑,你会很快熟悉的。记得把你的编辑器设置为使用空格代替制表符,因为制表符会使Python文件中的缩进策略变得非常复杂。

运行时代码检查

Python在编译时仅作很小的检查,几乎所有类型、名称的检查都会推迟到运行时。假设上方的「main()」函数这样调用「repeat()」:

def main():
if name == 'Guido':
print repeeeet(name) + '!!!'
else:
print repeat(name)

If语句中有一个明显的错误:「repeat()」函数被错打成了「repeeeet()」。有趣的是Python已经编译了并且开始运行程序直到运行时才发现这个函数并不存在。只有当这个时候才会产生一个错误。这就意味着当你首次运行一个Python程序的时候你遇到的第一个错误很可能和例中一样只是一个简单的拼写错误。这也是一个静态强类型语言(比如Java)的优势,它们可以在编译时找出这样的小错误。(当然你也得自己去处理这些复杂的类型信息..

变量名称

既然Python的变量并没有任何类型,那你就可以给变量取一些更有意义、更容易理解的名字了。比如把一个变量命名为「name」,把一个列表命名为「names」,而「tuples」则是一个元组的列表。经常有人忘记了变量的用途导致了一些简单的错误。所以请给你的变量合适的名字以确保代码正确。

模块和调用

就像一个「binky.py」文件同时是一个「binky」模块,所有的Python代码文件都是一个模块。所以一个模块都会包含一些定义了的变量、函数就像,「x=6」或者「def foo()」之类。假设一个名为「binky.py」的文件包含了一个名为foo()的函数。那么foo()函数的全名则是「binky.foo」。因此,不同的Python模块可以有相同的函数或者变量名儿不会冲突——modoule1.foomodule2.foo是不同的。就像标准的「sys」模块包含了一些类似于argv列表和「exit()」函数的Python基础元素,你可以使用import语句(比如「import sys」)来访问另一个函数中定义的元素。不过注意使用了import语句之后你仍需使用元素的全名,比如「sys.exit()」。

import sys

# 你现在可以用sys.xxx()<span style="font-family: 宋体;">了</span>
sys.exit(0)
此外「from hashing import sha1, md5」也是另一种import形式。这样你就可以用短名调用sha1()md5()了。以下是经常被包含的python模块:
· sys – 调用 exit(), argv, stdin, stdout … 的接口

· re – 正则表达式

· os – 操作系统接口,文件系统

在线求助和help命令

如果你在学习Python想得到帮助,这里有三个不错的方法:

· 使用「python」、「python列表」、「python字符串」这样的关键字来谷歌,正确答案往往是第一个链接。这个小技巧对Python很管用。

· 查看官方Python文档网站——docs.python.org——那里有非常高质量的文档。不过你用谷歌来搜索往往能更快找到答案。

· 使用下面介绍的help()函数

Python解释器内建了可以查看变量、模块、函数的文档字符串的help()函数,就像Java一样。这也是一个快速查看文档的方法。以下是调用解释器内建的help()函数的方法:

· help(len) – 查看len函数的内建文档(注意你应该输入「len」而不是「len()」,输入「len()」就会调用函数啦)

· help(sys) – 查看sys模块文档(你得先「import sys」)

· dir(sys) – dir()有点类似于help()但是只给出一个定义的元素的列表

· help(sys.exit) – 查看sys模块中exit()的文档

· help(list) – 查看模块中列表的文档

· help(list.append) – 查看模块中列表append()函数的文档

安装Python

本文是谷歌发布在Google Code上的Python基础教程,这是我翻译的中文版。如果你对翻译有什么意见或者建议,请在下面留下评论,我一定会仔细阅读。如果你希望能够很快看到下一篇翻译,也请留下你的评论Push我,有了来自读者的压力我才更有动力嘛!本文基于Creative Commons Attribution 2.5许可证发布,以编辑、转载等任何形式使用本文内容都请保留署名,谢谢。

Google Code University › Programming Languages

本文介绍了如何在电脑上安装Python以便于你去编写、运行自己编写的和所下载的练习代码。你可以试着在开始学习之前摆弄一下这些小程序,也可以跳过本文直接去学习Python,当你觉得是该写点程序的时候再来看。本课程使用简单、标准的Python安装方法(当然还有更复杂的方式)。你可以在python.org下载到自由、开源的Python。我们特别希望你在安装Python的时候能做两件事:

· 运行一个现成的Python程序,比如hello.py

· 以交互的方式运行Python解释器,使者在里面输入一些代码

在视频讲座中,我们不止一次地做了这两点。这很重要,可以更好的帮助你完成接下来的练习。

下载谷歌Python练习文件

首先,请下载google-python-exercises.zip并且解压缩这个文件。在生成的目录中有很多供你练习的Python代码。值得注意的是,google-python-exercises目录下还有一个hello.py文件,在下一步中,你将利用这个文件检查安装在你电脑上的Python是否正常。下面给出了PythonWindows或者其他操作系统中的安装方法。

LinuxMac OS X以及其他系统上配置Python

除了Windows之外的大多数操作系统都默认安装了Python。你可以通过命令行(比如打开终端),进入google-python-exercises目录运行hello.py文件(可以照着下面的内容输入)来检查Python是否已经被安装。

~/google-python-exercises$ python hello.py

Hello World

~/google-python-exercises$ python hello.py Alice

Hello Alice

如果Python并没有被安装,请参考Python.org download页面。你可以在终端中输入「python」直接运行Python解释器:

~/google-python-exercises$ python

Python 2.5.2 (r252:60911, Feb 22 2008, 07:57:53)

[GCC 4.0.1 (Apple Computer, Inc. build 5363)] on darwin

Type "help", "copyright", "credits" or "license" for more information.

>>> 1 + 1

2

>>>在此输入 .. 或按下 ctrl-d to 退出

在本课程中,你需要使用版本号大于等于2.4,同时低于3.0Python

可执行属性(可选)

运行一个Python程序最简单的方式莫过于将.py文件设置为「可执行」,这样你就可以直接输入文件名来运行程序而不要先输入什么「Python」了。设置可执行属性需要用到「chmod」命令:

~/google-python-exercises$ chmod +x hello.py

~/google-python-exercises$ ./hello.py   ## now can run it as ./hello.py

Hello World

Windows上配置Python

在Windows下安装Python也是很简单的:

· 打开python.org download下载一个版本号大于等于2.4,低于3.0Python安装程序,比如2.6

· 运行Python安装程序(请全部采用默认值)。这样Python会被安装到根目录下,并且完成文件关联的设置。

· Python安装完成之后,打开命令提示符(在运行对话框中输入「cmd」)。你应该可以通过输入「python+「空格」+hello.py」来运行Python程序了(输入下方粗体显示的内容):

C:\google-python-exercises> python hello.py

Hello World

C:\google-python-exercises> python hello.py Alice

Hello Alice

如果运行成功,那么恭喜你Python已经安装完成了。否则请查看Python Windows FAQ以获得更多帮助。

如果希望以交互方式运行Python解释器,请在开始菜单中选择运行命令(或者Win+R唤出运行对话框),键入「python」——这样Python解释器就会拥有一个自己的窗口并以交互方式运行了!

编辑Python程序(全操作系统适用)

一个Python程序只是一个你可以直接编辑的文件而已。和上面的例子中一样,你应该打开一个命令行一边输入「python hello.py Allice」或者任何其它你在研究的练习。你可以在命令提示符中按向上箭头恢复以前输入的命令而无需重新输入,这真的非常便利。

如果你需要一个对代码和缩进有轻量支持的文本编辑器,这里有很多好用又免费的:

· Windows – 不要使用Notepad或者Wordpad。试试看免费又开源的Notepad++或者JEdit

· Mac – 内置的TextEdit也可以用,但不是非常好用。试试看免费的TextWrangler或者免费又开源的JEdit

· Linux – 任何Unix文本编辑器都很好,不过你也可以试试上面提到的JEdit

编辑器设置

为了编辑Python,我们建议你将你的编辑器设置为按下一个Tab键的时候插入空格而不是真正的制表符。我们所有的文件都会缩进两个空格,不过4个空格还是一个比较常见的选择。如果编辑器支持自动缩进就更方便了:当你回车的时候新行将会自动缩进与上一行保持一致。我们还建议你保存文件的标准应该和初始文件的设置一样,使用Unix行结束标准。如果当你运行hello.py的时候返回了一个名为「Unknown option」,那么这个文件的行结束符很可能错了。以下是几个常见的编辑器中设置正确的Tab键效果和行结束符的方法:

· Windows Notepad++ – Tabs: Settings > Preferences > Edit Components > Tab settings, and Settings > Preferences > MISC for auto-indent. Line endings: Format > Convert, set to Unix.

· JEdit (所有系统) – Line endings: Little ’U' ’W' ’M' on status bar, set it to ’U' (i.e. Unix line-endings)

· Windows Notepad or Wordpad – 不要用这两个软件

· Mac TextWrangler – Tabs: Preference button at the top of the window, check Auto Expand Tabs. Can set the default in Defaults > Auto-Expand Tabs and Auto-indent. Line endings: little control at the bottom of each window, set it to Unix

· Mac TextEdit – do not use

· Unix pico – Tabs: Esc-q toggles tab mode, Esc-i to turns on auto-indent mode

· Unix emacs – Tabs: manually set tabs-inserts-spaces mode: M-x set-variable(return) indent-tabs-mode(return) nil

编辑与检查

编辑hello.py程序来测试你的编辑器吧。将代码中单词「hello」改为「howdy」(你不需要知道其他代码的意思,我们会在课程中讲解的)。保存你编辑的程序并运行它吧,你瞧,输出变了!保持相同的缩进,试着在现有的print语句下一行再加一个「print ’yay!’」吧。试试看运行这个程序,看看你的编辑是否正确吧。这节课中,我们熟悉了编辑/运行的工作流程,现在你已经可以轻松地在编辑和运行之间切换了。

Python的快速风格

Python的便利之处在于你可以写一段不长的代码,很快就可以看到它运行的效果。在课上,只要我们做好正确的设置:一个可以编辑现成的file.py文件的文本编辑器和一个独立的命令行窗口就可以让你按下向上箭头运行file.py文件来查看程序的效果。(抛开什么教学理念,就像讲座里演示的那样,我们用解释器运行了一些很不错的小实验。但是这些练习是已经被组织好、供你编辑的。而你的最终目标应该是写出像样的Python程序,所以我觉得你最好能够在今后的学习中坚持下来,不停地利用解释器做一些小实验)

谷歌Python课程导读

这是Google’s Python Class的导读,简单介绍了学习本课程所需具备的基础、本课程所涉及的内容。这份课程基于Creative Commons Attribution 2.5 许可证发布,转载时请保持署名。最后再次感谢Nick Parlante 和谷歌,感谢他们使我们能够阅读这优秀的文档。

欢迎来到谷歌Python课程——这是一个为有一定编程经验、愿意学习Python的你准备的免费课程。这个课程包含了文字教程、视频讲座以及帮助你编写Python程序的练习。在谷歌内部我们也使用本课程给有一定编程经验的员工介绍Python。第一个练习中,我们将学习像字符串、列表等Python的基本概念,这样我们就有了稍后学习包含文本文件、进程和HTTP链接的进阶知识的基础。这个课程并不要求你有什么专家级的编程经验,只要你有一点点基础、知道什么是「变量」或者「if」语句之类的就好。

现在就想开始学习?那就先阅读「安装Python」让Python在你的机器上工作起来,接下来你可以看看「Python简介」。之后你就可以阅读「Python字符串」,开始自己的第一次练习啦!对啦!我们还准备了包含Python基础、字符串、第一次联系等内容,并且与文字教程同步的视频讲座。在谷歌,我们把这些所有的材料组织成了为期两天的课程安排,所以呢,这些视频也同样分为第一天和第二天!

这份材料由在谷歌engEDU小组工作的Nick Parlante 创作。特别感谢来自我在谷歌的同事:John Cox、Steve Glassman、Piotr Kaminksi和Antoine Picard的帮助。最后要感谢的是开明大方的谷歌和Maggie Johnson主任,是他们允许我把这些材料基于Creative Commons Attribution 2.5 许可证在网上免费分享,开始享受吧!

Google’s Python Class翻译计划

Google’s Python Class是谷歌发布的,面向有一定编程经验的读者的入门教程。为了方便自己学习Python,也同时为了提升英语水平,我决定今日起翻译这份文档。如果这些翻译得很差的文字不幸被读者看见,还请多多原谅,也请提出宝贵的批评意见,我一定会改进的。如果实在不能接受我的翻译,请阅读官方的英文版

这份文档的官方说明将在稍后发布。而第一篇,也就是「安装Python」(Python Set Up)将在今天晚些时候或者明天发布。如果你着急想看到后续的翻译,不妨在文章下面发表评论Push我,有了来自读者的压力我才更有动力呀!

谢谢!

如何在Ubuntu下更新源

相信各位一定也受不了Ubuntu更新时与官方默认源的连接速度。更换自己使用的源应该是Ubuntu安装完成之后要做的第一件事。请注意,在不同的网络环境下与各个源的连接速度不同,请在修改之前手动确认与源的连接速度。例如,根据我的网络环境,我添加的是网易163源。

首先按下「Ctrl」+「Alt」+「T」唤出终端,在终端中进行如下操作:

备份源列表:
sudo cp /etc/apt/sources.list /etc/apt/sources.list_backup

用gedit打开源列表:
sudo gedit /etc/apt/sources.list

选择合适的源加入列表:
源列表请参考Ubuntu wiki

刷新列表:
sudo apt-get update

以上。