一开始学习计算机技术和编程会有些困难:该选择哪个编程语言?用哪个IDE?以及更重要的,为什么选它?
在我看来,编程时最重要的事是选择最适合解决问题的工具。其次是选择自己最擅长的工具。如果我告诉你你应该用C++因为它是速度最快的编程语言之一,但是你没有过任何处理内存管理或者自己设计数据结构的经验的话,那这显然不是个好主意。你在编程中可能会很挣扎并且感觉很糟糕。
而Python解决了很多这些方面的问题。它比C++运行的慢的多,但也容易写的多。作为初学者的你可能往往并不太关心程序跑的有多快,你在意的只是搞一些酷炫的玩意,同时学一点编程的基本概念。
所以你需要做的第一个决定就是学习哪个编程语言。在数百种编程语言中,为什么初学者应该学习Python?且看我给你分析分析。
简洁的语法
Python的核心哲学中(参见PEP20中总结的“Python之禅”)包括以下观点:
美比丑好
简单比复杂好
可读性很重要
由此可见Python从设计之初就怀着简洁的宗旨。这在Python诞生之时让人耳目一新,因为那时占据主流的编程语言C/C++对用户来说并不是特别的友好。
我们用一个简单的“Hello,World”例子来比较一下C++和Python的语法:
#include stdout
int main() {
std::cout << "Hello, world!\n";
}
Python:
print('Hello, world!')
两段代码的目的都是向终端打印一个字符串,可以看出二者有很大的区别。为了更好的体现区别,我们再做一个比较,这次用另一种语言PHP来做对比:
Python:
x=1
while x <=5:
print 'x is less than 5:' + str(x)
x += 1
PHP:
<?php
$x=1;
while($x<=5) {
echo "x is less than 5: $x";
x++;
}
?>
Python尽力免除不必要的东西,只保留必须的元素,这也是Python不使用花括号以及不用分号作为行结尾的一个很大原因。仔细观察一下这些特性带来的不同(我保证这是最后一段代码对比了):
Python
def foo(x):
if x == 0:
bar()
baz()
else:
qux(x)
foo(x - 1)
C:
void foo(int x)
{
if (x == 0) {
bar();
baz();
} else {
qux(x);
foo(x - 1);
}
}
这里不再做与其他语言的对比了。上面提到的这些语言都很伟大并且得到了广泛的应用,但它们对初学者来说并不是十分美好。
对于拥有is,not和with等关键字的Python,良好设计的程序读起来就像英语文本一样容易。这点尤其体现在if条件语句的条件声明上,如果if语句的条件很庞大阅读起来将会很困难:
a = None
b = None
if a is not None and b is not None:
print 'Foo!'
else:
print 'Bar!'
上面的条件声明比常见的if((a != null) && (b != null))要易读的多。
易配置易运行
许多初学者在尝试学习一门语言时甚至在一行代码都没写的情况下就以失败告终了。对于某些语言如Java,你得先安装并配置好复杂的项目目录然后编译代码才能运行。
而对于Python,你只需要下载并安装Python,然后用’python <your-script>.py’来运行程序就可以了,没有复杂的目录结构需要创建也不必编译才能运行。
尽管对于现代语言来说可能越来越少见了,但编译代码依然是一件比你想象的更困难的事(但它仍旧是不可避免的)。我们来看看下面这个简单的C程序的
makefile:
CC = gcc
CFLAGS = -g -Wall
TARGET = myprog
all: $(TARGET)
$(TARGET): $(TARGET).c
$(CC) $(CFLAGS) -o $(TARGET) $(TARGET).c
clean:
$(RM) $(TARGET)
虽然我认为这是一个简单的makefile,但是在任何时候我都会优先选择Python而不是它。
Python让你在编程初始能专注于学习编程的概念而不是陷入高级语言怎样编译为机器码的繁琐细节工作中。那些东西当然需要学习,但不应该在开始的时候学习。
海量的标准库
Python最广为称道的一个优点就是它强大的标准库。在Python 2.7版本中附带了超过400个模块,从最小化的HTTP服务模块BaseHTTPServer,到数据库模块sqlite3,到文件压缩库gzip应有尽有。
你想用Python实现的绝大部分东西往往已经在标准库里包含了。所以你可以仅用很少的工作就可以创造出酷炫的东西,比如机器学习应用。
我常常提醒自己浏览一下标准库看看都有哪些东西以免自己重新造轮子。所以在你准备开始写一个url解析模块之前,先看看标准库里有没有类似的模块吧。
不用重新造轮子这一点有另外一个好处,就是标准库里的东西通常都经过了充分的测试并且没有bug。标准库里的许多代码已经存在了一段时间,并且可能已经被顶级的公司使用过了(后文会讨论),所以可以放心的使用。
社区
庞大而活跃的社区意味着两件事:
1. 很多的第三方库
2. 很多高手可以帮助你
在不考虑你的编程水平的情况下,这两点可能是你应该使用Python最重要的原因了。这意味着你可以得到数不尽的文档、指南以及用于学习的Python源代码。
Python在各种不同的编程语言排名中都居高不下:Redmonk排名第4, Tiobe排名第5.
容易调试
初学者往往最难掌握的技能就是调试代码。当你学会调试代码,你才真正开始了解编程语言及其内部工作机制。有时候你的bug很简单,仅仅是语法问题,更多时候你的bug隐藏很深难以发现,可能你运行程序100次bug只出现了1次。
这时候就需要了解调试器以及语言中常见的错误提示。而值得庆幸的是,相对于很多其他语言来说,Python的错误处理和报告机制很棒。
例如在C++中如果某个地方出错(如对无效指针的解引用,访问超出数组边界的元素等),如果程序崩溃那算你好运,因为这样你就明确知道程序中存在问题,但可能你并不知道具体问题在哪个地方(调试器对初学者来说并不总是很直观)。如果你很不幸,程序没有崩溃(或者只是随机的崩溃),这样bug就会隐藏起来更难于发现。
Python糟糕的地方
我认为写一篇描述Python如何光彩亮丽的文章而对它的缺点不置一词是不对的。像其他编程语言一样,Python远远称不上完美,有很多时候我们不应该使用Python。
我已经不止一次提到过,Python运行很慢,特别是与编译语言如C/C++或者Go对比。这是因为Python的很多特性都会降低运行速度,如动态类型,垃圾回收等。
这意味着你在处理大量数据的时候不应该使用纯Python,而应该在Python中调用C++函数(这个我们以后再讨论)。
另外,由于垃圾回收机制的存在,Python也不适用于实时系统。因为垃圾回收意味着程序的运行时间不确定,你不知道你的函数会耗时1ms或者100ms。就是因为有如此多的不确定存在,对于实时系统,你应该选用手动管理内存的语言如C或者C++。
同样地,由于Python依赖很多系统资源并且自带一个解释器,Python代码通常(但也有例外)只能运行在装有操作系统的硬件系统之上(微控制器或者其他嵌入式系统都不行)。
总结
这里仅列举了Python适用于初学者的一些原因。当前有这么多学习Python的资源,你仅需要花费很少的时间就可以开始学Python编程了。