1.2 快速入门Python语法
在入门阶段,我们建议的学习方法是:先运行书中给出的范例程序,再通过运行结果理解关键代码的含义。开始不建议大家直接动手编写代码,因为这样很容易由于细小的语法错误而导致程序无法运行,不断的挫败感会让学习积极性逐渐消退。
1.2.1 Python的缩进与注释
Python语言不是用大括号来定义语句块,也没有用类似End之类的结束符来表示语句块的结束,而是通过缩进来标识语句块的层次。大家能在之前的HelloPython范例程序中体会到这一点。
注释是代码里不可或缺的要素,之前我们是通过#来编写一行的注释,此外,还可以用三个单引号(' ' ')或三个双引号(" " ")来进行多行的注释。下面改写HelloPython范例程序,来示范一下缩进和注释的具体用法。
1 #coding=utf-8 2 #Print Hello World 3 print("Hello World") 4 ''' 5 1到10的累加和 6 ''' 7 #sum=0 8 sum=0 9 for i in range(11): 10 #sum += i 11 sum += i 12 print(sum)
在第1行里,通过#coding的方式指定了本程序的编码格式是utf-8,在第2行里,通过#编写了一行注释。在第4行到第6行里,是通过了' ' '来编写了跨行的注释(即多行的注释)。
请注意,在第11行中,通过缩进来定义了for循环语句的语句块,这里缩进了4个空格。在Python语言中并没有严格规定缩进多少空格,但要求同一个语句块层级缩进的空格数是一样的,比如当我们注释第11行的代码,同时取消第10行代码的注释(#),由于没有缩进,Python解释器就会提示语法错误。按照一般的习惯,Python语句块以四个空格一组作为一个基本单位进行缩进。
同样,如果我们取消第7行代码的注释,由于这行代码没有同之前的代码有逻辑上的从属关系或层级关系,所以不该缩进,如果缩进了也会报错。而且,这里我们缩进的单位是4个空格,所以之后的缩进都应该是4个空格为一组作为缩进的基本单位,即在同一种编码风格中,相同层次语句块(或代码段)的缩进空格数必须保持一致。
1.2.2 定义基本数据类型
在Python中,定义变量时不需要声明类型可以直接赋值,这看上去是好事,因为编程更方便了。其实不然,正因为没有约束,所以初学者更不能随心所欲地使用,否则会让程序代码的可读性变得很差。在下面的PythonDataDemo.py程序中,我们来看下基本数据类型的用法。
1 # coding=utf-8 2 # 演示基本数据类型 3 age=12 # 整数类型 4 # age=15.5 错误的用法 5 print(age) # 打印12 6 price=69.8 # 浮点型 7 print(price) # 打印69.8 8 #distance=20L # 长整型,仅限Python2 9 #print(distance) # 打印20 10 isMarried=True # 布尔类型 11 print(isMarried) # 打印True 12 msg="Hello" # 字符串 13 print(msg) # Hello
通过注释可以很清晰地看到,从第3行到第13行的程序语句定义并输出了各种类型的数据。语法非常简单,但请大家注意两点。
(1)由于在定义变量前,没有像Java或其他程序设计语言那样,通过int、long、string等关键字显式地定义数据类型,因此变量名应该尽量通俗易懂,让其他人一看就能知道变量的含义,而少用i, j之类的不含实际意义的单个字母。
(2)如果取消第4行的注释,代码也能运行,这时第5行就会输出15.5。这种做法其实改变了age变量的数据类型,这样随意改变变量类型的做法不仅会增加代码的维护难度,更会在使用时造成很大的混淆,所以在定义和使用变量时,不要轻易地变动变量的类型。
1.2.3 字符串的常见用法
在1.2.2小节的样例代码中,我们是通过双引号定义了一个字符串。下面通过范例程序PythonStrDemo.py来演示字符串的基本用法。
1 # !/usr/bin/env python 2 # coding=utf-8 3 str='My String' 4 print(str) # 输出完整字符串 5 print(str[0]) # 输出第1个字符M 6 print(str[3:9]) # 输出第3至第9个字符串,即String 7 print(str[3:]) # 输出第3至最后的字符串,也是String 8 print(str * 2) # 输出字符串2次,但这种写法不常用 9 print("He"+"llo") # 字符串连接,输出Hello
比起之前的代码,在本范例程序的第1行指定了执行Python的命令。
在Windows的MyEclipse中,是通过“Run As”的方式运行Python代码,但如果这段程序放入到Linux等其他操作系统中,就需要指定执行这段代码的Python命令,这里通过/usr/bin/env目录下的“python”命令执行本Python脚本程序。
在第3行中定义了一个字符串(注意这里用的是一对单引号,在Python语言中,成对的单引号和成对的双引号都可以用来定义字符串常量),随后在第4行到第9行中,以各种方式输出了字符串。请注意,在第5行到第7行中,用到了字符串的下标(或称为索引),而下标值是从0开始的。在第9行中是通过“+”运算符拼接了字符串。
此外,Python还提供了查找替换等字符串操作的方法,在下面的PythonStrMore.py范例程序中,可以看到平时项目中针对字符串的常见用法。
1 # !/usr/bin/env python 2 # coding=utf-8 3 4 Print("Hello 'World'") # 双引号单引号夹杂使用 5 print ('Hello "World"') # 单引号里套双引号 6 print ("Hello: \name is Peter." ) # \n是换行符 7 print (r"Hello \name is Peter." ) # 加了前缀r,则会原样输出 8 str="123456789" 9 print (str.index("234")) # 查找234这个字符串的位置,返回1 10 #print (str.index("256")) # 没找到则会抛出异常 11 print (str.find("456")) # 查找456所在的位置,返回3 12 print (str.find("256")) # 没找到,返回-1 13 print (len(str) ) # 返回长度,结果是9 14 print (str.replace("234", "334")) # 把234替换成334
前面讲过,在Python语言中,可以通过单引号定义字符串,在上述第4行和第5行中的代码里,演示了两种符号混合使用的效果。对此的建议是,在同一个Python项目中,如果没有特殊的需要,最好用统一的风格来定义字符串,比如都用单引号或都用双引号。如果确有必要混合使用,那么需要通过注释来说明。
在第6行中,是输出“Hello \name is Peter.”这个字符串,但由于\n是换行符,因此中间会换行,输出效果如下所示。因为“\”是转义字符,如果不想转义,则可以像第7行那样,在字符串之前加r。
1 Hello: 2 ame is Peter.
从第9行到第12行的程序语句分别通过index和find来查找字符串,它们的差别是,通过index方法如果没找到,则会抛出异常,而find则会返回-1。这两种方法的相同点是:如果找到,则返回目标字符串的下标(或索引)位置。
在第13行和第14行的程序语句中,演示了计算字符串长度和字符串替换的方法,上述代码同样是通过注释给出了运行结果,读者可以自己运行,并在控制台中对比一下运行结果。
1.2.4 定义函数与调用函数
为了提升代码的可读性和维护性,需要把调用次数比较多的代码块封装到函数中。函数(Function)在面向对象的程序设计中也叫方法(Method),在Python语言中,可以通过def来定义函数或方法,并且在函数名或方法名之后加冒号。
在下面的PythonFuncDemo.py范例程序中,演示了定义和调用带有返回值和不带返回值函数的两种方式。
1 # !/usr/bin/env python 2 # coding=utf-8 3 # 定义没返回的函数 4 def printMsg(x,y): 5 print ("x is %d" %x) 6 print ("y is %d" %y) 7 # 通过return返回 8 def add(x,y): 9 return x + y 10 11 # 调用函数 12 printMsg(1,2) 13 # printMsg("1",2) # 报错,这就是不注意参数类型的后果 14 print (add(100,50))
在第4行到第6行的代码中,通过def定义了printMsg函数,它有两个参数。在Python语言中,没有像其他程序设计语言那样通过大括号的方式来定义函数体,而是通过像第5行和第6行的缩进方式来定义函数体内部的语句块。在这个函数内部的print语句中,通过%d、%x和%y方式来输出参数传入的x和y这两个值。
在第8行和第9行的add函数中,同样是通过缩进定义了函数的层次结构,其中使用了return语句来返回函数内部的计算结果。
定义好函数之后,上面的范例程序中分别在第12行和第14行调用了printMsg和add这两个函数。这个范例程序的输出结果如下所示,其中前两行是printMsg函数的输出,第3行是add函数的输出。
x is 1 y is 2 150
由于在定义Python变量时,无法通过像其他程序设计语言那样用int等变量数据类型声明的方式来指定变量的数据类型,因此在使用变量时尤其要注意,如果像第13行那样,调用函数时本来要传入整型参数,但却传入了字符串类型的参数,结果就会报错。