
1.3 Python基本语法介绍
下面先讲解Python的基础知识和语法,如果读者已经有使用其他语言编程的基础,理解这些内容将会非常容易,但由于Python本身的简洁设计,这些内容也十分容易掌握。
1.3.1 HelloWorld与数据类型
输出一行“Hello, World!”,在C语言中需要的程序语句是这样的:

而在Python里,可以用一行完成。

在Python中,每个值都有一种数据类型,但和一些强类型语言不同,并不需要直接声明变量的数据类型。Python会根据每个变量的初始赋值情况分析其类型,并在内部对其进行跟踪。在Python中内置的主要数据类型包括:
●Number,数值类型。可以是Integers(如1和2)、Float(如1.1和1.2)、Fractions(如1/2和2/3),或者是Complex Number(数学中的复数)。
●String,字符串,主要描述文本。
●List,列表,一个包含元素的序列。
●Tuple,元组,和列表类似,但是是不可变的。
●Set,一个包含元素的集合,其中的元素是无序的。
●Dict,字典,由一些键值对构成。
●Boolean,布尔类型,其值为True或False。
●Byte,字节,例如一个以字节流表示的JPG文件。
从Number中的int开始,使用type关键字获取某个数据的类型:

提示:不同于C语言使用/*..*/或者C++使用//的形式进行注释,Python中的注释通过“#”开头的字符串体现。注释内容不会被Python解释器作为程序语句。
int和float之间,Python一般会使用是否有小数点来做区分:


这里需要注意的是,将一个int与一个int相加将得到一个int。但将一个int与一个float相加则将得到一个float。这是因为Python会把int强制转换为float以进行加法运算:

使用内置的关键字进行int与float之间的强制转换是经常用到的:

Python 2中曾有int和long(长整数类型)的区分,但在Python 3中,int吸收了Python 2.x版本中的int和long,不再对较大的整数和较小的整数做区分。有了数值,就有了数值运算:

Python中还有相对比较特殊的分数和复数,分数可以通过fractions模块中的Fraction对象构造:

复数可以用使用函数complex(real, imag)或者是带有后缀j的浮点数来创建:

布尔类型本身非常简单,Python中的布尔类型以True和False两个常量为值:

不过Python中对布尔类型和if else判断的结合比较灵活,这些可以等到我们在实际编程中再详细探讨。
在介绍字符串之前,先对list(列表)和tuple(元组)做一个简单的了解,因为list涉及一个Python中非常重要的概念:可迭代对象。对于列表而言,序列中的每一个元素都在一个固定的位置上(称之为索引),索引从“0”开始。列表中的元素可以是任何数据类型,Python中列表对应的是中括号“[]”的表示形式。

列表切片(Slice)可以简单地描述为从列表中取一部分的操作,通过指定两个索引值,可以从列表中获取称作“切片”的某个部分。返回值是一个新列表,从第一个索引开始,直到第二个索引结束(不包含第二个索引的元素),列表切片的使用非常灵活:

向一个list中添加新元素的方法也很多,常见的包括:


这里要注意的是extend()接受一个列表,并把其元素分别添加到原有的列表,类似“扩展”。而append()是把参数(参数有可能也是一个列表)作为一个元素整体添加到原有的列表中。insert()方法会将单个元素插入到列表中。第一个参数是列表中将插入的位置(索引)。
从列表中删除元素,可使用的方法也不少:

元组(Tuple)与列表非常相似,最大的区别在于:元组是不可修改的,定义之后就“固定”了;元组在形式上是用“()”这样的圆括号括起来的。由于元组是“冻结”的,所以不能插入或删除元素。其他一些操作与列表类似:

