Skip to content

Instantly share code, notes, and snippets.

@numbbbbb
Last active August 29, 2015 14:11
Show Gist options
  • Save numbbbbb/11ee09377b7f1d88ec65 to your computer and use it in GitHub Desktop.
Save numbbbbb/11ee09377b7f1d88ec65 to your computer and use it in GitHub Desktop.
Python试译

第一章 Python初探

我们从一个小谜题以及它的答案开始。你认为下面这两行的含义是什么?

(Row 1): (RS) K18,ssk,k1,turen work.
(Row 2): (WS) Sl 1 pwise,p5,p2tog,p1,turn.

它们看起来像是某种计算机程序。实际上,这是一个针织图案;更准确的说,这两行描述的是如何编织袜子的足跟部分。对我来说看懂它们就像让猫看懂纽约时报上的填字游戏一样难,但是对我妻子来说却是轻而易举。如果你也懂编织的话,一样可以轻松看懂。

来看另一个例子。虽然你不知道最终会做出什么,但是马上就能明白下面的内容是什么。

PDF太难复制 等之后再处理

即使你不会做饭,应该也能看懂这是一个菜谱:一系列食物原料以及准备工作。这道菜是什么呢?是lefse,一道和玉米饼很像的挪威美食。做好之后抹上黄油、果酱或者其他你喜欢吃的东西,最后卷起来吃。

编织图案和菜谱有一些共同的特征:

  • 专有名词、缩写以及符号,有些很常见,有些很难懂。
  • 规定专有名词、缩写以及符号的使用方法——也就是它们的语法。
  • 一个操作序列,按照顺序进行。
  • 有时需要重复一些操作(循环),比如炸lefse的每一面。
  • 有时需要引用其他操作序列(用计算机术语来说就是一个函数)。在菜谱中,你可能需要引用另一个处理土豆的菜谱[译者注]。
  • 假定已经有相关知识。菜谱假定你知道水是什么以及如何烧水。编织图案假定你学过编织并且不会经常扎到手。
  • 一个期望的结果。在我们的例子中分别是袜子和食物,千万不要把它们混在一起哦。

[译者注]这里原文是ricing potato,rice是大米,ricing potato的意思是把土豆处理成大米粗细的条状,一般会使用一个类似压面机的东西来处理,放入土豆,用力下压就可以得到土豆丝。

以上这些概念都会出现在计算机程序中。这两个例子的目的是让你知道编程并不像看起来那么高深莫测,其实只是学习一些正确的单词和规则而已。

下面我们来看看真正的程序。你知道它在做什么吗?

for countdown in 5, 4, 3, 2, 1, "hey!":
	print(countdown)

这其实是一段Python程序,会打印出下面的内容:

5
4
3
2
1
hey!

看到了吗,学习Python就像看懂菜谱或者编织图案一样简单。此外,你可以在桌子上舒服并且安全地练习编写Python程序,完全不用担心被热水烫到或者被针扎到。

Python程序有一些特殊的单词和符号——for、in、print、逗号、冒号、括号以及其他符号——这些单词和符号是语法的重要组成部分。好消息是,Python的语法非常优秀,相比其他编程语言,学习Python需要记住的语法内容很少。Python语法非常自然——就像一份菜谱一样。

下面的Python程序会从一个Python列表(list)中选出一条电视新闻的常用语并打印出来:

cliches = [
	"At the end of the day",
	"Having said that",
	"The fact of the matter is",
	"Be that as it may",
	"The bottom line is",
	"If you will",
	]
print(cliches[3])

程序会打印出第四条常用语:

Be that as it may

一个Python列表,比如cliches,就是一个值序列,可以通过它们相对于列表起始位置的偏移量来访问。第一个值的偏移量是0,第四个值的偏移量是3。

人类通常从1开始数数,所以从0开始数似乎很奇怪。用偏移量来代替位置会更好理解一些。

列表在Python中非常常用,第三章会讲解列表的用法。

下面这段程序同样会打印出一条引用内容,但是这次是用说话者的人名而不是列表中的位置来进行访问:

