-对象 Lecture 6 - Objects

官方信息技术老师·23 页·深入(追求细节与边界)·0 次浏览·2 天前
对象模型属性机制可变性

Lecture 6: Objects in Python

看透 Python 对象的身份、可变性与属性查找机制

按 空格/→ 演示下一步

1 / 23 页

全部页面点击任意一页,跳回舞台从这页播放

对象模型属性机制可变性

Lecture 6: Objects in Python

看透 Python 对象的身份、可变性与属性查找机制

1第 1 页 · Lecture 6: Objects in Python

什么是Python对象

上一讲我们走进了 Python 的对象世界。但「对象」到底是什么?想想你从快递柜取包裹的动作——看编号、读面单、查内容,三件事就是答案。

对象的三个属性
身份(id)、类型(type)、值(value),三者共同定义一个对象
一切皆对象
函数、模块、甚至类型本身(type)都是对象
身份 vs 等值
is 比较 id() 是否相同;== 比较值是否相等
可变与不可变
可变对象可改值(list),不可变对象改值即换新(int)
快递包裹对应 →Python 对象

编号对应 id(),面单对应 type(),内容物对应 value;连面单本身也是一张包裹

2第 2 页 · 什么是Python对象

为什么对象如此重要

上一页我们看到,对象把数据和方法捆在一起,像一个独立的小盒子。这看似简单,但为什么这种设计能让 Python 撑起从脚本到百万行系统的复杂度?关键在于它提供了一种统一的组织方式。

一切皆对象
数字、字符串、函数本身也是对象,都遵守同一套访问与操作规则
自然映射现实
实体变实例,特征变属性,动作变方法,代码就是现实世界的模型
可复用与可扩展
类是模板可批量造对象,继承让新类不必重写旧能力
万能遥控器对应 →对象接口

不用知道电视是哪个牌子,按开关键都能开机;调用对象方法不需要懂内部实现

3第 3 页 · 为什么对象如此重要

元组的定义与创建

超市购物清单能划掉、能加东西;但快递面单一旦打印就不能改。元组就是 Python 里这种'定下来就不能动'的序列。

圆括号语法
用 () 把多个值包起来,逗号分隔
单元素要加逗号
(5) 是数字 5,(5,) 才是元组
tuple() 转换
接受列表、字符串等可迭代对象
不可变序列
创建后元素个数和值都不能改
比赛最终排名对应 →元组

一旦公布就定格,选手名次不能改

4第 4 页 · 元组的定义与创建

元组的索引与切片

python

通过一段完整运行代码,看清元组能做什么、不能做什么。

代码高亮加载中…

前几行展示元组和字符串、列表一样可索引、可切片、可拼接;最后一行才是重点——一旦尝试赋值,立即抛 TypeError,这正是 immutable 的字面含义。

5第 5 页 · 元组的索引与切片

元组解包实战

python

从变量交换到函数返回值,元组解包让一行代码顶三行。

代码高亮加载中…

解包要求左右元素数匹配;* 可吸收多余元素;函数返回元组时直接对应多个变量;嵌套结构可逐层拆开,_ 丢弃不关心的值。

6第 6 页 · 元组解包实战

列表的本质

元组一旦创建就无法改动,但现实里大量数据需要随时增删改。列表就是为这种「会变」的需求而生的结构——同样的索引语法,却换来了「原地修改」的自由。

可变本性
创建后内容可改,对象身份不变,只是内容换新
方括号语法
用方括号包裹元素,区别于元组的圆括号
索引语法一致
下标、切片、for 遍历与元组用法完全相同
原地操作
append 等方法直接改自身,不返回新列表
白板对应 →列表

白板可擦写新内容对应列表的原地修改;印好的书对应元组,一经出版就定型

7第 7 页 · 列表的本质

列表的创建与访问

python

演示方括号创建列表与整数下标取值,覆盖负索引与越界两种边界。

代码高亮加载中…

方括号把元素聚成 list 对象;下标从 0 起,负数反向计数,越界抛 IndexError;列表可变——这些行为都源自「list 是对象」。

8第 8 页 · 列表的创建与访问

列表内存模型图解

列表对象本身是一段连续槽位,存放的不是元素本身,而是指向其他对象的引用指针。

图解渲染中…
a1列表本身也是一个对象,有独立 id 和类型a2-a4每个槽位宽度固定为 8 字节指针b1-b3被引用的真实对象,散布在堆内存各处
9第 9 页 · 列表内存模型图解

添加元素操作

添加元素是列表最常用操作,但 append、extend、insert 各有适用场景。

1
append 整体追加
把传入对象作为一个整体,接到列表末尾
2
extend 逐个展开
遍历可迭代对象,元素一个个接到末尾
3
insert 指定位置
在指定下标处插入单个元素,原位置后移
4
选对方法
按追加还是插入、单个还是多个做判断
10第 10 页 · 添加元素操作

删除元素操作

Python 列表删除元素有三种语法,按「知不知道索引」和「要不要返回值」选择。

1
三种方式总览
del / remove / pop 都能删除元素,但触发条件和返回值不同
2
del 按索引删
知道位置时用,可删切片,不返回被删元素
3
remove 按值删
只知道内容时用,删第一个匹配,不存在则报错
4
pop 删且返回
删元素并拿回它,默认删末尾,常用于栈结构
5
选择决策
知索引→del/pop;要返回值→pop;只知值→remove
11第 11 页 · 删除元素操作

