零基础学 Python(2023 版)
尹会生
太乙人工智能技术合伙人 & 项目总监
60050 人已学习
新⼈⾸单¥68
课程目录
已完结/共 124 讲
结束语 & 结课测试 (2讲)
零基础学 Python(2023 版)
登录|注册
留言
7
收藏
沉浸
阅读
分享
手机端
回顶部
当前播放: 65|再回首:“类”单元小结
00:00 / 00:00
高清
  • 高清
1.0x
  • 2.0x
  • 1.5x
  • 1.25x
  • 1.0x
  • 0.75x
  • 0.5x
网页全屏
全屏
00:00
付费课程,可试看
课程介绍:这次我们都做了哪些升级?
内容综述:明确学习目的
01|如何配置 Python 开发环境?
02 | 常用 IDE:如何提高开发效率?
03 | 如何站在官方文档的肩膀上自己“造轮子”?
04 | 怎样运行你的第一行代码?
05 | 怎样使用 Gitee 管理你的代码?
06 | 学习编程有问题?去这里找答案!
07|跨越门槛:Python 开发环境总结及实现原理
08 | 修炼基本功:浅析输入输出
09 | 变量:如何让计算机临时存储数据?
10|字符串(上):Python 是如何处理单词的?
11|字符串(下):Python 是如何处理单词的?
12|存储数字应该采用哪种数据类型?
13|何时使用数,何时使用字符串?
14|注释:如何写程序的说明书?
15|小试牛刀:如何制作简单计算器?
16|变量命名规范:如何编写优雅的程序?
17|告别新手村:Python 编程基础知识
18|内置数据类型包括哪几种?
19|列表如何处理同类数据?
20|常见常新:列表的常见操作
21|元组:如何处理一次性数据?
22|常见常新:集合的常见操作
23|字典:如何处理映射类型的数据?
24|常见常新:字典的常见操作(上)
25|常见常新:字典的常见操作(下)
26|小试牛刀:如何利用类型转换实现手机通讯录?(上)
27|小试牛刀:如何利用类型转换实现手机通讯录?(下)
28|常见的内置数据类型都何时使用?
29|避坑指南:内置数据类型的常见错误
30|内置数据类型参考:如何使用官方文档与帮助?
31|再回首:“内置数据类型”单元小结
32|if 语句:数据流程出现分支时,怎样编写程序?
33|match 语句:如何通过 match 关键字来处理程序的分支逻辑?
34|while 循环:需要多次重复执行某段程序时,怎么做?
35|for 循环:如何遍历一个对象里的所有元素?
36|语句嵌套:如何处理多重循环的问题?
37|小试牛刀:如何设计一个飞机大战的程序?
38|避坑指南:判断和循环中的常见错误
39|再回首:“判断循环”单元小结
40|输入:如何接收用户通过键盘输入的数据?
41|格式化输出:如何将执行结果通过屏幕输出?
42|F-strings:如何通过定义好的格式进行输出?
43 | 常见常新:文件的打开
44|文件编码:如何解决不同操作系统的文件乱码问题?
45|常见常新:文件的读写
46|常见常新:文件的关闭
47|小试牛刀:如何使用 Python 合并多个文件?
48|再回首:“输入输出与文件操作”单元小结
49|函数的定义:如何优雅地反复引用同一段代码?
50|函数的参数:怎样实现函数与外部数据通信?
51|函数的参数:当函数操作对象不固定时怎么处理?
52|函数的返回值:如何得到函数的执行结果?
53|小试牛刀:如何利用函数实现电商购物车功能?
54|避坑指南:列表作为参数传递出错了怎么办?
55|高阶函数:函数对象与函数调用的用法区别
56|装饰器:函数嵌套的定义与调用的区别
57|再回首:“函数”单元小结
58|编程思想不同会导致怎样的代码差异?
59|类与实例:如何使用面向对象的思想编写程序?
60|类的继承:如何解决代码重用的问题?
61|类的装饰器:如何改变类方法的功能?
62|小试牛刀:如何开发自动咖啡机?
63|避坑指南:类的常见错误
64|init 方法:如何为对象传递参数?
65|再回首:“类”单元小结
66 | 模块的导入:如何使用其他人编写好的代码功能?
67 | 标准库:Python 默认提供的便捷功能有哪些?
68 | 自定义模块:如何编写一个完整功能?
69 | 第三方模块的使用:如何使用其他人编写的代码?
70 | 小试牛刀:如何使用 Python 为函数求导?
71|再回首:“模块与标准库”单元小结
72|初识异常:异常的产生与分类
73|异常捕获:出现异常时,如何利用程序进行处理?
74|自定义异常捕获:如何定义业务异常?
75|避坑指南:编写捕获异常程序时经常出现的问题
76|再回首:“异常处理”单元小结
77|扩展数据类型:怎样使用更复杂的数据类型?
78|魔术方法:怎样通过类构造自己需要的数据类型?
79|怎样将 Python 和 C++ 结合起来混合编程?
80|怎样将已有算法改造成符合项目的特定算法?
81|设计模式:怎样合理组合多个函数和类?
82|Redis 数据库:怎样使用 NoSQL 数据库?
83|关系型数据库:怎样使用关系型数据库?
84|计算资源充足时,如何通过并行设计提高效率?
85|多进程间如何通信?
86|再回首:“高级数据类型与算法”单元小结
87|理论盘点:数据分析的流程及对应的 Python 库
88|理论盘点:数据采集的方法与 HTTP 协议
89|理论盘点:任务的并行执行原理
90|理论盘点:非规范化数据处理的基础与正则表达式
91|如何获取网页上的数据并存储到文件?
92|小试牛刀:如何将数据进行图形化展示?
93|再回首:“数据分析”单元小结
94|理论盘点:文件类型与对应的 Python 函数库
95|如何批量读取 Excel 文件?
96|如何实现数据的批量格式转换?
97|如何扩展数据类型?
98|再回首:“办公自动化”单元小结
99|理论盘点:Web 客户端与服务端
100|理论盘点:MVC 模型是什么?
101|如何使用Django搭建简单的Web服务器?
102|如何使用Django-admin实现文章上传?
103|如何使用Django实现文章发布?
104|再回首:“Web开发”单元小结
105|理论盘点:人脸识别的一般步骤
106|理论盘点:人脸识别常用的 Python 库有哪些?
107|怎样通过 OpenCV 采集视频信号?
108|如何训练人脸模型?
109|怎样设计人脸识别系统?
110|再回首:“计算机视觉”单元小结
111|聚焦异同:物联网与互联网有啥不一样?
112|理论盘点:基础但不简单的 TCP 协议
113|理论盘点:物模型与模组
114|如何为 ESP32 安装 MicroPython?
115|怎样通过 MQTT 协议构建消息队列?
116|小试牛刀:在 OLED 屏幕和手机远程同时显示室内温度
117|再回首:“物联网”单元小结
118|结束语:人生苦短,我用Pyhon
结课测试|来赴一场满分之约吧!
直播加餐|与AI共同编程,用ChatGPT学Python
直播加餐|用OpenAI API理解Python数据类型
直播加餐|掌握Gradio框架:为 AI Agent 程序定制界面
本节摘要

