一、函数的概念
函数用于在程序中分离不同的任务,是模块化程序设计的基本构成单位,是对程序逻辑进行结构化或过程化的一种编程方法
函数定义好后,可以反复调用使用,这样就可以避免重复编写代码,而且,功能如果需要修改,只要更改函数定义就可以,维护方便
1.1 使用函数的优点
- 实现结构化程序设计
- 减少程序的复杂度
- 实现代码的复用
- 提高代码质量
- 协作开发
1.2 函数使用要点
声明(定义、创建)函数
函数必须先声明(定义、创建),才能够使用
调用(使用)函数
函数声明定义好后,通过调用语句,使用函数
1.2.1 函数声明的语法
def 函数名(形式参数列表):
函数体语句
return 返回值
说明:
√使用def声明(定义、创建)一个函数
√函数名要符合标识符规则
√ 形式参数列表中可以有0到多个参数,多个参数之间使用逗号分隔,如果没有参数,括号()也不能省略
√使用return 语句返回计算结果,如果不需要返回值,则返回值省略return也可以省略,这时会返回None值
1.2.2 函数调用
运行结果
二、默认值参数关键字参数
2.1默认值参数
在声明函数的时候,预先为参数设置一个默认值,当调用函数时如果某个参数具有默认值,则可以不向函数传递该参数,这时,函数将使用声明函数时为该参数设置的默认值来运行格式:
def 函数名(参数=默认值)
函数体语句
return 返回值
eg:
2.2 关键字参数
在Python中,提供了另外一种传递参数的方法--按照参数名传递值的方法,即提供关键字参数
函数声明
def 函数名(x,y,z)
函数体谱句
关键字参数方式调用函数
函数名(z=30,x=10,y=20)
三、可变长参数及匿名参数
3.1 可边长参数
在声明函数时,形式参数名前面加上一个星号“*”,则表示该参数是一个可变长参数
格式:
def 函数名(参数1,参数2,*参数3,…):
函数体语句
return 返回值在调用该函数时,如果依次序将所有的其他变量都赋值之后剩余的参数将会收集在一个元组中,元组的名称就是这个带星号参数名
3.2 匿名参数
Python提供匿名函数:
lambda 参数列表:表达式
说明:
√lambda用于声明匿名函数
√参数列表:相当于声明函数时的参数列表,多个参数使用逗号分隔√表达式:是函数要返回值的表达式,只允许是一个
√可以赋值给一个变量,以便调用,即:
变量=lambda 参数列表:表达式
四、面向对象的核心概念
面向机器的编程语言
机器语言、汇编语言
特点:程序设计与特定的硬件系统相关
面向过程的编程语言
C、PASCAL、Python
特点:程序设计的核心是编写函数(方法),数据结构和算法是其解题的核心
面向对象的编程语言
Java、C#、Python
特点:程序设计是以求解问题中所涉及的各种对象为主体,力求求解过程符合人们日常的思维习惯--物以“类"聚
面向对象的核心是“对象”,而世间万物都可以称作“对象”,比如:人、桌子、学生动物、汽车…
当我们描述一个“对象”时,一般可以从两个方面描述:
属性(静态)
· 如:人的姓名、年龄、身高、体重、职业.
行为(动态)
·如:人可以上班、学习、吃饭、乘车.
面向对象的编程思想就是把我们要研究的问题中所涉及到的所有“对象"识别出来,然后从其“属性”和“行为”两个方面加以描述
类是一种抽象数据类型,用于描述“对象”,类使用“变量”来描述对象的“属性”,使用“函数”(或方法)来描述对象的“行为’
类是数据(属性)和函数(行为)的集合(函数操作数据)
4.1 定义类
在Python语言中定义类的基本形式为:
class 类名(父类名):
def 方法名1(self,参数列表):
方法体1
def 方法名2(self,参数列表):
方法体2
定义类说明:
class是定义类的关键字
类名要符合标志符规范,且在模块中不能重名
父类名表示该类所继承的父类名称。如果没有继承的父类,则父类名连同两边的圆括号省略
使用缩进关系表示类体
类体中主要包括变量和方法,统称为类的成员,其中变量称为数据成员(也称为实例属性或实例变量),方法称为方法成员
eg:
4.2 构造方法
在类定义中,可以定义一个构造方法,用于类实例化时初始化相关数据
def__init__ (self,形式参数列表):
方法体
说明:
构造方法名称必须为 __init__ (注意:前后分别为两个下划线)
self不能省略
如果构造方法定义时有参数列表,实例化类时必须要提供
构造方法是在类实例化时自动调用,并传入相应参数
构造方法不要有return语句
4.3 类的实例化
eg:
4.4、方法重载 (了解)
什么是方法重载?
答:在一个类中,可以定义多个重名的方法,只要保证这些方法的参数类型或个数以及方法返回值不同即可
在Python中,方法的参数没有声明类型(调用传值时确定参数的类型),参数的数量可以由可变参数来控制。所以Python中不需要重载,定义一个方法即可实现多种调用,从而实现相当于其他程序设计语言中的重载功能
在Python类体中,可以定义多个重名的方法,虽然不会报错但只有最后一个方法有效。
eg:
4.5 继承
- 继承是面向对象编程的特征之一,通过继承,可以实现代码复用
- 例如: 我们可以先编写一个类A,定义好变量和方法,然后再编写一个类B,使其继承类A,这样,在类A中定义的变量和方法,在类B中可以继承下来,不用重新定义直接使用,即在类B中复用类A中的代码
- 被继承的类称为父类(超类或基类),继承得到的类称为子类(派生类)
- 子类继承父类的变量和方法,同时也可以添加新的变量和方法,还可以修改父类的变量或覆盖(重写)父类的方法
定义子类方式1:
class 子类名(父类名1,父类名2...)
def 方法名1 (self,参数列表)
方法体1
def 方法名2(self,参数列表)
方法体2
定义子类方式1说明:
- 适合于父类中没有重新定义构造方法或者即使重写了构造方法,但构造方法除了self以外,没有提供任何参数的情况。
- Python支持多重继承,即一个子类可以继承多个父类
- 子类名后是所有的父类名,使用圆括号括起来,多个父类名使用逗号分隔
- 子类中可以定义自己的方法和变量
定义子类方式2:
class 子类名(父类名1,父类名2..):
def__init__(self,父类参数列表,子类参数列表)
父类名1.__init__ (self,父类1参数列表)
父类名2.__init__ (self,父类2参数列表)
def 方法名1(self,参数列表):
方法体1
def 方法名2(self,参数列表)
方法体2
定义子类方式2说明:
- 如果在父类中,进行了构造方法的定义,并且提供了除self以外的参数,使用此方式
- 子类的构造方法参数列表,必须先提供父类的构造方法参数列表,再提供自己的参数列表
- 子类必须在其构造方法中调用父类的构造方法,并为其提供相应的参数
4.6 方法覆盖
什么是方法覆盖:
- 子类把父类继承的方法重新进行了定义,这时就称为子类覆盖了父类的方法,或者称为子类重写了父类的方法
为什么做方法覆盖:
- 子类继承的父类方法不能满足子类的业务需求
- 保证命名一致性、规范性
五、模块
5.1 模块基本概念
5.1.1 什么是模块
- 模块就是Python源文件,以“.py”为后缀名
- 模块中主要包含函数定义、类的定义或其他语句
- Python源文件名字去掉后面的后缀名(.py)即为模块名
- 模块名称要符合命名规则,切记不要与系统已存在的模块重名
5.1.2 为什么使用模块
- 可以编写大规模的系统程序
- 有利于控制程序的复杂度
- 实现代码重用
- 增强项目的可维护性
5.2 学习模块的核心问题
- 如何创建模块
- 如何测试模块
- 如何导入模块
- 如何使用模块中的功能代码(函数、类、变量等)
5.2.1.如何创建模块
5.1.3.如何测试模块
Python 的执行是从脚本的第一行开始,按顺序执行。然而,在编写具有多个函数和可能被其他脚本引用的模块时,定义一个主执行函数变得非常有用。这就是 if __name__ == '__main__':
发挥作用的地方。
__name__ 是什么?
在 Python 脚本中,__name__ 是一个内置变量。当文件被直接运行时,__name__ 的值会被设为 '__main__'。如果文件是被导入到其他文件中的,__name__ 的值会被设置为文件的名字。利用这一特性,我们可以控制哪些代码块在被导入时执行,哪些代码块在文件作为主程序运行时执行。
使用场景
使用 if __name__ == '__main__': 的好处包括:
• 模块化和重用代码:通过这种方式,您可以在其他程序中重用模块,而不必担心代码会自动执行。
• 测试:这允许你在同一个文件中写测试代码,测试代码只会在该文件作为主程序运行时执行。
5.2.3 如何导入模块
- 想要导入Python源文件(模块)中使用其他模块中的函数、类等代码(模块成员),需要导入模块或导入其中的模块成员
- 通过import语句可以导入模块或导入模块成员,并使用其定义的功能
- 导入方法分为两种:
- 导入整个模块
- 导入模块中的模块成员(函数、类、变量等)
方式1:导入整个模块:
import 模块1,模块名2,...
import 模块名 as 模块别名
说明:
- 使用import导入整个模块,这样就可以使用该模块中的所有模块成员了
- 可以同时导入多个模块,多个模块名用逗号分隔(页可以写多条import语句,一个import只导入一个模块)
- 导入一个模块时,可以使用as关键字给模块起一个别名
- 导入语句一般放在源文件的开始部分
方式2:导入模块中的模块成员(函数、类、变量等):
from 模块名 import 成员名1,成员名2,...
from 模块名 import*
说明:
- 可以同时导入一个模块的多个成员,多个成员名用逗号隔开(也可以写多条from import语句,一条语句只导入一个成员)
- 导入一个模块的所有成员时,使用星号*代表所有成员
5.2.4 如何使用模块中的功能代码(函数、类、变量等)
导入整个模块后,访问模块中的成员:
函数: 模块名.函数名(实际参数列表)
变量: 模块名.变量名
类 : 实例化=模块名.类名(实际参数列表)
实例化名.函数名(实际参数列表)
直接导入模块中的成员后(函数、类、变量),就可以直接使用成员名来访问模块中的成员,即:
函数: 函数名(实际参数列表)
变量: 变量名
类 : 实例化=类名(实际参数列表)
实例化名.函数名(实际参数列表)
六、包
6.1 包的基础概念
什么是包:
Python中的包,本质上(物理层面)就是一个文件夹(或目录)
为什么使用包:
- 便于管理Python源文件(功能模块)便于组织、维护开发项目
- 有利于避免名字冲突
包学习的重点:
- 如何创建包
- 如何导入/使用包中的模块或模块成员
6.2 如何创建包
如何创建包:
- Python中没有提供创建包的语句
- 只要文件夹中包含一个名为"__init__.py“(init的前后均是两条下划线)的特殊文件则Python解释器就会将该文件夹作为包,其中的源文件(.Py)则属于包中的模块
说明:
- "__init___.py可以是空文件,仅用于表示该目录是一个包,也可以包含属于包的代码,当导入包或该包中的模块时,执行__init__.Py
- 包可以嵌套,即一个包中可以包含子包
6.3 如何导入包
模块放在包中进行管理,要导入模块,需要指定模块所在的包(其实就是指定文件所在的路径)
方式1:导入包中整个模块
import 包名,子包名.模块名,包名.子包名.模块名2
import 包名.子包名.模块名 as 模块别名
说明:
在模块名前加上包名层次,之间使用句点"."分隔
对比:没有包时,导入整个模块:
import 模块名1,模块名2,
import 模块名 as 模块别名
方式2:导入包中模块中的模块成员
from 包名.子包名.模块名 import 成员名1,成员名2...
from 包名.子包名.模块名 import*
说明:
- 在模块名前加上包名层次,之间使用句点”“分隔
- 多个成员之间使用逗号分隔
- 要导入模块中的所有成员可以使用星号*
对比:没有包时,导入模块中的模块成员:
from 模块名 import 成员名1,成员名2..
from 模块名 import*
6.4 如何使用包
导入包中模块后,访问模块中的成员:
函数: 包名.子包名.模块名.函数名(实际参数列表)
变量: 包名.子包名.模块名.变量名
类 : 实例化名=包名.子包名.模块名.类名(实际参数列表)
实例化名.函数名(实际参数列表)
这种不方便,使用下面起别名的方式