列表切片高级操作

python

展示步长、负索引、切片赋值与删除的进阶用法。

代码高亮加载中…

步长决定方向与跳跃;切片赋值长度可变,是原地修改列表的关键武器。

12第 12 页 · 列表切片高级操作

列表常用方法汇总

python

通过真实运行展示列表的查询、排序、反转方法,重点区分原地操作与返回新对象的差异。

代码高亮加载中…

高亮行展示三类操作:index/count 用于查询不修改列表;sorted 返回新列表而 sort/reverse 原地修改;sort(key=...) 通过自定义键实现大小写无关排序。

13第 13 页 · 列表常用方法汇总

函数是一等公民

你已经用过无数次的 len()、print(),它们是函数。换一个角度:函数本身在 Python 里和数字、字符串一样,可以被赋值、被传来传去——这叫'函数是一等公民'。

赋值给变量
把函数名赋给另一变量,两名指向同一函数
作为参数传入
传入的是函数引用,不是调用结果
作为返回值
函数可以返回另一个函数对象
本质是对象
type() 查看类型,和数字、字符串一样
数字 42对应 →函数对象

42 能赋值、传参、能作返回值,函数完全一样

14第 14 页 · 函数是一等公民

函数对象的生命周期

从 def 到 GC,沿箭头看函数对象在内存里的生灭。

图解渲染中…
n3函数对象实体在堆里,名字只是栈上的引用n10引用计数归零时由 CPython 立刻回收
15第 15 页 · 函数对象的生命周期

高阶函数实战

python

用 map/filter/reduce 处理商品数据,展示函数式流水线思维。

代码高亮加载中…

lambda 是匿名单表达式函数;map 变换、filter 筛选、reduce 累积,三者串联就是函数式流水线。

16第 16 页 · 高阶函数实战

字典的核心概念

列表用整数下标找位置,但现实里大量查询是「按名字找东西」,不是「按编号找位置」。字典正是为标签查找而生,核心机制有两条:键值对结构存储数据,哈希表负责按 key 一步定位。

键值对结构
key 唯一且必须可哈希,value 可任意类型,通过 key 直接寻值
哈希函数
把任意类型 key 映射为整数,异类 key 也归一化为同类输出
桶数组存储
哈希值经取模得到桶号,键值对挂载在对应桶中
平均O(1)查询
按 key 再哈希直接落桶,跳过遍历,平均复杂度为常数
快递柜取件码对应 →哈希值定位格子

取件码算出一个格号,直接开柜,不用挨个翻

bucket=hash(k)modsize\text{bucket}=\text{hash}(k)\,\bmod\,\text{size}
17第 17 页 · 字典的核心概念

字典的创建与访问

python

对比 [] 与 get() 两种访问方式,看 KeyError 的陷阱与 get() 的安全默认值。

代码高亮加载中…

花括号 {} 是字典字面量;[] 访问快但缺键会炸,get() 是安全网,能塞默认值兜底。

18第 18 页 · 字典的创建与访问

字典的增删改查

字典日常使用就是查、增、改、删四件事,按工作流串起来讲最省脑。

1
查值
dict[k] 取值,无键抛异常;get(k, default) 可兜底
2
新增键值
dict[新键] = 值;键已存在则自动覆盖,无需先删后加
3
更新键值
语法与新增完全相同:dict[旧键] = 新值,一步到位
4
删除键值
del 报错式删;pop(k, 默认) 安全删;clear() 一键清空
19第 19 页 · 字典的增删改查

字典方法与迭代

python

演示 keys/values/items 三种视图与字典推导式

代码高亮加载中…

keys/values/items 返回的是动态视图;推导式用花括号,可加条件或交换键值。

20第 20 页 · 字典方法与迭代

核心要点回顾

  • 数据固定用元组,顺序可变用列表,按键查找用字典
  • Python 万物皆对象,函数也是对象,可被传递和赋值
  • 可变与不可变是设计接口的真正分水岭
  • 高阶函数的本质是把函数当数据在函数间流转
延伸主题:集合set与去重场景类的定义与实例化深浅拷贝的陷阱
21第 21 页 · 核心要点回顾

自我检测

点击作答

元组、列表、字典、函数这四种对象,下列哪种操作对它们全都合法?

22第 22 页 · 自我检测

课后思考

先独立思考,再对照参考答案展开讨论。

1为什么说Python里一切皆对象?这跟面向对象的“对象”是一回事吗?

参考答案Python的“对象”指有类型、身份、值的内存实体;OOP的“对象”特指类的实例。前者范围更广。

2如果一个函数内部定义了另一个函数并返回它,返回后还能访问外层的局部变量吗?

参考答案能。这就是闭包:内层函数会“捕获”外层作用域的变量,外层返回后这些变量依然存活被引用。

3字典用键查找值像查表;如果键是列表会怎样?换成元组又为什么能行?

参考答案列表可变、不可哈希,作为键会报错;元组不可变、相同内容的元组哈希值一致,因此能作键。

23第 23 页 · 课后思考