你好,我是尹会生。

这一章我们学习了面向对象的程序设计思想。面向对象编程思想,是将“对象”当做程序的基本单元,通过操作对象中存储的数据和数据的方法,实现各种开发需求。

使用对象同上一章我们学习过的函数不只语法不同,在编程思路上也有着非常大的不同,这就导致很多人对面向对象编程产生不适应的感觉,我在初学面向对象编程时,也和你一样,体会过“突然不会编程”的感觉。

为了让你更好地掌握面向对象编程,接下来我打算用一个队列的例子,来带你从需求分析、类的定义、方法定义、调用对象的方法四个方面,来巩固一下我们学习的面向对象编程的语法,也从一个小的需求开始,帮你尽快从面向过程的编程习惯,逐渐迁移并掌握面向对象编程的习惯。

需求分析:一个排队的例子

要说排队这件事,我们在现实生活中肯定会经常遇到。它是解决资源竞争的一种机制。即按照时间顺序先来先得。在编程过程中,也会遇到资源竞争,其中一种解决办法就是排队。

计算机世界中的排队,一般都要按照时间顺序先来后到,所以一般队列中就有了进入队列和离开队列的基本操作。那抛开一般操作,我们还可以将队列实现得更复杂一些,比如可以排多个队,可以给排队的程序指定优先级等等。

但是不管队列多复杂,你要用编程实现它的时候,它就是一个独立的概念,因此你就可以将队列当做一个能够先入先出(FIFO)的对象。具有不同特征的队列可以被定义为队列的模板——类。

登录 后留言

全部留言(7)

  • 最新
  • 精选
老方丈[福][福]
老师,后面章节何时更新啊

编辑回复: 每周三更新一章