提示:元素可修改与不可修改是列表与元组最大(或者说唯一)的区别,基本上除了修改内部元素的操作,其他列表适用的操作都可以用于元组。
在创建一个字符串时,将其用引号括起来,引号可以是单引号(')或者双引号("),两者没有区别。字符串也是一个可迭代对象,因此,与取得列表中的元素一样,也可以通过下标记号取得字符串中的某个字符,一些适用于list的东西同样适用于str:

集合的特点是无序且值唯一,创建集合和操作集合的常见方式包括:


字典(Dict)相对于列表、元组和集合,会显得稍微复杂一点。Python中的字典是键值对(Key-Value)的无序集合。在形式上也和集合类似,创建字典和操作字典的基本方式如下:

Python中的列表、元组、集合和字典是最基本的几种数据结构,但使用起来非常灵活,与Python的一些语法配合起来会非常简洁高效。掌握这些基本知识和操作是后续进行开发的基础。
1.3.2 逻辑语句
与很多其他语言一样,Python也有自己的条件语句和循环语句。不过Python中的这些表示程序结构的语句并不需要用括号(比如“{}”)括起来,而是以一个冒号作为结尾,以缩进作为语句块。if,else,elif关键词是条件选择语句的关键:

熟悉C/C++语言的人们可能很希望Python提供switch语句,但Python中并没有这个关键词,也没有这个语句结构。但是可以通过if-elif-elif-…这样的结构代替,或者使用字典实现。比如:

这段代码实现的功能是,输入一个运算符,再输入两个数字,返回其计算的结果。比如输入“+12”,输出“3”。这里需要说明的是,input()是读取屏幕输入的方法(在Python 2中常用的raw_input()不是一个好选择),lambda关键字代表了Python中的匿名函数,匿名函数不使用def关键字定义,其格式也与常见的def函数有所不同,匿名函数的格式为lambda args:expression,args代表了此函数接收的参数(可以有多个),expression代表此函数内部所执行的表达式,此表达式将被求值,并作为返回值返回。
Python中的循环语句主要是两种,一种的标志是关键词for,一种的标志是关键词while。
Python中的for循环接受可迭代对象(例如list或迭代器)作为其参数,每次迭代其中一个元素:

for还经常与range()和len()一起使用:

提示:如果想要输出列表中的索引和对应的元素,除了上面的方法之外,还有更符合Python风格的用法,如enumerate()方法等,有兴趣的读者可自行了解。
while循环的形式如下:

语句while_suit_codes会被连续不断地循环执行,直到表达式的值为False,接着Python会执行下一句代码。在for循环和while循环中,也会使用到break和continue关键字,分别代表终止循环和跳过当下循环开始下一次循环:

说到循环,就不能不提列表解析(或者翻译为“列表推导”),在形式上,是将循环和条件判断放在了列表的“[]”初始化中。举个例子,构造一个包含10以内所有奇数的列表,使用for循环添加元素:

使用列表解析:

这种“推导”(解析)也适用于字典和集合。这里没有说“元组”,是因为元组的括号(圆括号)表示推导时会被Python识别为生成器,关于生成器的具体概念,可以见本书7.1.2节。一般如果需要快速构建一个元组,可以选择先进行列表推导,再使用tuple()将列表“冻结”为元组:

Python中的异常处理也比较简单,核心语句是try…except…结构,可能触发异常产生的代码会放到try语句块里,而处理异常的代码会在except语句块里实现:

异常处理语句也可以写得非常灵活,比如同时处理多个异常:

有时候,在异常处理中会使用finally语句,而在finally语句下的代码块不论异常是否触发,都将会被执行:

1.3.3 Python中的函数与类
在Python中,声明和定义函数使用def(代表“define”)语句,在缩进块中编写函数体,函数的返回值用return语句返回:

如果没有显式的return语句,函数会自动返回None。另外,也可以使函数一次返回多个值,实质上是一个元组:

对于暂时不想实现的函数,可以使用“pass”作为占位符,否则Python会对缩进的代码块报错:

pass也可用于其他地方,比如if和for循环:

在函数中可以设置默认参数:


当有多个默认参数时会自动按照顺序逐个传入,也可以在调用时指定参数名:

在Python中类使用“class”关键字定义:

定义好类后,就可以根据类创建出一个实例。在类中的函数一般称为方法,简单地说,方法就是与实例绑定的函数,和普通函数不同,方法可以直接访问或操作实例中的数据。
提示:Python中的方法有实例方法、类方法、静态方法之分,这部分是Python面向对象编程中的一个重点概念。但是这里为了简化说明,统一称之为“方法”或者“函数”。
类是Python编程的核心概念之一,这主要是因为“Python中的一切都是对象”,一个类可以写得非常复杂,下面的代码就是requests模块中Request类及其__init__()方法(部分代码):


1.3.4 更深入了解Python
Python语言简洁而明快,涵盖广泛却又不显烦琐,其受到越来越多开发者的欢迎,关于Python的入门学习和基础知识资料也越来越多,如果想系统性地打好Python基础,可以阅读Dive into Python和Learn Python the Hard Way等书籍,如果已经有了一定掌握,想要获得一些相对“高深复杂”的内容介绍,可以参考Python the Cookbook和Fluent Python等资料。但无论选择哪些材料作为参考,不要忘了“learn by doing”,有句俗话说“光说不练假把式”,一切都要从代码出发,从实践出发,动手学习,这样才能取得更大的进步。