第2章
Python基础知识
世界上大多数计算机语言是C-like语言,其基础语法与C语言非常相似。Python是C-like语言的一种,同时又是一门解释型语言。Python的设计原则是优雅、简单,所以Python有不少同C语言差异较大的语法规则。基于此,本章将全面介绍Python的基础知识,包括固定语法、运算符、数据类型、输入输出操作及文件I/O等。
2.1 固定语法
正如每种自然语言都有各自的语法,计算机语言同样依赖语法规则支撑起自身体系。编程基本规范由一些简明的语法确定,可以称之为固定语法。Python固定语法与多数编程语言相似,但也有其特殊之处,正是这些特殊之处形成了Python语言的特色。本节主要介绍的内容包括:声明、注释、缩进、多行语句、保留字符和赋值等。
2.1.1 声明与注释
1.声明
在Python的2.x版本中,默认的编码格式是ASCII格式。ASCII是一种单字节的编码,编码技术在起步时期只使用英文字符,使用单字节足以表示所有的英文字符及控制符号,总共256个字符。源代码文件只要用到非ASCII字符,必须在文件头部进行字符编码声明。在字符编码声明中,Python只检查“#”“coding”和编码字符串,其他字符是可变的。
ASCII最多只能表示256种字符,因此产生了无法回避的问题:不足够表示国际上众多的字符。Unicode(万国码)在1994年应运而生,这种统一编码规定了每个字符的对应关系,UTF-8、GB2312等常用的编码格式就是按照Unicode规定的。
Python升级到3.x版本后,默认编码格式变更为UTF-8。在这一格式下,世界上大多数语言的字符可以得到准确的编译,一般不需要做字符编码声明。多数情况下,系统通过Python执行文件不会出错。但如果编辑器不支持UTF-8格式的文件,或者后来又使用了其他的编码格式,Python就无法自动识别脚本文件,会造成程序执行出错。这时,对Python脚本文件进行编码声明就显得尤其重要了。
要为源文件指定特定的字符编码格式,需要在文件的首行或第2行插入一行注释,称为编码声明。这一声明必须放在首行或第2行的原因是:注释行都是以#号开头的,不会被机器编译。编码声明虽然不属于注释行,但同样以#号开头,可能会被机器误识别为注释,只有放在首行或第2行的位置,才能被机器正常识别并编译。编码声明的格式如下。
通过这一声明,源文件中的所有字符都被当作coding指代的UTF-8编码对待。
编写Python脚本时,除声明编码格式外,常常也会加上一个路径声明。路径声明的格式如下。
路径声明指出了系统执行py文件时,调用的是/usr/bin下的Python解释器。路径声明一般放在脚本首行。
2.注释
代码的注释是指使用文字对代码进行说明,注释只用于向编程人员展示代码信息,编译器则自动忽略注释的内容。在代码中添加注释可提高程序的可读性,注释中包括了程序的逻辑结构信息,可以帮助程序员更好地阅读和理解程序。在实际的编程工作中,常常需要浏览成千上万行晦涩难懂的代码,如果代码中缺少合理的注释,即使是作者本人在一段时间之后也未必能轻易理解每行代码的含义。因此,对代码进行合理的注释是一种良好的编程习惯。
Python中对代码注释的方法包括单行注释和多行注释。
单行注释以#号开头,#号后到换行前之间的所有字符都是注释部分,如下所示。
编程中常常有多行注释的需求,多行注释同样可以使用#号,在每一行前都需要加上#号。使用#号进行多行注释如下所示。
虽然上述方法足以进行多行注释,但Python中还有一种更加方便、优雅的多行注释方法,即通过3个单引号(′′′)或3个双引号(″″″)将注释对象括起来。使用引号进行多行注释时,需要保证前后使用的引号类型一致。使用3个引号进行注释,如下所示。
2.1.2 缩进与多行语句
1.缩进
代码行首的空白称为缩进,可用4个空格或制表符创建。Python的一大特色就是用缩进的方式标识代码结构,而Java和C++等语言则使用大括号{}。Python使用缩进标识代码结构的方式使得代码更加简洁优雅。
使用缩进方式标识代码结构时,同一代码块内的语句必须有相同的缩进空格数,否则就会出错。缩进的长度没有硬性要求,保持同层次结构一致即可,但也推荐使用4个空格进行缩进。正确的缩进方式如代码清单2-1所示。
缩进空格数不一致,会导致代码运行出错,如代码清单2-2所示。
2.多行语句
编写代码时,通常应在一行内完成一条语句,但太长的语句显得冗长,可读性差。用反斜杠()可以实现长语句的换行,且不会被机器识别成多个语句,如代码清单2-3所示。
需要注意,在[]、{}、()等不同括号内,多行语句换行时不需要使用反斜杠(),直接换行即可,如代码清单2-4所示。
除了将一个语句拆分为多行外,Python也支持在一行中实现多个语句,这通常只用于多个短语句。在一行中实现多个语句需要使用分号(;)将短语句隔离,如代码清单2-5所示。
2.1.3 保留字符与赋值
1.保留字符
Python中的标识符是指变量、函数、类、模块及其他对象的名字,可以包含字母、数字和下划线(_),但必须以非数字字符开始。特殊符号,如$、%、@等,不能用在标识符中。标识符对大小写敏感,比如“UFO”和“ufo”就是两个不同的对象。
保留字符即关键字,是编程语言中已经定义过的字符。输入查询保留字符的指令,即可获取保留字符名单。Python不允许将保留字符用作标识符,这些字符不能再作为一般标识符。在代码中使用保留字符,可能会提示错误。保留字符的查询及“保留”的意义如代码 清单2-6所示。
2.赋值
Python中的赋值方式有4种,除最基本的赋值形式外,还有序列赋值、链接赋值和增量赋值等方式。
赋值的最基本形式是以等号(=)为连接,将要赋值的变量放在等号左侧,将要赋给的值放在等号右侧,如代码清单2-7所示。
序列赋值的基本形式是将多个变量排列成变量序列,变量之间使用逗号相连,使用等号作为赋值符号,后接值序列,值之间用逗号相连。序列赋值在变量序列与值序列之间建立了依次映射的关系,其基本形式如代码清单2-8所示。
链接赋值的基本形式是将多个变量用等号相连,在末个变量后用等号连接一个赋值。链接赋值只适用于给多个变量赋予同一值的情况,又称为多目标赋值,其基本形式如代码清单2-9所示。
增量赋值,又称为增强赋值,其基本形式是将原始赋值语句改写,去掉赋值符号右侧变量,将赋值符号右侧运算符挪至赋值符号左侧,形成新的运算式。增量赋值需要通过赋值运算符实现,Python的赋值运算符将在2.2.2节介绍。增量赋值是赋值运算式的“增量写法”,通过声明变量、增量方式和增量数值完成赋值(如运算式“x=100”,其变量是x,增量方式是,增量数值是100)。
增量赋值的优势在于可以减少输入代码的工作量,其基本形式如代码清单2-10所示。
2.2 运算符
运算这一概念起源于数学,即通过运算法使参与运算的元素得出确定且可重复的结果。作为计算机的核心功能,运算架构起计算机系统的逻辑体系。计算机运算并不局限于普通的数学计算,它更贴近于“逻辑推算”这一概念,其根本目的就是实现逻辑推算。
运算符是运算法则的具体体现。Python提供了算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符、身份运算符和成员运算符7类运算符,从而实现了丰富多样的运算功能。
2.2.1 算术运算符
算术运算符是对运算数进行算术运算的一系列符号,能够满足一般的运算需求。Python中的算术运算符如表2-1所示。
算术运算结果的数字类型与运算数的类型有关。进行除法(/)运算时,不管商为整数还是浮点数,运算结果始终为浮点数。要得到整型的商,需要用双斜杠(//)做整除,且除数必须是整型的。对于其他的运算,只要任一运算数为浮点数,运算结果就是浮点数。Python算术运算的基础使用方法如代码清单2-11所示。
2.2.2 赋值运算符
赋值运算符用于变量的赋值和更新。Python的赋值运算符除基础赋值运算符(=)外,还包括加法赋值运算符、减法赋值运算符等。严格地说,除基础赋值运算符外,其他都属于特殊的赋值运算符。Python中的赋值运算符如表2-2所示。
表2-2中的特殊赋值运算符可以看作变量的快速更新,更新意味着该变量是存在的,而对于一个之前不存在的变量,不能使用特殊的赋值运算符。Python赋值运算的基础使用方法如代码清单2-12所示。
2.2.3 比较运算符
比较运算符用于对比数之间的大小或是否相等。Python中的比较运算符如表2-3所示。
比较运算符也可用于字符之间的比较。Python中的字符使用ASCII编码,每个字符都有属于自己的ASCII码,字符比较的本质是字符ASCII码的比较。Python比较运算的基础使用方法如代码清单2-13所示。
2.2.4 逻辑运算符
逻辑运算即判断事物之间的“与”“或”“非”关系,Python中的逻辑运算符包含and、or、not,如表2-4所示。
Python逻辑运算的基础使用方法如代码清单2-14所示。
2.2.5 按位运算符
十进制数被人们广泛使用,但对于计算机而言,二进制数反而是更重要的,计算机的一切计算都建立在二进制数计算的基础上。按位运算是一种将十进制数转为二进制数再进行运算的过程。Python中的位运算符如表2-5所示。
Python按位运算的基础使用方法如代码清单2-15所示。
在按位运算中,取反运算较难理解,因为涉及补码的计算。
十进制数的二进制原码包括符号位和二进制值。以“60”为例,其二进制原码为“00111100”,第1位为符号位,0代表正数,1则代表负数。正数的补码与二进制原码相同,负数的补码则为二进制原码符号位保持不变,其余各位取反后再在最后一位上加1。
取反操作可以总结为以下5个步骤。
1)取十进制数的二进制原码。
2)对原码取补码。
3)补码取反(得到最终结果的补码)。
4)取反结果再取补码(得到最终结果的原码)。
5)二进制原码转十进制数。
2.2.6 身份运算符
身份运算符用于比较两个对象的储存单位,如表2-6所示。
Python身份运算的基础使用方法如代码清单2-16所示。
在身份运算中,内存地址相同的两个变量进行is运算时,返回True;内存地址不同的两个变量进行is not运算时,返回True。当a、b获取到一样的值时,两个变量就获取同样的内存地址。
2.2.7 成员运算符
成员运算符的作用是判断某个指定值是否存在某一序列中,包括字符串、列表和元组,如表2-7所示。
Python成员运算的基础使用方法如代码清单2-17所示。
2.2.8 运算符优先级
在Python中,运算符操作很常见,运算通常以表达式的形式进行。表达式由运算符和运算数组成,比如“1+2”就是一个表达式,其中的“+”是运算符,“1”和“2”则是运算数。一个表达式往往包含不止一个运算符,当一个表达式中存在多个运算符时,就需要考虑运算的顺序,即运算符的优先级。
运算符的优先级如表2-8所示,优先级从上往下依次降低,同一优先级的运算符按从左到右的顺序进行运算。
运算符优先级的基础使用方法如代码清单2-18所示。
2.3 数据类型
计算机内部的所有数据都可以看作对象,变量在程序中起到指向数据对象的作用,变量赋值其实是把数据对象和变量关联起来的过程。Python中的常用数据量类型有6种:number、str、list、tuple、dict和set。其中,number和str属于基础数据类型,而list、tuple、dict和sets属于复合数据类型。
2.3.1 基础数据类型
1.number
number又称数字,是专门用于储存数值的数据类型,具有不可改变性。数据的不可改变性意味着:每改变一个数据的类型,计算机就分配内存空间以创建新的对象,解释器则基于数据的类型分配指定的内存,决定什么样的数据可以被储存在内存中。要“改变”不可改变的数据类型,只能通过创造新变量的间接方式。number既是复合型数据中的基本元素,也是数学计算的基本元素,计算机的一切数学计算工作都离不开它。
Python支持4种不同的数字数据类型,如表2-9所示。
int只有整数部分,即整型数。int仅表示广为使用的十进制整数,如果需要用到二进制数、八进制数和十六进制数,需要分别通过bin函数、oct函数和hex函数进行创建或转换。在Python 2中,用long表示长整型数,其特征是以L为后缀。长整型数和短整型数同属于整数,区别在于:短整型数的范围是[-2417483648,2417483647],长整型数的范围是[-263,263-1]。Python 3不再保留长整型数,以int统一表示整数。
float是既有整数部分也有小数部分的数值类型,即浮点型数字。
complex是由实部(real)和虚部(imag)组成的数值类型,即复数。复数的实部和虚部都是浮点数。
bool表示布尔值,只有True(1)和False(0)两种取值。因为bool继承了int类型,所以True可以等价于数值1,False可以等价于数值0,bool值可以直接用于数学运算。
给变量指定一个数值时,number对象就被创建,并在内存中分配储存空间。通过type函数可以判断number对象的类型。number创建和查询类别的方式如代码清单2-19所示。
不同number类型通过函数可以互相转换,使用代表number类型的函数即可。也可以进行混合运算,运算时先自动转换成同一类型,然后再进行运算。转换遵守一定的方向:int向f?loat转换,非complex向complex转换,如代码清单2-20所示。
2.str
str又称为字符串,是存放着Unicode字符序列,用于表示文本的数据类型。str可以由任何字符构成,包括字母、数值、符号或标点符号以及它们的任意组合,如“Hello,word!”“1+1”等。与number相同的是,Python中的str也是不可变的,无法直接修改str中的某一位字符。
创建一个str,除字符外,还要在字符序列的首尾加上引号。使用单引号(')、双引号('')是等效的,但需要保证str两端的引号类型相同。如果要指定一个多行的str,则需要使用三引号(''')。
str支持索引,索引一般按照“变量[下标]”和“变量[头下标:尾下标]”两种格式处理,其中的“变量[下标]”格式能够索引单个数值,“变量[头下标:尾下标]”格式能够进行切片(索引连续一片元素)。索引的具体规则如下:
1)下标为正数时,最小为0,表示第1位。下标最大为总字符数减1,表示最后一位。
2)下标为负数时,下标最小为总字符数的相反数,表示第1位。尾下标最大为-1,表示最后一位。
3)当进行切片时,索引从头下标位置字符开始,到尾下标位置前一位字符终止。
4)在一个索引式中,头下标与尾下标可以异号,但必须保证头下标字符位置在尾下标字符之前。
5)头下标留空,表示索引从第1个字符开始;尾下标留空,表示索引到最后一个字符结束。
除一般的索引格式外,str还支持按步长索引,即指定步长后,每隔固定的步数索引一次字符,其格式为“变量[头下标:尾下标:步长]”。此外,通过“变量[::-1]”这一索引式可以将整个str反向排序。
str索引的基本操作如代码清单2-21所示。
str的索引方式对Python中其他支持索引的数据类型都具有参考价值。
尽管str不可变,但它其实有很好的可操作性。Python为str提供了极为丰富的内置方法,从而能实现多样化的操作。
str中的所有方法中部分是用于查询的,这些方法包括检查str中是否包含某个对象,是否只包含某个对象,某个对象是否在特定的位置,以及包含某个对象的个数。提供查询功能的str方法如表2-10所示。
str查询相关的方法操作方式如代码清单2-22所示。
str方法除查询外,还有对str进行改写等操作的方法。改写主要有两种形式:对str中的制表符、空格等符号进行增删,且改变str的总长度;针对str中的字母,进行大小写调整或替换。str改写方法如表2-11所示。
str改写相关方法进行简单操作,如代码清单2-23所示。
除查询与改写外,str方法还提供了一些其他功能,如表2-12所示。
str其他方法操作示例如代码清单2-24所示。
转义输出是str操作中重要的内容,需要用到转义字符。Python中常用的转义字符如表2-13所示。
除转义输出外,还可以使用+号与*号分别实现str的连接和重复操作。
str的转义及连接、重复等基础操作如代码清单2-25所示。
2.3.2 复合数据类型
计算机语言中的容器是指根据某种方式组合数据元素形成的数据元素集合。Python中的容器包含序列、映射和集合,几乎所有的Python容器都可以归结为这3类。
序列是数据对象的有序排列,数据对象作为序列中的元素被分配了一个位置编号(索引),序列相当于数学中数列的概念。Python中的序列包括str、list、tuple、Unicode字符串、buffer对象等,其中的str、list、tuple最为常用。
映射是包含一组键(key)和值(value)以及映射关系的容器,字典(dictionary)是Python中唯一的映射类型,字典中的每个元素都存在相应的名称(称为键)与之一一对应。字典相当于由带有各自名称的元素组成的集合,与序列不同的是,字典中的元素并没有排列顺序。
在集合类型数据中,集合中的元素不能重复出现,当中的元素是唯一的,元素间不存在排列顺序,Python中的集合相当于数学中的集合概念。集合类型包括可变集合(set)与不可变集合(frozenset)。
1.list
list又称为列表,属于序列类数据,是包含0或多个对象引用的有序序列。由于list中所有的数据项都是对象引用,因此list可以存放任意数据类型的数据项,既可以是int、f?loat、str等这种基础数据类型,也可以是list、tuple、dict等这一类的复合数据类型。list是Python中最通用的复合数据类型。
list可以用方括号“[ ]”创建:空的方括号创建空的list;包含多个项的list可以在方括号中使用逗号分隔的项序列创建。也可以通过list函数创建,list函数最多接收一个参数;不带参数调用函数时返回空list;带参数时返回参数的浅拷贝(在有指针的情况下,浅拷贝只是增加了一个指针,指向已经存在的内存);对复杂参数(非基本元素,如复合数据类型)则尝试将给出的对象转换为list。list的创建如代码清单2-26所示。
索引、连接及重复操作是灵活运用list这一数据类型的基础。list的这3种操作的方式和str对应操作类似,如代码清单2-27所示。
Python为list提供了一些内置方法,可以实现list的查询、增删和排序等功能,如表2-14所示。
表2-17所示的方法使用示例如代码清单2-28所示。
2.tuple
tuple又称元组,与list同属于序列类数据,是包含0个或多个对象引用的有序序列。与list不同的是,tuple是不可更改的数据类型。
tuple可以用圆括号( )创建:空的圆括号创建空的tuple;包含一个或多个项的tuple可以使用逗号分隔开元素;如果tuple内只包含一个元素,需要在元素后加上逗号予以区分。有时,tuple必须被包含在圆括号中以避免语义二义性。例如,要将tuple(1,2,3)传递给一个函数,应该写成function((1,2,3))的形式,以免被识别成“1,2,3”这3个数字变量。创建tuple的方法如代码清单2-29所示。
tuple支持索引,其索引方式与str、list类似。与list相同的是,tuple也可以进行连接、重复操作;与list不同的是,tuple中的元素无法做增删操作,只能使用del函数删除整个tuple。tuple基本操作如代码清单2-30所示。
Python为tuple提供的内置方法较少,主要用于查询,如表2-15所示。
tuple内置方法的基本使用如代码清单2-31所示。
3.dict
dict又称字典,属于映射类数据。dict通过键而不是位置来索引。键是不可变对象(如number、str、tuple)的对象引用,值是可以指向任意类型对象的对象引用。dict是Python中唯一一种映射数据类型,具有可变性,dict的长度可以增大或减小,如同list一样。dict的值可以无限制地取任何Python对象,既可以是Python内置的标准数据,也可以是用户定义的。同一个键不允许出现两次,创建dict时如果同一个键被赋值两次,只有后一个值会被记住。键固定不变,所以只能用number、str或tuple充当。注意,可变的数据类型不能充当dict中的键。
dict可以用花括号{}创建:使用空的花括号创建空的dict;非空的花括号包含一个或多个逗号分隔的项,每个项包含一个键、一个冒号以及一个值。通过dict函数也可以创建dict:不带参数时返回一个空的dict;带一个映射类型参数时返回以该参数为基础的dict,当参数本身为dict时返回该参数的浅拷贝;也可以使用序列型参数,前提是序列中的每个项是包含两个对象的序列,第1个作为键,第2个作为值。创建dict,如代码清单2-32所示。
dict的主要索引方式是通过键索引值,这与str等变量截然不同。通过dict的索引功能,可以实现dict的查改增删,且不需要用到Python提供的内置方法,如代码清单2-33所示。
Python为dict提供了丰富的内置方法,通过内置方法也可以实现查询、增删和创建,如表2-16所示。
dict的常用操作示例如代码清单2-34所示。
4.set
Python中有两种内置集合类型:set(可变集合)和frozenset(不可变集合)。set是引用零个或多个对象的无序组合,所引用的对象都是不可变的,所有内置的固定数据类型(如f?loat、frozenset、int、str、tuple)都是不可变的。以下所指的集合都是set。
set可以使用花括号{}或set函数创建。使用花括号{}创建集合时使用{}包裹一个或多个项,项与项间用“,”分割;空的set无法用{}创建。使用set函数创建set时,不带参数时返回空set;带一个参数时返回参数的浅拷贝;带多个参数时,则尝试将给定的对象转换为set,如代码清单2-35所示。
set是可变的,但由于其中的项是无序的,因此没有索引的概念。set可变而无法索引,这使得它无法进行查询和修改元素的操作,但仍支持元素的增删,并可以清空和拷贝。set的常用操作基本都需要通过内置方法,如表2-17所示。
set常用方法示例如代码清单2-36所示。
set起源于数学,与数学集合相似,Python中的set也有子集、并集、交集、差集和对称差集等概念,并能进行集合运算,它们的定义和操作方法如表2-18所示。
set集合运算的基本操作方法如代码清单2-37所示。
2.4 Python I/O
计算机程序用于执行任务,是满足人类需求的工具。有信息的输入,程序才能接收指令、理解需求;有信息的输出,运行结果才能被反馈给用户。在编程中,信息输入操作称为Input,输出操作称为Output,统称为Input/Output,简写为I/O。
相比其他语言,Python中的I/O操作更加简单方便,通过简单的指令就可以实现基本的输入输出。此外,I/O并不仅仅指信息键入和打印信息,还包括文件的输入输出。
2.4.1 input与print
1.input
input函数在用于交互式的信息键入时,相当于一个容器,用户从键盘输入的信息先存放在容器中,再被变量引用。
input函数可以接纳多种数据类型,包括number、str等基础类型,及list、tuple、dict、set等复合类型。使用input函数时,可以在括号内添加str以提示输入。需要注意的是,Python 3.x中的input函数将所有接收的数据都默认为str,如代码清单2-38所示。
从代码清单2-38的输出结果可知,在str1变量中,尽管输入的不是str,也被默认为str。要得到需要的数据类型,必须做类型转换。
2.print
给一个变量赋值后,如需查询变量的内容,只需要键入变量名并按回车键即可,称为表达式语句的输出。使用print函数是更受欢迎的输出方式,可以实现多样化的输出操作。
使用print函数进行输出操作时,可以在函数的括号中插入str以向屏幕上输出指定的文字,比如打印“hello,world!”的程序;要输出被赋值的变量,则在print函数的括号中插入变量名即可。
print函数也可以接收多个str,需要用逗号隔开,print函数会依次打印每个str,遇到逗号则输出一个空格,因此输出的str是拼起来的。print函数也可以自动计算结果,运行“print(number1+number2)”语句,解释器会自动计算出相加的结果后输出。print函数的应用如代码清单2-39所示。
格式化输出是计算机输出中的一个重要概念,主要针对str。其运行机制为:使用占位符在str中进行占位,再用数值或字符替换占位符,重组str后输出。这种输出方法主要是为了方便修改语句,减少编写代码的工作量,并且包含自动取位、转换进制等功能。Python中的格式化输出方法有两种,即“%+格式符”的方法和format函数方法。
“%+格式符”的方法是一种较早的格式化输出方法,使用方式是在百分号(%)后加上相应的格式符以占位,再进行替换和输出。Python中的格式符如表2-19所示。
由表2-19可知,Python中的格式符可分别用于str、整数和f?loat输出。使用“%+格式符”的方法进行格式化输出,如代码清单2-40所示。
format函数是更为强大的格式化输出工具,format函数收集位置参数和关键字参数的任意集合,使用它们的值替换str中的占位符。该方法使用大括号({})作为特殊字符代替%,{}中可以不带参数、带数字编号或带关键字编号进行占位和替换,前两种属于位置替换方法,后一种属于关键字替换方法。
format函数也支持格式符,如表2-20所示。
使用format函数进行格式化输出的基本操作,如代码清单2-41所示。
2.4.2 文件I/O
1.open
内置函数open的作用是打开一个文件,创建一个f?ile对象以进行调用。在打开文件的基础上,后续的文件读写操作才可以实现。open函数的基本语法格式如下:
open(filename, mode)
open函数常用的参数及其说明如表2-21所示。
filename表示包含要访问的文件名称。mode决定打开文件的模式,这个参数是非强制的,默认的文件访问模式为只读(r),其可取值如表2-22所示。
2.read
在Python中,读取文件的内容需要以只读的模式先打开一个文件,可以用open函数传入文件名和模式标识符,再用read函数读取文件中的内容。read函数可以从打开的文件中一次性读取全部内容,内容被读取到内存并用一个str对象表示。read函数的基本语法格式如下:
f = open(filename, mode)
f.read(size)
read函数常用的参数及其说明如表2-23所示。
表2-26中,size表示要从文件中读取的字节数,该方法从文件的开头开始读入,每调用一次就读取size个字节的内容。如果没有传入size,程序会尝试尽可能多地读取内容,一直到文件的末尾。
使用read函数读取test.txt文件,并打印,如代码清单2-42所示。
3.write
在Python中,写入文件和读出文件的操作方式是相似的:先调用open函数并传入标识符‘w’或‘wb’,再使用write函数进行写入。write函数的基本语法格式如下:
f = open(filename, mode)
f.write(str)
write函数常用的参数及其说明如表2-24所示。
write函数可将任何str写入打开的文件。需要注意,Python中的str可以是二进制数据,而不限于文字。要写入str以外的内容,要先将需写入的内容转换成str。
使用write函数写入文件的操作如代码清单2-43所示。
4.close
close函数可以刷新缓存里任何还没写入的信息并关闭文件,关闭之后的文件便不能再进行写入。使用完文件后应该关闭,关闭文件的本质是使文件指针与文件脱离,关闭后不再能通过该指针对原来与其联系的文件进行操作。如果文件使用完后不关闭,文件对象会一直占用操作系统的资源,并且,操作系统同一时间能打开的文件数量是有限的。写入文件时,数据会占用操作系统的内存,待计算机空闲时再慢慢写入,不调用close函数的后果是数据可能只写一部分到磁盘中,其他的信息则丢失了。
close函数的基本语法格式如下:
fileObject.close()
close函数常用的参数及其说明如表2-25所示。
本节的各代码清单中,都需要在末尾使用close函数关闭文件,以保证信息的完整。
小结
Python可以实现快速开发,是最适合于机器学习的工具。本章介绍了利用Python进行编程的入门知识,主要内容如下:
1)固定语法主要介绍了Python的基本操作,包括声明、注释、缩进、多行语句、保留字符与赋值等。
2)运算符部分主要介绍了算术运算符、比较运算符、赋值运算符、按位运算符、逻辑运算符、成员运算符和身份运算符7类运算符的使用方法,并介绍了多个运算符时的优先级。
3)基础数据类型主要介绍了number和str两种数据类型,其中number包括int、float、bool、complex;str由引号标识,操作方式多样且灵活。
4)复合数据类型主要介绍了list、tuple、dict和set,需要注意各种数据类型之间的异同点,以及每种类型的基础操作。
5)交互式的输入操作主要介绍了基础I/O和文件读写。基础I/O部分说明了input函数的用法、输入数据类型和print函数的输出格式化。文件读写则说明了open、read、write、close四个函数分别实现打开、读取、写入、关闭操作。
课后习题
1.选择题
(1)下列关于注释的说法正确的是( )。
A.单行注释只能使用#号创建
B.多行注释只能使用#号创建
C.使用引号创建注释,须保证前后引号数目相同,类型不必一致
D.注释的主要目的在于使代码美观
(2)下列关于运算符的说法正确的是( )。
A.算术运算符包括加、减、乘、除这4种
B.运算符“=”和运算符“==”是等效的
C.逻辑表达式x or y,x为False,则返回x
D.指数运算符的优先级最高
(3)下列关于数据类型的说法正确的是( )。
A.由于str是不可变的数据类型,因此只有很少的内置方法
B.使用list.pop()可按对象删除list中的元素
C.只包含一个元素的tuple必须带上一个逗号
D.dict无法实现索引
(4)下列关于变量的说法不正确的是( )。
A.Python 3中主要的整数数据类型有int和long
B.Python不支持查询str中某个字符的位置
C.list可以存放任意数据类型,这是因为其内部的数据项都是对象引用
D.set引用的对象只能是不可变的
(5)下列关于文件操作的说法正确的是( )。
A.open函数的w模式表示只读打开,只能在文件存在的情况下使用这一模式
B.使用read函数读取文件时,如果不设置读取字节数,程序将尝试读取所有内容
C.write函数可将任何str及数字写入打开的文件
D.操作文件后必须使用close函数关闭是为了信息安全
2.填空题
(1) 实现多行语句需要使用,但在、、内的长语句使用逗号即可。
(2)同一优先级运算符的运算顺序是。
(3)str内置方法的功能集中在和两个方面。
(4)dict无法使用str式的索引格式,但支持的形式。
(5)文件在读写操作后必须,以避免信息保存不完整。
3.操作题
(1)编写可运行的代码,声明格式为“UTF-8”,计算的运算结果是否在list[18,20,54]中。
(2) 使用两种方法创建一个list,包含10086、10000、10010、中国移动、中国电信、中国联通这6个元素。
(3)使用两种方法创建一个tuple,包含China、Chinese、960、56、中国这5个元素。
(4)使用两种方法创建一个dict,键为中国、美国,对应的值为China、America。
(5)使用两种方法创建一个set,包含China、America、Russia、Germany、France。
(6) 读取test.txt文件,根据读取的内容,做出解答,然后在该文件末尾追加解答结果,并关闭文件。