0.0 写在前面
前几天写了《从C#到Python —— 谈谈我学习Python一周来的体会》这篇文章,反响还不错,对我这样的Freshman是个很大的鼓舞。应博友的提议,从今天开始写一个系列的连载文章《从C#到Python》。一方面是整理下我自己学习Python的心得体会,留着以后忘记时备查;另一方面就是希望能对有一定C#编程基础、同时对Python感兴趣的朋友有所帮助。
首先要说明的是,这并不是一个完备的Python语言教程,因为这样的教程在网络上、书店里已经有太多了。本文的主要目的是希望能够为C#使用者提供一个简短的Python语言入门,以节省他们的学习时间。作为一个C#程序员,你掌握的编程知识已经足够多了。要知道,Python和C#这两门语言是非常相像的,它们之间的关系类似方言与普通话的关系,而不是英语和汉语的关系。你只是需要花点时间了解Python与C#之间的一些微小差别,然后动手编几个小程序熟悉它。你会发现,Python比你想象的要更简单。
此外,写这个连载的目的并不是比较两门语言的高下,更不是鼓动任何人完全从C#转向Python。我的想法很简单:把学习Python当作一个兴趣,并能在适当的时候使用它。
考虑到目前两门语言各自版本的普及情况,本文将主要结合C#的2.0版本和Python的2.6版本来进行介绍。对于一些在Python 2.6中已存在的但是在C# 3.0及4.0里才新增的特性,也将会适当提及。
最后,这个连载将以介绍Python语法为主,初步的章节安排见文后(欢迎提出意见或建议,我会适当调整以符合大家的需要)。如果以后有能力及时间,我会考虑继续写一些GUI、Web开发等相关的内容。
OK,下面正式开始。
0.1 安装和配置Python开发环境
在Python的官方网站可以下载到Windows下的安装包(目前是2.6.4版本),按照提示一路Next下去就可以了。记得安装完成后将Python所在的目录(如C:\Python26)加入系统PATH变量。
Python的安装包自带了一个简单的集成开发环境——IDLE,你也可以选一个自己喜欢的IDE。我个人推荐PythonWin,它的语法提示功能很不错,适合初学者使用(参见我的另一篇文章《Python IDE的选择》)
0.2 第一个程序:Hello, world!
现在你可以打开IDLE或PythonWin,新建一个py为扩展名的Python脚本文件,输入以下内容:
代码1:第一个Python程序
1 print "Hello, world!"
保存并运行它,如果输出 >>> Hello, world! ,说明你已经成功编写了第一个Python程序,congratulations!
上面的“Hello World”几乎是学习任何一门新语言的必经之路,正如提出这个程序的Simon Cozens所说:“它是编程之神的传统咒语,可以帮助你更好的学习语言”。
为了比较Python和C#在编码风格等方面的差异,下边给出一个稍复杂些的“Hello, world”程序以及它的C#对照版本。
代码2:唐僧版的Hello, world程序
1 # -*- coding: utf-8 -*-
2 """
3 我的第2个Python程序
4 仅为和C#作对比,谢绝效仿:)
5 """
6 import sys
7 def Main():
8 sys.stdout.write("Hello, world!\n")
9 #下面的语句看起来很怪,一会我们再解释它是干什么滴
10 if __name__ =="__main__":
11 Main()
注意,代码2第1行# -*- coding: utf-8 -*-,是为了让Python支持中文,这个是必须的。如果你嫌麻烦,可以在IDE里作一个只包含这一行代码的模版文件,以后每次新建Python脚本的时候自动打开这个模版,这样会比较省事。
代码3:C#的对照版本
1 /*
2 我的第1001个C#程序
3 可能还不到,没写过这么多
4 */
5 using System;
6 class Program{
7 static void Main(){
8 if (1==1) //干什么?要搞SQL注入啊?
9 Console.WriteLine("Hello, world!");
10 }
11 }
0.3 认识二者最基本的差异
0.3.1 差异之一:编码风格
比较代码2、3,可以很容易看出两种语言在编码风格上的差异,下面分别来说。
(1)代码块与缩进
C#使用C/C++风格的编码形式,除了要求用{}组织代码块外,语句间的缩进可以是任意的。
Python强制所有程序都有相同的编码风格,它通过缩进来组织代码块。缩进相同的语句被认为是处于同一个代码块中,在if/else等语句及函数定义式末尾会有一个冒号,指示代码块的开始。Python这种强制缩进的做法可以省去{}或者begin/end等,使程序的结构更为清晰(有的人认为恰好相反),同时也减少了无效的代码行数。
此外需要注意,尽量使用4个空格作为Python代码的一个缩进单位,最好不使用Tab,更不要混用Tab和空格,这也算是Python的一个非强制性约定吧。
(2)语句结尾
C#语句用分号结尾,Python不用任何符号(类似BASIC)。
实际上Python也可以使用分号结尾,像这样 a = 1 ; b =2 ; c = 3 ; print a,b,c ,不过Python中这种风格多用于调试,应为你可以很容易注释掉这一行就删除了所有调试代码。
另外,当一行很长时,Python可以用 \ 符号折行显示代码。
(3)注释方法
C#用//进行单行注释,用/* */进行多行注释;而Python用#符号进行单行注释,用三引号(可单可双)进行多行注释。
(4)条件表达式
C#的条件表达式必须要加括号,见代码3第8行;而Python的条件表达式加不加括号均可(Python程序员一般不加,C/C++/C#程序员一般会加:)
0.3.2 差异之二:入口方法
C#语言必须要有入口方法Main(),这是程序开始执行的地方。
Python语言中没有入口方法(函数),作为解释型的语言,Python代码会自动从头执行(所以在代码2中除了第8行,其它行均属于废话)。
如过你对这点不习惯,可以使用Python代码的内置属性__name__。__name__属性会根据Python代码的运行条件变化:当Python代码以单个文件运行时,__name__便等于"__main__",当你以模块形式导入使用Python代码时,__name__属性便是这个模块的名字。
当然,Python中的__name__属性并不是为了照顾C/C++/C#程序员的编程习惯而准备的,它主要目的是用于模块测试。想象一下在C#中编写一个组件或类代码时,一般还得同时编写一个调用程序来测试它。而Python中可以把二者合二为一,这就是__name__属性的真正作用。
0.3.3 差异之三:import和using
在Python写的代码2中,我们首先import sys,这是导入了Python的sys模块,然后在代码里我们可以引用sys模块中的对象stdout及它的write方法。在Python中这是必须的,否则你无法调用sys模块中的任何东西。
在C#写的代码3中,我们首先using System,这是引入System命名空间,using表明该程序正在使用给定命名空间下的名称(如Console)。对C#这是可选的,如果不事先using System,你可以在代码中使用全限定名,如System.Console.WriteLine。
简单的说,Python中的import相当于C#中的程序集引用。一个程序集可能包括一个或多个命名空间,C#中的using是用来引入命名空间的。Python如果想实现和using类似的功能,就需要用到from import语句。例如对于代码2,可以将import sys改写为from sys import *,这样在程序中就可以直接使用stdout.write了。
最后,import可以出现在代码的任何位置,只要在引用它之前出现就可以。不过为了提高程序可读性,建议还是在所有代码开头书写import。
0.4 小结
作为Python语言的入门,本章没有涉及到过多的编程细节,主要比较了C#与Python两种语言在编码风格等方面最基本的差别,要点如下:
(1)Python使用强制缩进的编码风格,并以此组织代码块;
(2)Python语句结尾不用分号;
(3)Python标明注释用#(单行)或三引号(多行);
(4)Python语言没有入口方法(Main),代码会从头到尾顺序执行;
(5)Python语言用import引入所需要的模块(关于模块和包的具体内容将在第6部分介绍,见文末目录)
以上这几点是C#程序员初学Python时最易犯错误的地方,希望引起大家注意。好了,今天就先到这里。
进一步阅读的参考:
[1]《Python语言简介-Python是什么?》,一个写得比较有趣的Python介绍。
[2]《python 创始人访谈录2: python 的起源,特点和未来 》,我们可以从中了解到Python为什么会有这种编码风格。
[3]《我的名字叫Python》,一个面向C++程序员的Python使用手册。如果你是C/C++程序员,我向你推荐这本书。
附:《从C#到Python》系列连载目录
从C#到Python —— 谈谈我学习Python一周来的体会
从C#到Python —— 0 前言:进入Python的世界
从C#到Python —— 1 变量和数据类型
从C#到Python —— 2 运算符、表达式和流程控制
从C#到Python —— 3 函数及函数编程
从C#到Python —— 4 类及面向对象
从C#到Python —— 5 模块和包
New! 从C#到Python —— PDF整理版(下载地址)