第一个程序:Hello,world!现在你可以打开IDLE或PythonWin,新建一个py为扩展名的Python脚本文件,输入以下内容:代码1:第一个Python程序1printHello,world!保存并运行它,如果输出Hello,world!,说明你已经成功编写了第一个Python程序,congratulations!上面的“HelloWorld”几乎是学习任何一门新语言的必经之路,正如提出这个程序的SimonCozens所说:“它是编程之神的传统咒语,可以帮助你更好的学习语言”。为了比较Python和C#在编码风格等方面的差异,下边给出一个稍复杂些的“Hello,world”程序以及它的C#对照版本。代码2:唐僧版的Hello,world程序1#-*-coding:utf-8-*-23我的第2个Python程序4仅为和C#作对比,谢绝效仿:)56importsys7defMain():8sys.stdout.write(Hello,world!\n)9#下面的语句看起来很怪,一会我们再解释它是干什么滴10if__name__==__main__:11Main()注意,代码2第1行#-*-coding:utf-8-*-,是为了让Python支持中文,这个是必须的。如果你嫌麻烦,可以在IDE里作一个只包含这一行代码的模版文件,以后每次新建Python脚本的时候自动打开这个模版,这样会比较省事。代码3:C#的对照版本1/*2我的第1001个C#程序3可能还不到,没写过这么多4*/5usingSystem;6classProgram{7staticvoidMain(){8if(1==1)//干什么?要搞SQL注入啊?9Console.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;printa,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中,我们首先importsys,这是导入了Python的sys模块,然后在代码里我们可以引用sys模块中的对象stdout及它的write方法。在Python中这是必须的,否则你无法调用sys模块中的任何东西。在C#写的代码3中,我们首先usingSystem,这是引入System命名空间,using表明该程序正在使用给定命名空间下的名称(如Console)。对C#这是可选的,如果不事先usingSystem,你可以在代码中使用全限定名,如System.Console.WriteLine。简单的说,Python中的import相当于C#中的程序集引用。一个程序集可能包括一个或多个命名空间,C#中的using是用来引入命名空间的。Python如果想实现和using类似的功能,就需要用到fromimport语句。例如对于代码2,可以将importsys改写为fromsysimport*,这样在程序中就可以直接使用stdout.write了。最后,import可以出现在代码的任何位置,只要在引用它之前出现就可以。不过为了提高程序可读性,建议还是在所有代码开头书写import。0.4小结作为Python语言的入门,本章没有涉及到过多的编程细节,主要比较了C#与Python两种语言在编码风格等方面最基本的差别,要点如下:(1)Python使用强制缩进的编码风格,并以此组织代码块;(2)Python语句结尾不用分号;(3)Python标明注释用#(单行)或三引号(多行);(4)Python语言没有入口方法(Main),代码会从头到尾顺序执行;(5)Python语言用import引入所需要的模块(关于模块和包的具体内容将在第6部分介绍,见文末目录)以上这几点是C#程序员初学Python时最易犯错误的地方,希望引起大家注意。好了,今天就先到这里。“一切数据是对象,一切命名是引用”。如果你能理解这句话,说明对Python的变量与数据类型已经有了不错的认识,那么我建议你直接跳到1.4节的总结部分,看看C#与Python在变量与数据类型方面的差异就可以。如果你还有疑惑,那么就请完整的读一下这一章吧。好,让我们开始。1.1变量声明和定义1.1.1变量声明和定义与C#不同,Python在使用变量之前无须定义它的类型,试着运行下面的例子:1i=12printi从上边我们可以看到,变量i在使用前并不需要定义,但是必须声明以及初始化该变量。试着运行下面的例子:1i=12printi+j上面的代码会产生一个异常:“NameError:name'j'isnotdefined”,Python提示变量j没有定义。这点和BASIC等弱类型的语言不一样。在BASIC中,执行上述代码的时候不会产生异常,你可以在EXCEL的VBA开发环境里试一下,把print改为MsgBox就可以,结果会输出1。这说明Python并不是一种类似BASIC的弱类型语言。另一方面,Python与C#有一个很大的差异就是在程序运行过程中,同一变量名可以(在不同阶段)代表不同类型的数据,看看下边的例子:1i=12printi,type(i),id(i)3i=100000000004printi,type(i),id(i)5i=1.16printi,type(i),id(i)变量i的类型在程序执行过程中分别经历了int、long和float的变化,这和静态类型语言(如C等)有很大不同。静态语言只要一个变量获得了一个数据类型,它就会一直是这个类型,变量名代表的是用来存放数据的内存位置。而Python中使用的变量名只是各种数据及对象的引用,用id()获取的才是存放数据的内存位置,我们输入的1、10000000000和1.1三个数据均会保存在id()所指示的这些内存位置中,直到垃圾回收车把它拉走(在系统确定你不再使用它的时候)。这是动态语言的典型特征,它确定一个变量的类型是在给它赋值的时候。另一方面,Python又是强类型的,试着运行下边的例子:1#-*-coding:utf-8-*-2i=10;j='ss'3printi+j4#正确的写法是printstr(i)+j,输出10ss会产生一个异常:“TypeError:unsupportedoperandtype(s)for+:'int'and'str'”。在BASIC等弱类型的语言中,上边的例子会正常运行并返回(虽然有时候是不可预期的)结果。所以,我们说Python既是一种动态类型语言,同时也是一种强类型的语言,这点是和C#不同的地方。对于Python的这种变量的声明、定义和使用方式,C#程序员可能要花一段时间去适应,不过相信你会很快就喜欢上它,因为它让事情变得更加简单(而且不会不安全)。而且,C#4.0已经开始用类似的方式定义和使用变量(通过在变量名前加关键字dynamic),如果你先学了Python,将能够更快的适应C#4.0的动态编程特征。1.1.2变量的命名规则Python与C#的变量(以及函数、类等其它标识符)的命名规则基本一样,同样对大小写敏感。不一样的地方是,Python中以下划线开始或者结束的标识符通常有特殊的意义。例如以一个下划线开始的标识符(如_foo)不能用frommoduleimport*语句导入。前后均有两个下划线的标识符,如__init__,被特殊方法保留。前边有两个下划线的标识符,如__bar,被用来实现类私有属性,这个将在“类和面向对象编程”中再说。最后,Python的关键字不能作为标识符(这个大家都知道),不过Python的关键字比C#要少得多,可以google一下,这里就不列出了。1.1.3常量Python没有常量,如果你非要定义常量,可以引入const模块(我没用过,在C#中我也很少用常量)。1.2简单数据类型Python程序中的一切数据都是对象,包括自定义对象及基本数据类型。这点和C#一样,它们都是完全面向对象的语言,所以我想C#程序员会很容易理解Python的“一切数据是对象”这个口号。与C#不同的是,Python不区分值类型和引用类型,你可以把所有的类型都理解为C#的引用类型(当然,它们的实现方式是不一样的,这里只是一个类比)。Python内建的数据类型有20多种,其中有些不常用到,有些即将被合并。本文将主要介绍空类型、布尔类型、整型、浮点型和字符串、元组、列表、集合、字典等9种Python内置的数据类型。在这里,我将前4种称为“简单数据类型”,将后5种称为“高级数据类型”,实际上Python语言本身没有这种叫法,这样分类是我自己设定的,主要是为了和C#中的相关概念对照方便,希望不要误导大家。1.2.1空类型空类型(None)表示该值是一个空对象,比如没有明确定义返回值的函数就返回None。空类型没有任何属性,经常被用做函数中可选参数的默认值。None的布尔值为假。Python的None和C#中的可空类型NullableT类似,比如C#可以定义Nullabledoublei=null,与Python的空类型类似,但实现原理和用途都不一样。1.2.2布尔类型Python中用True和False来定义真假,你可以直接用a=True或a=False来定义一个布尔型变量。但在Python2.6里,True、False以及None却都不是关键字,在Python3.0里它们已经是关键字了,这个有点乱,我们可以不用管它,直接使用就OK了。注意和C#不同的是,Python中True和False的首字母要大写。最后一点,在C#中布尔类型和其他类型之间不存在标准的转换。但在Pyt