网站首页 > 基础教程 正文
lambda () 函数与有名称的函数一样, 都是函数类型, 所以8.6.1节 的add () 和sub () 函数可以被lambda () 函数替代。 修改8.6.1节的代 码示例如下:
编辑
搜图
8.8 动动手——使用更多的lambda () 函数
编辑
搜图
参考代码如下:
编辑
搜图
使用lambda () 函数替换f1 () 函数:
编辑
搜图
8.9 练一练
1 通过以下函数sum () 定义代码, 调用语句正确的是 ()。 def sum(*numbers):
total=0.0
for number in numbers: total+=number
return total
A.print(sum(100.0,20.0,30.0))
B.print(sum(30.0,80.0))
C.print(sum(30.0,'80'))
D.print(sum(30.0,80.0,'80'))
2 通过以下函数area () 定义代码, 调用语句正确的是 ()。 def area(width,height):
return width*height
A.area(320.0,480.0)
B.area(width=320.0,height=480.0) C.area(height=480.0,width=320.0) D.area(320.0,'480')
3 填空题: 请在以下代码横线处填写一些代码, 使之获得期望的输 出结果。
x=200
def print_value():
x x=100
print (" 函数中x={0}".format (x) ) print_value()
print ("全局变量x={0}".format (x) ) 输出结果:
函数中x=100
全局变量x=100
4 判断对错: (请在括号内打√或× , √表示正确, ×表示错误)。
1) Python支持函数重载。 ()
2) map () 函数用于对容器中的元素进行变换。 ()
第9章 类与对象
本章详细介绍类和对象, 前面多次提到类, 它到底是什么意思呢?
编辑
搜图
9.1 面向对象
类和对象都是面向对象中的重要概念。 面向对象是一种编程思想, 即按照真实世界的思维方式构建软件系统。
例如, 在真实世界的校园里有学生和老师, 学生有学号、 姓名、 所 在班级等属性 (数据), 还有学习、 提问、 吃饭和走路等动作 (方法) 。 如果我们要开发一个校园管理系统, 那么在构建软件系统时, 也会有 学生和老师等“类”, 张同学、 李同学是学生类的个体, 被称为“对象”,
“对象”也被称为“实例”。
编辑
搜图
9.2 定义类
Python中的数据类型都是类, 我们可以自定义类, 即创建一种新的 数据类型。 Python中类的定义语法格式如右图所示。
定义小汽车 (Car) 类的代码如下:
编辑
搜图
编辑
搜图
小汽车 (Car) 类继承了object类, object类是所有类的根类, 在Pyth on中任何一个类 (除object外) 都直接或间接地继承了object, 直接继承 object时 (object) 部分的代码可以省略。
编辑
搜图
9.3 创建对象
类相当于一个模板, 依据这样的模板来创建对象, 就是类的实例化 , 所以对象也被称为“实例”。
编辑
搜图
编辑
搜图
9.4 类的成员
编辑
搜图
成员变量也被称为数据成员, 保存了类或对象的数据。 例如, 学生 的姓名和学号。
构造方法是一种特殊的函数, 用于初始化类的成员变量。
成员方法是在类中定义的函数。
属性是对类进行封装而提供的特殊方法。
编辑
搜图
编辑
搜图
9.4.1 实例变量
实例变量就是对象个体特有的“数据”, 例如狗狗的名称和年龄等。
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.4.2 构造方法
类中的 init () 方法是一个非常特殊的方法, 用来创建和初始 化实例变量, 这种方法就是“构造方法”。 在定义 init () 方法时,
它的第1个参数应该是self, 之后的参数用来初始化实例变量。 调用构造 方法时不需要传入self参数。
编辑
搜图
构造方法的示例代码如下:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.4.3 实例方法
实例方法与实例变量一样, 都是某个实例 (或对象) 个体特有的方 法。
定义实例方法时, 它的第1个参数也应该是self, 这会将当前实例与 该方法绑定起来, 这也说明该方法属于实例。 在调用方法时不需要传入 self, 类似于构造方法。
下面看一个定义实例方法的示例:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.4.4 类变量
类变量是属于类的变量, 不属于单个对象。
例如, 有一个Account (银行账户) 类, 它有三个成员变量: amoun t (账户金额)、 interest_rate (利率) 和owner (账户名)。 amount和ow ner对于每一个账户都是不同的, 而interest_rate对于所有账户都是相同 的。 amount和owners是实例变量, interest_rate是所有账户实例共享的变 量, 它属于类, 被称为“类变量”。
类变量的示例代码如下:
编辑
搜图
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.4.5 类方法
类方法与类变量类似, 属于类, 不属于个体实例。 在定义类方法时 , 它的第1个参数不是self, 而是类本身。
定义类方法的示例代码如下:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.5 封装性
封装性是面向对象重要的基本特性之一。 封装隐藏了对象的内部细 节, 只保留有限的对外接口, 外部调用者不用关心对象的内部细节, 使 得操作对象变得简单。
例如, 一台计算机内部极其复杂, 有主板、 CPU、 硬盘和内存等 , 而一般人不需要了解它的内部细节。 计算机制造商用机箱把计算机封装 起来, 对外提供了一些接口, 如鼠标、 键盘和显示器等, 使用计算机就 变得非常简单。
编辑
搜图
9.5.1 私有变量
为了防止外部调用者随意存取类的内部数据 (成员变量), 内部数 据 (成员变量) 会被封装为“私有变量”。 外部调用者只能通过方法调用 私有变量。
在默认情况下, Python中的变量是公有的, 可以在类的外部访问它 们。 如果想让它们成为私有变量, 则在变量前加上双下画线 ( ) 即可
。
示例代码如下:
编辑
搜图
编辑
搜图
由于在类的外部不可以访问私有变量, 因此上述代码在运行时会发 生错误, 通过Python指令运行文件, 输出结果。
编辑
搜图
9.5.2 私有方法
私有方法与私有变量的封装是类似的, 在方法前加上双下画线 ( ) 就是私有方法了。 示例代码如下:
编辑
搜图
由于在类的外部不可以访问私有方法, 因此上述代码在运行时会发 生错误, 通过Python指令运行文件, 输出结果。
编辑
搜图
9.5.3 使用属性
为了实现对象的封装, 在一个类中不应该有公有的成员变量, 这些 成员变量应该被设计为私有的, 然后通过公有的set (赋值) 和get (取 值) 方法访问。
使用set和get方法进行封装, 示例代码如下:
编辑
搜图
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
使用属性方式修改上面的示例, 代码如下:
编辑
搜图
编辑
搜图
9.6 继承性
继承性也是面向对象重要的基本特性之一。
在现实世界中继承关系无处不在。 例如猫与动物之间的关系: 猫是 一种特殊动物, 具有动物的全部特征和行为, 即数据和操作。 在面向对 象中动物是一般类, 被称为“父类”; 猫是特殊类, 被称为“子类”。 特殊 类拥有一般类的全部数据和操作, 可称之为子类继承父类。
编辑
搜图
9.6.1 Python中的继承
在Python中声明子类继承父类, 语法很简单, 定义类时在类的后面 使用一对小括号指定它的父类就可以了。
下面是动物类继承图。
编辑
搜图
示例代码如下:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
编辑
搜图
编辑
搜图
编辑
搜图
在Python中, 当子类继承多个父类时, 如果在多个父类中有相同的 成员方法或成员变量, 则子类优先继承左边父类中的成员方法或成员变 量, 从左到右继承级别从高到低。
示例代码如下:
编辑
搜图
编辑
搜图
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.6.3 方法重写
如果子类的方法名与父类的方法名相同, 则在这种情况下, 子类的 方法会重写 (Override) 父类的同名方法。
编辑
搜图
示例代码如下:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.7 多态性
多态性也是面向对象重要的基本特性之一。 “多态”指对象可以表现 出多种形态。
例如, 猫、 狗、 鸭子都属于动物, 它们有“叫”和“动”等行为, 但是 叫的方式不同, 动的方式也不同。
编辑
搜图
9.7.1 继承与多态
在多个子类继承父类, 并重写父类方法后, 这些子类所创建的对象 之间就是多态的。 这些对象采用不同的方式实现父类方法。
示例代码如下:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.7.2 鸭子类型测试与多态
Python的多态性更加灵活, 支持鸭子类型测试。 鸭子类型测试指: 若看到一只鸟走起来像鸭子、 游泳起来像鸭子、 叫起来也像鸭子, 那么 这只鸟可以被称为鸭子。
编辑
搜图
由于支持鸭子类型测试, 所以Python解释器不检查发生多态的对象 是否继承了同一个父类, 只要它们有相同的行为 (方法), 它们之间就 是多态的。
例如, 我们设计一个函数start (), 它接收具有“叫”speak () 方法 的对象, 代码如下:
编辑
搜图
编辑
搜图
我们定义了几个类, 它们都有speak () 方法。 代码如下:
编辑
搜图
start () 函数可以接收所有speak () 方法对象, 代码如下:
编辑
搜图
通过Python指令运行文件, 输出结果。
编辑
搜图
9.8 练一练
1 在下列选项中, 哪些是类的成员。 ()
A.成员变量 B.成员方法 C.属性
D.实例变量
2 判断对错: (请在括号内打√或× , √表示正确, ×表示错误)。
1) 在Python中, 类具有面向对象的基本特性, 即封装性、 继承性 和多态性。 ()
2) __init__ () 方法用来创建和初始化实例变量, 这种方法就是“ 构造方法”。 ()
3) 类方法不需要与实例绑定, 需要与类绑定, 在定义时它的第1个 参数不是self。 ()
4) 实例方法是在类中定义的, 它的第1个参数也应该是self, 这个 过程是将当前实例与该方法绑定起来。 ()
5) 公有成员变量就是在变量前加上两个下画线 (__)。 ()
6) 属性是为了替代get () 方法和set () 方法。 ()
7) 子类继承父类时继承父类中的所有成员变量和方法。 ()
8) Python中的继承是单继承。 ()
3 请介绍什么是“鸭子类型”?
第10章 异常处理
为增强程序的健壮性, 我们也需要考虑异常处理方面的内容。 例如 , 在读取文件时需要考虑文件不存在、 文件格式不正确等异常情况。 这 就是本章要介绍的异常处理。
编辑
搜图
10.1 第一个异常——除零异常
在数学中, 任何整数都不能除以0, 如果在计算机程序中将整数除 以0, 则会引发异常。
示例代码如下:
通过Python指令运行文件, 输出结果。
10.2 捕获异常
我们不能防止用户输入0, 但在出现异常后我们能捕获并处理异常 , 不至于让程序发生终止并退出。 亡羊补牢, 为时未晚。
10.2.1 try-except语句
异常捕获是通过try-except语句实现的, 基本的try-except语句的语法 如下。
在try代码块中包含在执行过程中可能引发异常的语句, 如果没有发 生异常, 则跳到except代码块执行, 这就是异常捕获。
try-except语句的执行流程如下。
示例代码如下:
通过Python指令运行文件, 输出结果。
从运行的结果可以看出, 在输入数字0后, 异常发生, 跳到except代 码块执行。
将示例代码修改如下:
通过Python指令运行文件, 输出结果。
10.2.2 多个except代码块
多条语句可能会引发多种不同的异常, 对每一种异常都会采用不同 的处理方式。 针对这种情况, 我们可以在一个try后面跟多个except代码 块, 语法如下:
示例代码如下:
通过Python指令运行文件, 输出结果。
10.2.3 多重异常捕获
示例代码如下:
通过Python指令运行文件, 输出结果。
10.2.4 try-except语句嵌套
try-except语句还可以嵌套, 修改10.2.2节的示例代码如下:
通过Python指令运行文件, 输出结果。
10.3 使用finally代码块释放资源
有时在try-except语句中会占用一些资源, 例如打开的文件、 网络连 接、 打开的数据库及数据结果集等都会占用计算机资源, 需要程序员释 放这些资源。 为了确保这些资源能够被释放, 可以使用finally代码块。
在try-except语句后面还可以跟一个finally代码块, 语法如下。
无论是try代码块正常结束还是except代码块异常结束, 都会执行fin ally代码块。
使用finally代码块的示例代码如下:
通过Python指令运行文件, 输出结果。
10.4 自定义异常类
实现自定义异常类的示例代码如下:
10.5 动动手——手动引发异常
示例代码如下:
通过Python指令运行文件, 输出结果。
10.6 练一练
1 请列举一些常见的异常。
2 手动引发异常的语句有哪些? () A.throw
B.raise C.try
D.except
3 判断对错: (请在括号内打√或× , √表示正确, ×表示错误)。
1) 每个try代码块都可以伴随一个或多个except代码块, 用于处理tr y代码块中所有可能引发的异常。 ()
2) 为了确保这些资源被释放, 可以使用finally代码块。 ()
3) 实现自定义异常类时, 需要继承Exception类或其子类。 ()
4) 为了提供程序的健壮性, 我们应该对所有类型异常都进行捕获 。 ()
5) 一个整数除以0时会引发ValueError异常。 ()
第11章 常用的内置模块
在真正做项目时, 我们会使用别人已经开发好的模块, 这样就不必 从零开发项目了, 还可以加快开发速度。 这些模块可能是Python官方提 供的, 也可能是第三方开发的。 Python官方提供的模块, 就叫作“内置 模块”。
11.1 数学计算模块——math
在math模块中包含数学运算相关的函数等, 例如指数、 对数、 平方 根和三角函数等。
本节介绍math模块中的一些常用函数, 如下表所示。
我们在Python Shell中运行代码, 看看运行结果怎样。
11.2 日期时间模块——datetime
Python官方提供的日期和时间模块主要是datetime模块。 在datetime 模块中提供了右侧几个类。
datetime: 包含时间和日期。
date: 只包含日期。 time: 只包含时间。
timedelta: 计算时间跨度。 tzinfo: 时区信息。
11.2.1 datetime类
datetime类表示日期和时间等信息, 我们可以使用如下构造方法创 建datetime对象:
对这些参数的说明如下表所示。
我们在Python Shell中运行代码, 看看运行结果怎样。
datetime类的常用方法如下。
datetime.today (): 返回当前的本地日期和时间。
datetime.now (tz=None): 返回指定时区的当前日期和时间, 参数t z用于设置时区, 如果参数tz为None或省略, 则等同于today ()。
datetime.fromtimestamp (timestamp, tz=None): 返回与UNIX时间 戳对应的本地日期和时间。 UNIX时间戳是从1970年1月1日00: 00: 00 开始到现在为止的总秒数。 我们在Python Shell中运行代码, 看看运行结 果怎样。
11.2.2 date类
date类表示日期信息, 我们可以使用如下构造方法创建date对象:
这些参数的含义和取值范围与datetime类一样, 这里不再赘述。
date类的常用方法如下。
date.today (): 返回当前的本地日期。
date.fromtimestamp (timestamp): 返回与UNIX时间戳对应的本地 日期。
我们在Python Shell中运行代码, 看看运行结果怎样。
11.2.3 time类
time类表示一天中的时间信息, 我们可以使用如下构造方法创建tim e对象:
这些参数的含义和取值范围与datetime类一样, 这里不再赘述。 我们在Python Shell中运行代码, 看看运行结果怎样。
11.2.4 计算时间跨度类——timedelta
其中的所有参数都可以为整数或浮点数, 也可以为正数或负数, 如 右表所示。
我们在Python Shell中运行代码, 看看运行结果怎样。
timedelta可以表示正数或负数时间的间隔, 如下代码是等效的。
- 上一篇: R数据分析:map()函数的升级版map2()和pmap()介绍
- 下一篇: Python高阶函数
猜你喜欢
- 2024-12-03 这3个高级Python函数,你还不知道?
- 2024-12-03 读一读我——无废话Python(三)条件、循环、函数、表达式
- 2024-12-03 Python语法基础(9)函数
- 2024-12-03 python程序员进阶,必学的函数式编程
- 2024-12-03 10条很棒的Python一行代码
- 2024-12-03 Python高阶函数
- 2024-12-03 R数据分析:map()函数的升级版map2()和pmap()介绍
- 2024-12-03 在Python中, map() 函数是一个内置函数
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)