quotes = {
	"Moe": "A wise guy, huh?",
	"Larry": "Ow!",
	"Curly": "Nyuk nyuk!",
	}
stooge = "Curly"
print(stooge, "says:", quotes[stooge])

运行这个小程序会打印出:

Curly says: Nyuk nyuk!

quotes是一个Python字典,字典是一个集合,包含唯一键(在本例中是跟屁虫(stooge)的名字)及其关联的值(在本例中是跟屁虫说的话)。使用字典可以通过名字来存储和查找东西,和列表一样非常有用。在第三章中会详细讲解字典。

常用语的例子中使用方括号([和])来创建Python列表,跟屁虫的例子中使用大括号({和},大括号的英文是curly brackets,但是大括号和Curly没有任何关系[译者注])来创建Python字典。这些都是Python的语法,在之后的章节中你会看到更多语法。

[译者注] Curly是美国乌鸦童子军(Crow Scouts)的一员,乌鸦童子军是美国和印第安人打仗时候由印第安人战俘组成的军队。Curly是小巨角河战役中为数不多的幸存者之一,小巨角河战役是美军和北美势力最庞大的苏族印地安人之间的战争,在这场战争中印第安人歼灭了美国历史上最有名的第七骑兵团,Curly当时没有参战,他是第一个报告第七骑兵团战败的人,也因此出名。

现在我们来看另一个完全不同的例子:例1-1中的Python程序会执行一系列复杂的任务。你可能还看不懂这段程序,没关系,学完本书之后就可以看懂了。这个例子的目的是让你了解典型的Python程序长什么样。如果你了解其他计算机语言,可以对比一下。

例1-1会连接YouTube网站并获取当前评价最高视频的信息。如果YouTube返回的是常见的HTML文本,那就很难从中挖掘出我们想要的信息(在237页 的“Crawl and Scrape[待翻译]”中我会介绍网页抓取)。幸运的是,它返回的是JSON格式的数据,这种格式可以直接用计算机处理。JSON或者说JavaScript Object Notation(JavaScript对象符号)是一种人类可以阅读的文本格式,它描述了类型、值以及值的顺序。JSON就像一个小型编程语言,使用JSON在不同计算机语言和系统之间交换数据已经成为了一种非常流行的方式。更多关于JSON的内容请参考185页的“JSON”。

Python程序可以把JSON文本翻译成Python的数据结构——你会在之后的两章中学习它们——和你自己创建出来的一样。这个YouTube响应包含很多数据,作为演示我只打印出了前六个视频的标题。再说一次,这是一个完整的Python程序,你自己也可以运行一下(译者注:可惜中国访问不了YouTube,所以你就不用运行了)。

Example 1-1. intro/youtube.py

import json
from urllib.request import urlopen
url = “https://gdata.youtube.com/feeds/api.standardfeeds/top_rated?alt=json”
response = urlopen(url)
contents = response.read()
text = contents.decode(‘utf8’)
data = json.loads(text)
for video in data[‘feed’][‘entry’][0:6]:
	print(video[‘title’][‘$t’])

我最后一次运行这个程序得到的输出是:

Evolution of Dance - By Judson Laipply
Linkin Park - Numb
Potter Puppet Pals: The Mysterious Ticking Noise
“Chocolate Rain” Original Song by Tay Zonday
Charlie bit my finger - again !
The Mean Kitty Song

这个Python小程序仅仅用了九行代码就很好地完成了任务,并且具备很高的可读性。如果你看不懂下面的术语,没关系,接下来的几章中你会明白它们的意思:

  • 第1行:从Python标准库中导入名为json的所有代码
  • 第2行:从Python标准urllib库中导入urlopen函数
  • 第3行:给变量url赋值一个YouTube地址
  • 第4行:连接指定地址处的web服务器并请求指定的web服务
  • 第5行:获取响应数据并赋值给变量contents
  • 第6行:把contents解码成一个JSON格式的文本字符串并赋值给变量text
  • 第7行:把text转换为data——一个存储视频信息的Python数据结构
  • 第8行:每次获取一个视频的信息并赋值给变量video
  • 第8行:使用两层Python字典(data[‘feed’][‘entry’])和切片操作([0:6])
  • 第9行:使用print函数打印出视频标题