2022-12-24
你好极客时间
from queue import PriorityQueue class myqueue(object): def __init__(self,que_len): self.que_len=que_len self.myqueue= PriorityQueue() def put(self,pri,item): self.myqueue.put((pri,item)) def get(self,item): if not self.empty(): self.myqueue.get() def print_queue(self): while not self.myqueue.empty(): priority,item=self.myqueue.get() print(priority,item) myQueue = myqueue(1) myQueue.put(3,123) myQueue.put(1,234) myQueue.put(2,456) myQueue.print_queue()
2024-01-23
Geek_631607
class MyQueue: '''定义一个队列''' def __init__(self, maxsize = 10) -> None: self.maxsize = maxsize self.queue = [] def full(self): '''队列最大长度''' return 0 < self.maxsize <= len(self.queue) def empty(self): '''队列长度为 0''' self.queue.clear() pass def put(self, item): '''放入数据''' if not self.full(): self.queue.append(item) def get(self, item): '''取出数据''' if not self.empty(): self.queue.pop() class PriorityQueue(MyQueue): def putTop(self, item, topFlag): if topFlag: return self.queue.insert(0, item) return super().put(item) q = PriorityQueue() q.put('1') q.put('2') q.put('3') q.putTop('0', True) print(q.queue)
2023-12-08
Geek_Mike
from queue import PriorityQueue '''自定义一个支持插入数据优先级功能,即优先级高的数据,插入队列时能够得到更靠前的位置,以便更早得到处理的队列''' class Myqueue: def __init__(self, maxsize=10): self.maxsize = maxsize self.queue = PriorityQueue() # PriorityQueue类构建的数据结构不是列表;让属性 queue 能继承 PriorityQueue 类的方法,并传递给实例; def full(self): return self.queue.qsize() == self.maxsize # 队列满了,返回 True def empty(self): return self.queue.empty() # 队列为空,返回 True def put(self, priority:int, item): if self.full(): print("Queue is full, can't put into any itmes.") else: self.queue.put((priority, item)) # 把要插入队列的元素按照‘优先级,数据’以元祖的格式传递给 put 方法 def get(self): if self.empty(): print('Queue is empty, no items can be fetched.') else: return self.queue.get()[1] # 取出优先级最高的元素后,返回元祖结构(优先级,数据)中的数据 def item_num(self): print(f'Queue can have {self.maxsize - self.queue.qsize()} more items.') myque = Myqueue(3) # print(myque.full()) myque.item_num() myque.put(3, 'apple') myque.put(2, 'pear') myque.put(1, 'banana') # myque.put(1, 'water') # print(myque.full()) myque.item_num() while not myque.empty(): print(myque.get()) # myque.get() myque.item_num()
2023-08-04
GeekNeo
from heapq import heappush, heappop class MyQueue(object): '''定义一个队列''' def __init__(self, maxsize=10) -> None: '''初始化队列长度''' self.maxsize = maxsize self.queue = [] def _qsize(self) -> int: return len(self.queue) def full(self) -> bool: '''队列最大长度''' return 0 < self.maxsize <= self._qsize() def empty(self) -> bool: '''队列长度为0''' return not self._qsize() def put(self, priority: int, item: str) -> list: '''放入队列数据''' if not self.full(): # self.queue.insert(0, item) heappush(self.queue, (priority, item)) def get(self) -> str: '''取出数据''' if not self.empty(): # return self.queue.pop() return heappop(self.queue)[1] myq = MyQueue(3) print(myq.empty()) myq.put(3, 123) myq.put(2, 456) myq.put(1, 789) print(myq.full()) print(myq.queue) print("取出数据为 %s" % (myq.get())) print("取出数据为 %s" % (myq.get())) print("取出数据为 %s" % (myq.get())) print(myq.empty())
2023-03-09
yanyu-xin
import heapq ,copy class MyQueue: '''定义一个队列''' def __init__(self, maxsize=10): '''初始化队列长度''' self.maxsize = maxsize self.queue = [] def full(self): '''队列最大长度''' return 0 < self.maxsize <= len(self.queue) def empty(self): '''队列长度为 0''' return not len(self.queue) def put(self, item): '''放入数据''' if not self.full(): self.queue.insert(0, item) print(self.queue) def get(self): '''取出数据''' if not self.empty(): return self.queue.pop() class MyPriorityQueue(MyQueue): '''按优先级表处理列表''' # 用堆排序处理,用库heapq def __init__(self,maxsize=10): '''初始化输入值队列''' super().__init__(maxsize) self.queue_a = [] self.queue_b = [] def pro_put(self,item): '''放入数据''' if not self.full(): self.queue_a.append(item) self.pro_mer() def pro_mer(self): '''合并两个有序列表''' # 用堆排序合并出来 self.queue = list(heapq.merge(sorted(self.queue_a), sorted(self.queue_b))) self.queue_b = copy.deepcopy(self.queue) self.queue_a = [] myq = MyPriorityQueue(10) myq.pro_put(3423) myq.pro_put(123) myq.pro_put(456) myq.pro_put(789) print(myq.full()) # True print(myq.get()) print(myq.get()) print(myq.get()) print(myq.empty()) # True
2023-02-19
Cy23
参考源码如下 class PriorityQueue(Queue): '''Variant of Queue that retrieves open entries in priority order (lowest first). Entries are typically tuples of the form: (priority number, data). ''' def _init(self, maxsize): self.queue = [] def _qsize(self): return len(self.queue) def _put(self, item): heappush(self.queue, item) def _get(self): return heappop(self.queue) 参考后修改如下: from heapq import heappush, heappop class MyQueue: '''定义一个队列''' def __init__(self, maxsize=10): '''初始化队列长度''' self.maxsize = maxsize self.queue = [] def full(self): '''队列最大长度''' return 0 < self.maxsize <= len(self.queue) def empty(self): '''队列长度为 0''' return not len(self.queue) def put(self,priority, item): '''放入数据''' if not self.full(): heappush(self.queue, (priority, item)) def get(self): '''取出数据''' if not self.empty(): return heappop(self.queue)[1] myq = MyQueue(3) # 优先级越小越先获取 myq.put(3, 123) #优先级3 myq.put(2, 456) #优先级2 myq.put(1, 789) #优先级1 print(myq.full()) # True print("取出数据为%s" % (myq.get())) print("取出数据为%s" % (myq.get())) print("取出数据为%s" % (myq.get())) print(myq.empty()) # True
2023-01-18
收起评论