3控制语句与函数
python中的控制语句主要有条件判断if、while、和for语句,还有与之搭配的 else,elif,
break, continue和pass语句。
条件分支
1.基本的if语句
最基本的if语句包含一个用于条件判定的布尔表达式,由布尔表达式的结果选择接下来会发生什么。
2. if-else 语旬
if-else语句是对基本if语句的形式稍作变化得到的,使得布尔表达式的值为假时也能执行一些操作
如果把if(c == 1)写成 if(c = 1) ,它会发生语法上的错误,Python不允许在if条件中赋值,所以如果if(c = 1),那么Python会自动报错。
3.elif 语句(即else-if语句的缩写)
elif 语句是Python的else-if语句,它检查多个表达式是否为真,并在判断结果为真时执行特定代码块中的代码,和else不同的是,if语句后最多只能有一个else语句,但可以有任意数量的elif语句。
if语句在执行过程中,是从上往下进行判断,如果在某个判断上是True ,则执行该判断对应的语句,而后忽略剩下的elif和else。
循环
本节着重讨论两种循环,一种是 while循环,另一种就是for循环
- while循环
2.使用range函数生成序列
通常我们可以使用Python提供的内置函数range()很方便地生成一个数字的集合
range函数生成整数序列,由参数决定序列的大小和范围,它最多需要三个参数。
-
for 循环
for 循环依次把列表或元组中的每个元素迭代出来。
-
break语旬
-
continue 语句
-
pass 语旬
pass语句是无运算的占位符,当语法需要语句并且还没有任何实用的语句可写时,就可以使pass语句。
函数
调用函数
在调用函数之前,必须先创建它。你可以使用def关键字进行函数的定义,可以当前脚本中定义,也可以通过在一个模块文件中编写好该函数,然后导人需要使用该函数的文件。
在我们调用函数的时候,如果我们传入参数的数量不对,那么程序会报TypeError的错误。
如果我们传入参数的个数是正确的,但是传入的格式发生错误,那么程序依然会报TypeError错误,井且给出错误信息:str是错误的参数类型。
没有return语句的情况,有时候编写的函数没有return语句,这种不返回值的函数通常称为过程。
如果有多个return语句,第一个return语句将结束函数的执行。
定义函数
在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号,然后,在缩进块中编写函数体,函数的返回值用return语句返回。
总结:
其实这只是一种假象, Python函数返回的仍然是单一值:
多返回值是一个元组,但是在语法上,返回一个元组可以省略括号,而多个变量可以同时接一个元组,按位置赋给对应的值,所以Python的函数返回多值其实就是返回一个元组。
函数的参数
定义函数的时候,我们把参数的名字和位置确定下来,函数的接口定义就完成了。
Pytbon 的函数定义非常简单,但灵活度却非常大,除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数,使得函数定义出来的接口不但能处理复杂的参数,还可以简化调用者的代码。
-
位置参数
-
默认参数
如果我们经常计算平方,完全可以把第二个参数的默认值设定为2。
(注:一定是必填参数在前,默认参数在后,否则Python的解释器会报错)
有多个默认参数时,调用的时候,既可以按顺序提供默认参数,也可以不按顺序提供部分默认参数,当不按顺序提供部分默认参数时,需要把参数名写上。
3. 可变参数
可变参数就是传入的参数个数是可变的,可以是一个、两个或者任意多个,也可以是0个给定一组数字a,b,c …,请计算a2 +b2 +c2 (平方),要定义出这个函数,我们必须确定输入的参数,由于参数个数不确定,我们首先想到可以把a,b,c …作为一个列表或元组传进来。
4.关键字参数
可变参数允许传如0个或任意个参数,这些可变参数在函数调用时自动组装为一个元组而关键字参数允许你传人0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为个字典。
extra 表示把extra这个字典的所有key-value用关键字参数传入到函数的**kw参数,kw获得一个字典 ,注意kw获得的字典是extra份副本,对kw的改动不会影响到函数外的extra。
5.命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数,至于到底传入了哪些,就需要在函数内部通过kw查。
4类和继承
类和对象
类是面向对象编程的核心概念,面向对象程序设计是在面向过程程序设计的基础上发展而来的,比面向过程编程具有更强的灵活性和扩展性。
面向对象编程,是一种程序设计思想,作为程序的基本单元,一个对象包含了数据和操作数据的方法,OOP把计算机程序视为一组对象的集合,而每个对象都可以接收其他对象发过来的消息,并处理这些消息,计算机程序的执行就是一系列消息在各个对象之间传递,概括地讲,类的设计是为了创建和管理新的对象,并且它们也支持继承。
面向对象程序设计具有三大基本特征:封装、继承和多态
类和对象
Python中,类的建立使用了一条新的语句-class语句,所有数据类型都可以视为对象,当然也可以自定义对象,自定义的对象数据类型就是面向对象中的类的概念,把具有相同属性和方法的对象归为一个类。
Python 中使用c1ass保留字来定义类,类名的首字母一般要大写
Python中,每个内置的类、库类以及我们创建的每个类都直接或间接地从最顶层的基类object衍生而来,在子类中,任何方法都可能被重写,如果有MyDict (继承自dict的类)类的对象,并调用同时由dict与MyDict定义的方法,Python将正确地调用MyDict版本的方法,这也就是所谓的动态方法绑定,也称为多态性,如果我们在重新实现后的方法内部调用该方法的基类版本,就可以使用内置的super()函数方法。
创建对象的过程称为实例化,当一个对象被创建后,可通过对象名来访问对象的属性和方法。Python的OOP模型中有两种对象—类对象和实例对象,类对象提供默认行为,实例对象是程序处理的实际对象,各自都有独立的命名空间。
构造函数
Python中类的构造函数是__init__,用来为属性设置初始值,在建立对象时自动执行。
如果用户未设计构造函数,Python将提供一个默认的构造函数,构造函数属于对象,每个对象都有自己的构造函数。要创建一个对象,需要两个必要的步骤:
①要一个原始的或未初始化的对象,②必须对该对象进行初始化
即:首先调用特殊方法__new__()创建该对象,之后调用特殊方法__init__()对其进行初始化。
析构函数
Python中类的析构函数是__del__,用来释放对象占用的资源,在Python收回对象空间之前自动执行。如果用户未设计析构函数,Python将提供默认的析构函数,析构函数属于对象,每个对象都有自己的析构函数。
实例属性和类属性
属性有两种,一种是实例属性,另一种是类属性,实例属性是在构造函数init中定义的,定义时以self为前缀;类属性是在类中方法之外定义的,实例属性属于实例(对象),只能通过对象名访问;类属性属于类,可通过类名访问,类属性还可以在类定义结束之后,在程序中通过类名增加。
实例对象是具体的元素
当调用类对象时,我们得到了实例对象,以下是类的实例的重点概要。
• 像函数那样调用类对象会创建新的实例对象,每次调用时,都会建立并返回新的实例对象
• 每个实例对象继承类的属性并获得了自己的命名空间。
• 在方法内对self属性做赋值运算会产生每个实例自己的属性,对self的属性做赋值运算,
会创建或修改实例内的数据,而不是类的数据
以此方式调用类时会产生实例对象,也就是可读取类属性的命名空间,此时有三个对象:
两个实例和一个类,我们说x是一个Firstclass对象,y也是,这两个实例如果对实例以及类对象内的属性名称进行点号运算,Python会通过继承搜索从类取得变量名。
x,y本身都没有setdata属性,为了寻找这个属性,Python会顺着实例到类的线索查找。这就是Python的继承,继承是在属性点号运算时发生的,而且只与查找连接对象内的变量名有关。
在Firstclass的setdata函数中,传入的值会赋给self.data,在方法中,self会自动引用正在处理的实例,所以赋值语句会把值储存在实例的命名空间,而不是类的命名空间。因为类会产生多个实例,方法必须经过self参数才能获取正在处理的实例。
类的方法
Python中,类有3种方法----实例方法,类方法,静态方法。
实例方法一般由被类所生成的实例所调用,形参列表第一个参数都要定义且最好命名self,形参列表的第一个参数self代表的是实例化的类对象的引用。
静态方法其实就是类中的个普通函数,它并没有默认传递的参数,在创建静态方法的时候,需要用到内置函数staticmethod,要在类中使用静态方法,需在类成员函数前面加上@statiomethod,标记符@以表示下面的成员函数是静态函数,使用静态方法的好处是,不需要定义实例即可使用这个方法,另外,多个实例共享此静态方法。
类方法其实和实例方法类似,不过其第个参数一般是cls(约定俗成),而不是self ,一个类方法就是可以通过类或它的实例来调用的方法,不管你是用类来调用这个方法还是类实例调用这个方法,该方法的第一个参数总是定义该方法的类对象。
如果方法名以两个下划线(__)开头,则表示此方法为私有方法,私有方法和公有方法都属于对象,每个对象都有自己的公有方法和私有方法;公有方法通过对象名调用,私有方法不能通过对象名调用,只能在属于对象的方法中通过self调用,静态方法只能通过类名调用,静态方法中不能访问属于对象的成员,只能访问属于类的成员。
5模块、文件、异常
模块和包
Python 模块是一个包含Python代码的文件,文件的名字就是模块名加上.py 扩展名,使用Python模块,可以提高了代码的可维护性、可重用性,避免了函数名和变量名冲突相同名字的函数和变量可以分别存在于不同模块中。
import 语句给文件a.py提供了由文件b.py所定义的访问权限,通俗来说就是a.py通过import语句载入文件b.py并能够通过对象b获取它的所有的属性。
同时,我们需要了解以下两点:
嵌套 import
本模块导入A模块import A,A中又import B, 模块还可以import其他模块。本模块import A 之后只能访问模块A,不能访问模块B及其他模块,虽然模块B已经加载到内存了,如果访问还是要在本模块中import B。
文件和 I/O
文件的关闭
为什么要关闭文件呢?原因有下面3点:
• 将写缓存同步到磁盘
• 操作系统每个进程打开文件的个数是有限的
• 如果打开文件数到了系统限制,再打开文件就会失败。
最常用的方法就是,调用close()显式地关闭文件。一旦我们关闭了文件,该文件对象依然存在,但是我们无法通过它来读取文件内容了,而且文件对象返回的可打印内容也表明文件已经被关闭了。
异常
在Python中,异常会根据错误自动地被触发,也能由代码触发和捕获,异常由四个相关语句进行处理,分别为:except、else和finally,
什么是异常?
Python 检测到一个错误时,解释器就会指出当前流已无法继续执行下去,这时候就出现了异常,异常是指因为程序出错而在正常控制流以外采取的行为,异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行,异常处理器(try语句)会留下标识,并可执行一些代码,程序前进到某处代码时,产生异常,因而会使Python立即跳到那个标识,而放弃留下该副只之后所调用的任何激活的函数异常分为两个阶段:第一个阶段是引起异常发生的错误;第二个阶段是检测并进行处理的阶段。
当程序出现异常时,Pytbon默认的异常处理行为将启动,停止程序井打印出错误消息但往往这并不是我们想要的,如果不希望默认异常行为,就需要把调用包装在try语句中,自行捕捉异常。