视频信息中包含多种你之前见过的Python数据结构,第三章会详细介绍。

在这个例子中,我们使用了一些Python标准库模块(它们就是安装Python时已经包含的程序),但是它们并不是最好的。下面的代码使用第三方Python软件包requests重写了这个例子:

import requests
url = “https://gdata.youtube.com/feeds/api.standardfeeds/top_rated?alt=json”
response = requests.get(url)
data = response.json()
for video in data[‘feed’][‘entry’][0:6]:
	print(video[‘title’][‘$t’])

新版代码只有六行,并且我认为可读性更高。在第五章中我会详细介绍requests以及其他第三方Python软件。

真实世界中的Python

那么,是否真的值得付出时间和努力来学习Python呢?它真的有用吗?实际上,Python诞生于1991年(比Java还早),并且一直是最流行的十门计算机语言之一。许多公司都需要Python程序员——包括许多你每天都会用到的东西,比如Google,YouTube,Dropbox,Netflix和Hulu。我用Python开发过许多产品级应用,从邮件搜索应用到商业网站都有。对于发展迅速的组织来说,Python能极大地提高生产力。

Python可以应用在许多环境下,比如:

  • 命令行窗口
  • 图形用户界面,包括web
  • 客户端和服务端web
  • 大型网站后端
  • 云(第三方负责管理的服务器)
  • 移动设备
  • 嵌入式设备

Python程序从一次性脚本——就像你在本章中看到的一样——到几十万行的系统都有。我们会介绍Python在网站、系统管理和数据处理方面的应用,还会介绍Python在艺术、科学和商业方面的应用。

Python v.s. X

Python和其他语言相比如何呢?什么时候该选择什么语言呢?在本节中,我会展示一些其他语言的代码片段,这样更直观一些。如果有些语言你从未使用过也不必担心,你并不需要看懂所有代码(当你看到最后的Python实例时,你会发现没学过其他语言也不是什么坏事)。如果你只对Python感兴趣的话,完全可以跳过这一节。

下面的每段程序都会打印出一个数字和一条描述语言的信息。

如果你使用的是命令行或者终端窗口,那你使用的就是shell程序,它会读入你的命令、运行并显示结果。Windows的shell叫做cmd,它会运行后缀为.batbatch文件。Linux和其他类Unix系统(包括 Mac OS X)有许多shell程序,最流行的被称为bash或者sh。shell有许多简单的功能,比如执行简单的逻辑操作以及把类似*的通配符扩展成文件名。你可以把命令保存到shell脚本中方便之后运行。shell可能是程序员们接触到的第一个程序,它的问题在于程序超过百行之后扩展性很差,并且比其他语言的运行速度慢很多。下面就是一段shell程序:

#!/bin/sh
language=0
echo “Language $language: I am the shell. So there.”

如果你把这段代码保存为meh.sh并通过sh meh.sh命令来运行它,就会看到下面的输出:

Language 0: I am the shell. So there.

老牌语言C和C++是底层语言,只有极其重视性能的时候才会使用。它们很难学习,并且有许多细节需要你自己处理,处理不当就可能导致程序崩溃和其他很难解决的问题。下面是一段C程序:

#imclude <iostream>
using namespace std;
int main(){
    int language = 2;
    cout << “Language ” << language << \
        “: I am C++! Pay no attention to that C behind the curtain!” << \
        endl;
    return(0);
}

Java和C#是C和C++的接班人,解决了后者的许多缺点,但是相比之下代码更加冗长,写起来也有许多限制。下面是Java代码:

public class Overlord {
    public static void main (String[] args) {
        int language = 3;
        System.out.format(“Language %d: I am Java! Scarier than C!\n”, language);
    }
}

如果你没写过这些语言的程序,那你可能会觉得很奇怪:这都是什么鬼?!有些语言有很大的语法包袱。它们有时被称为静态语言,因为你必须告诉计算机许多底层细节,下面我来解释一下。

语言有变量——你想在程序中使用的值的名字。静态语言要求你必须声明每个变量的类型:它会使用多少内存以及允许的使用方法。计算机利用这些信息把程序编译成非常底层的机器语言(专门给计算机硬件使用的语言,硬件很容易理解,但是人类很难理解)。计算机语言的设计者通常必须进行权衡,到底是让语言更容易被人使用还是更容易被计算机使用。声明变量类型可以帮助计算机发现更多潜在的错误并提高运行速度,但是却需要使用者进行更多的思考和编程。C、C++和Java代码中经常需要声明类型。举例来说,在上面的例子中必须使用intlanguage变量声明为一个整数。(其他类型的存储方式和整数不同,比如浮点数3.14159、字符以及文本数据。)

那么为什么它们被称为静态语言呢?因为这些语言中的变量不能改变类型。它们是静态的。整数就是整数,永远无法改变。

相比之下,动态语言(也被称为脚本语言)并不需要在使用变量前进行声明。假设你输入x = 5,动态语言知道5是一个整数,因此变量x也是整数。这些语言允许你用更少的代码做更多的事情。动态语言的代码不会被编译,而是由解释器程序来解释执行。动态语言通常比编译后的静态语言更慢,但是随着解释器的不断优化,动态语言的速度也在不断提升。长期以来,动态语言的主要应用场景都是很短的程序(脚本),比如给静态语言编写的程序进行数据预处理。这样的程序通常被称为胶水代码。虽然动态语言很擅长做这些事,但是如今它们也已经具备了处理大型任务的能力。

许多年来,Perl一直是一门万能的动态语言。Perl非常强大并且有许多扩展库。然而,它的语法非常难用,并且似乎无法阻挡Python和Ruby的崛起。下面是一段Perl代码:

my $language = 4;
print “Language $language: I am Perl, the camel of languages.\n”;

Ruby是一门新语言。它借鉴了一些Perl的特点,并且因为web开发框架Ruby on Rails红遍大江南北。Ruby和Python的许多应用场景相同,选择哪一个通常看个人喜好或者是否有你需要的库。下面是一段Ruby代码:

language = 5
puts “Language #{language}: I am Ruby, ready and aglow.”

PHP在web开发领域非常流行,因为它可以轻松结合HTML和代码,就像例子中展示的那样。然而,PHP语言本身有许多缺陷,并且很少被应用在Web以外的领域。

<?PHP
$language = 6;
echo “Language $language: I am PHP. The web is <i>mine<i>, I say.\n”;
?>

最后是我们的主角,Python:

language = 7
print(“Language %s: I am Python. What’s for supper?” % language)

## 所以,为什么选择Python?

Python是一门非常通用的高级语言。它的设计极大地增强了*代码可读性*,可读性远比听上去重要的多。每个计算机程序只被编写一次,但是会被许多人阅读和修改许多次。提高可读性也可以让学习和记忆更加容易,因此也更容易修改。和其他流行的语言相比,Python的学习曲线更加平缓,可以让你很快具备生产力,当然想成为专家还是需要深入学习才行。

Python简洁的语法可以让你写出比静态语言更短的程序。研究证明程序员每天可以编写的代码行数是有限的——无论什么语言——因此,如果完成同样的功能只需要编写一半长度的代码,那你的生产力就可以提高两倍。对于重视这一点的公司来说,Python是一个不算秘密的秘密武器。

在顶尖的美国大学中Python是介绍性计算机课程中最流行的语言。此外,它也被超过两千名雇主用来评估编程技能。

当然,它是免费的,就像啤酒和演讲一样。你可以免费用Python来编写任何东西并用在任何地方。没人可以一边阅读你的Python程序一边说:“这是一个非常棒的小程序,希望不会发生什么意外。”

Python几乎可以运行在任何地方并且“自带电池”——标准库毋庸置疑非常有用。

不过,选择Python最关键的理由可能出乎你的意料:大家都*喜欢*它。实际上大家不只是把Python当做一个完成工作的工具,而是非常享受用它编程。在工作中不得不用其他语言时,人们通常会非常想念Python的某些特性。这就是Python能够胜出的原因。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment